Unify code into find_free_devnum.
Two places have code to find a free md device number. Make this a subroutine.
This commit is contained in:
parent
5e747af24a
commit
63152c1b33
|
@ -246,20 +246,15 @@ int Incremental(char *devname, int verbose, int runstop,
|
|||
|
||||
if (devnum < 0) {
|
||||
/* Haven't found anything yet, choose something free */
|
||||
/* There is similar code in mdopen.c - should unify */
|
||||
for (devnum = 127 ; devnum != 128 ;
|
||||
devnum = devnum ? devnum-1 : (1<<22)-1) {
|
||||
if (mddev_busy(use_partitions ?
|
||||
(-1-devnum) : devnum))
|
||||
break;
|
||||
}
|
||||
if (devnum == 128) {
|
||||
devnum = find_free_devnum(use_partitions);
|
||||
|
||||
if (devnum == NoMdDev) {
|
||||
fprintf(stderr, Name
|
||||
": No spare md devices!!\n");
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
devnum = use_partitions ? (-1-devnum) : devnum;
|
||||
} else
|
||||
devnum = use_partitions ? (-1-devnum) : devnum;
|
||||
}
|
||||
mdfd = open_mddev_devnum(match ? match->devname : NULL,
|
||||
devnum,
|
||||
|
|
3
mdadm.h
3
mdadm.h
|
@ -513,6 +513,9 @@ extern void remove_partitions(int fd);
|
|||
extern char *human_size(long long bytes);
|
||||
char *human_size_brief(long long bytes);
|
||||
|
||||
#define NoMdDev (1<<23)
|
||||
extern int find_free_devnum(int use_partitions);
|
||||
|
||||
extern void put_md_name(char *name);
|
||||
extern char *get_md_name(int dev);
|
||||
|
||||
|
|
36
mdopen.c
36
mdopen.c
|
@ -113,7 +113,6 @@ int open_mddev(char *dev, int autof)
|
|||
int major_num = MD_MAJOR;
|
||||
int minor_num = 0;
|
||||
int must_remove = 0;
|
||||
struct mdstat_ent *mdlist;
|
||||
int num;
|
||||
struct createinfo *ci = conf_get_create_info();
|
||||
int parts;
|
||||
|
@ -197,37 +196,12 @@ int open_mddev(char *dev, int autof)
|
|||
*/
|
||||
if (num < 0) {
|
||||
/* need to pick an unused number */
|
||||
mdlist = mdstat_read(0, 0);
|
||||
/* Choose a large number. Start from 127 and search down,
|
||||
* but if nothing is found, start really big
|
||||
*/
|
||||
for (num = 127 ; num != 128 ; num = num ? num-1 : (1<<22)-1) {
|
||||
struct mdstat_ent *me;
|
||||
int devnum = num;
|
||||
if (major_num != MD_MAJOR)
|
||||
devnum = -1-num;
|
||||
int num = find_free_devnum(major_num != MD_MAJOR);
|
||||
|
||||
for (me=mdlist; me; me=me->next)
|
||||
if (me->devnum == devnum)
|
||||
break;
|
||||
if (!me) {
|
||||
/* doesn't exist in mdstat.
|
||||
* make sure it is new to /dev too
|
||||
*/
|
||||
char *dn;
|
||||
if (major_num != MD_MAJOR)
|
||||
minor_num = num << MdpMinorShift;
|
||||
else
|
||||
minor_num = num;
|
||||
dn = map_dev(major_num,minor_num, 0);
|
||||
if (dn==NULL || is_standard(dn, NULL)) {
|
||||
/* this number only used by a 'standard' name,
|
||||
* so it is safe to use
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (major_num == MD_MAJOR)
|
||||
minor_num = num;
|
||||
else
|
||||
minor_num = (-1-num) << MdpMinorShift;
|
||||
} else if (major_num == MD_MAJOR)
|
||||
minor_num = num;
|
||||
else
|
||||
|
|
37
util.c
37
util.c
|
@ -862,6 +862,43 @@ void get_one_disk(int mdfd, mdu_array_info_t *ainf, mdu_disk_info_t *disk)
|
|||
if (ioctl(mdfd, GET_DISK_INFO, disk) == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
static int dev2major(int d)
|
||||
{
|
||||
if (d >= 0)
|
||||
return MD_MAJOR;
|
||||
else
|
||||
return get_mdp_major();
|
||||
}
|
||||
|
||||
static int dev2minor(int d)
|
||||
{
|
||||
if (d >= 0)
|
||||
return d;
|
||||
return (-1-d) << MdpMinorShift;
|
||||
}
|
||||
|
||||
int find_free_devnum(int use_partitions)
|
||||
{
|
||||
int devnum;
|
||||
for (devnum = 127; devnum != 128;
|
||||
devnum = devnum ? devnum-1 : (1<<22)-1) {
|
||||
char *dn;
|
||||
if (mddev_busy(use_partitions ? (-1-devnum) : devnum))
|
||||
continue;
|
||||
/* make sure it is new to /dev too, at least as a
|
||||
* non-standard */
|
||||
dn = map_dev(dev2major(devnum), dev2minor(devnum), 0);
|
||||
if (dn && ! is_standard(dn, NULL))
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (devnum == 128)
|
||||
return NoMdDev;
|
||||
return use_partitions ? (-1-devnum) : devnum;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __TINYC__
|
||||
/* tinyc doesn't optimize this check in ioctl.h out ... */
|
||||
unsigned int __invalid_size_argument_for_IOC = 0;
|
||||
|
|
Loading…
Reference in New Issue