summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2008-05-05 21:55:36 +1000
committerNeil Brown <neilb@suse.de>2008-05-05 21:55:36 +1000
commit63152c1b330f75842644c82d925fa8dcd37fe233 (patch)
tree67a29eefae0b8b7a76cfb11e286eec1b7877efea
parent5e747af24abc021073d979925628fec28052a731 (diff)
downloadmdadm-63152c1b330f75842644c82d925fa8dcd37fe233.tar.gz
mdadm-63152c1b330f75842644c82d925fa8dcd37fe233.tar.xz
mdadm-63152c1b330f75842644c82d925fa8dcd37fe233.zip
Unify code into find_free_devnum.
Two places have code to find a free md device number. Make this a subroutine.
-rw-r--r--Incremental.c15
-rw-r--r--mdadm.h3
-rw-r--r--mdopen.c36
-rw-r--r--util.c37
4 files changed, 50 insertions, 41 deletions
diff --git a/Incremental.c b/Incremental.c
index 4c6a2a7..b54c4fc 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -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,
diff --git a/mdadm.h b/mdadm.h
index 2a5e1c8..2f62c41 100644
--- a/mdadm.h
+++ b/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);
diff --git a/mdopen.c b/mdopen.c
index 7f6a2ea..fe98370 100644
--- a/mdopen.c
+++ b/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
diff --git a/util.c b/util.c
index dbe4640..514b713 100644
--- a/util.c
+++ b/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;