diff options
author | Neil Brown <neilb@suse.de> | 2005-12-05 05:52:50 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-12-05 05:52:50 +0000 |
commit | 8b0dabea0762e2cd786c1539845823ecd914657a (patch) | |
tree | 0a6b3a8c089910f963fa180c47996343fdef43e9 /util.c | |
parent | d9d4e4698f11b937c42f1c983aca57fd50038a73 (diff) | |
download | mdadm-8b0dabea0762e2cd786c1539845823ecd914657a.tar.gz mdadm-8b0dabea0762e2cd786c1539845823ecd914657a.tar.xz mdadm-8b0dabea0762e2cd786c1539845823ecd914657a.zip |
Allow scanning of devices listed in /proc/partitions independant of /dev
If a device found in /proc/partitions isn't listed in /dev, then
mknod a temporary name and open that.
Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -589,7 +589,28 @@ void put_md_name(char *name) unlink(name); } - +int dev_open(char *dev, int flags) +{ + /* like 'open', but if 'dev' matches %d:%d, create a temp + * block device and open that + */ + char *e; + int fd = -1; + char devname[32]; + int major = strtoul(dev, &e, 0); + int minor; + if (e > dev && *e == ':' && e[1] && + (minor = strtoul(e+1, &e, 0)) >= 0 && + *e == 0) { + snprintf(devname, sizeof(devname), "/dev/.tmp.md.%d:%d", major, minor); + if (mknod(devname, S_IFBLK|0600, makedev(major, minor))==0) { + fd = open(devname, flags); + unlink(devname); + } + } else + fd = open(dev, flags); + return fd; +} struct superswitch *superlist[] = { &super0, &super1, NULL }; |