summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-12-05 05:52:50 +0000
committerNeil Brown <neilb@suse.de>2005-12-05 05:52:50 +0000
commit8b0dabea0762e2cd786c1539845823ecd914657a (patch)
tree0a6b3a8c089910f963fa180c47996343fdef43e9 /util.c
parentd9d4e4698f11b937c42f1c983aca57fd50038a73 (diff)
downloadmdadm-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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/util.c b/util.c
index e702b8d..9204d53 100644
--- a/util.c
+++ b/util.c
@@ -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 };