X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=mdopen.c;h=0b6951d2d4dfc4a2bd7b9a67c54d8b7d83463e2a;hp=9f3dfb8465ec31a10b72e8816ea7c93ef7b81321;hb=8382f19bdcc6d2d1de92154e11129acdcaab10fa;hpb=350f29f90d1f6bb3ddfafea368327911f9e8b27c diff --git a/mdopen.c b/mdopen.c index 9f3dfb84..0b6951d2 100644 --- a/mdopen.c +++ b/mdopen.c @@ -292,3 +292,51 @@ int open_mddev(char *dev, int autof) return mdfd; } + +int open_mddev_devnum(char *devname, int devnum, char *name, char *chosen_name) +{ + /* Open the md device with number 'devnum', possibly using 'devname', + * possibly constructing a name with 'name', but in any case, copying + * the name into 'chosen_name' + */ + int major, minor; + struct stat stb; + + if (devname) + strcpy(chosen_name, devname); + else if (name && strchr(name,'/') == NULL) { + char *n = strchr(name, ':'); + if (n) n++; else n = name; + if (isdigit(*n) && devnum < 0) + sprintf(chosen_name, "/dev/md/d%s", n); + else + sprintf(chosen_name, "/dev/md/%s", n); + } else { + if (devnum >= 0) + sprintf(chosen_name, "/dev/md%d", devnum); + else + sprintf(chosen_name, "/dev/md/d%d", -1-devnum); + } + if (devnum >= 0) { + major = MD_MAJOR; + minor = devnum; + } else { + major = get_mdp_major(); + minor = (-1-devnum) << 6; + } + if (stat(chosen_name, &stb) == 0) { + /* It already exists. Check it is right. */ + if ( ! S_ISBLK(stb.st_mode) || + stb.st_rdev != makedev(major, minor)) { + errno = EEXIST; + return -1; + } + } else { + if (mknod(chosen_name, S_IFBLK | 0600, + makedev(major, minor)) != 0) { + return -1; + } + /* FIXME chown/chmod ?? */ + } + return open(chosen_name, O_RDWR); +}