summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-11-04 20:50:39 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 20:50:39 +1100
commit11fb4c054f7e440be699be5db683e891e3eaf3a5 (patch)
tree2e6b32b3ab26e119d3691b62944366adeefb7ce0
parenta4bc1720ff51ed81ef3cd088f362d3a8a80bd1bc (diff)
downloadmdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.tar.gz
mdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.tar.xz
mdadm-11fb4c054f7e440be699be5db683e891e3eaf3a5.zip
mdopen: fix up name parsing.
I think this is closer to what I want. Fewer surprises anyway.
-rw-r--r--mdopen.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/mdopen.c b/mdopen.c
index ae3620a..b08c49f 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -180,25 +180,40 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
use_mdp = 0;
else
use_mdp = 1;
+ /* recreate name: /dev/md/0 or /dev/md/d0 */
+ sprintf(cname, "%s%d", use_mdp?"d":"", num);
} else
strcpy(cname, dev);
- /* 'cname' must not contain a slash, may not start or end
- * with a digit, and may only be empty if num is present.
+ /* 'cname' must not contain a slash, and may not be
+ * empty.
*/
- if (strchr(cname, '/') != NULL ||
- isdigit(cname[0]) ||
- (cname[0] && isdigit(cname[strlen(cname)]))
- ) {
+ if (strchr(cname, '/') != NULL) {
fprintf(stderr, Name ": %s is an invalid name "
"for an md device.\n", dev);
return -1;
}
- if (cname[0] == 0 && num < 0) {
+ if (cname[0] == 0) {
fprintf(stderr, Name ": %s is an invalid name "
"for an md device (empty!).", dev);
return -1;
}
+ if (num < 0) {
+ /* If cname is 'N' or 'dN', we get dev number
+ * from there.
+ */
+ char *sp = cname;
+ char *ep;
+ if (cname[0] == 'd')
+ sp++;
+ num = strtoul(sp, &ep, 10);
+ if (ep == sp || *ep || num < 0)
+ num = -1;
+ else if (cname[0] == 'd')
+ use_mdp = 1;
+ else
+ use_mdp = 0;
+ }
}
/* Now determine device number */
@@ -271,8 +286,8 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
strcpy(chosen, devname);
/* We have a device number and name.
- * If we can detect udev, just open the device and we
- * are done.
+ * If we cannot detect udev, we need to make
+ * devices and links ourselves.
*/
if (stat("/dev/.udev", &stb) != 0 ||
check_env("MDADM_NO_UDEV")) {