summaryrefslogtreecommitdiff
path: root/mdopen.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-08-11 18:00:00 +1000
committerNeil Brown <neilb@suse.de>2006-08-11 18:00:00 +1000
commit0a6e1c6743122c3fb060ced194ce5f08690b31e6 (patch)
tree6bd6afd866556d8d0cd01a2b6eb103e350f0ba48 /mdopen.c
parentd1e80164a278b1ad5a56be7abe98a5a3a40e7629 (diff)
Create symlinks from /dev into /dev/md
When (auto)creating devices in /dev/md/, create an appropriate symlink from /dev to avoid confusion.
Diffstat (limited to 'mdopen.c')
-rw-r--r--mdopen.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/mdopen.c b/mdopen.c
index 3004d4ab..488956cf 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -31,6 +31,23 @@
#include "md_p.h"
#include <ctype.h>
+
+void make_dev_symlink(char *dev)
+{
+ char *new = strdup(dev);
+
+ if (!new) return;
+ /* /dev/md/0 -> /dev/md0
+ * /dev/md/d0 -> /dev/md_d0
+ */
+ if (isdigit(new[8]))
+ strcpy(new+7, new+8);
+ else
+ new[7] = '_';
+ symlink(dev+5, new);
+}
+
+
void make_parts(char *dev, int cnt)
{
/* make 'cnt' partition devices for 'dev'
@@ -71,11 +88,14 @@ void make_parts(char *dev, int cnt)
perror("chown");
if (chmod(name, stb2.st_mode & 07777))
perror("chmod");
+ if (strncmp(name, "/dev/md/", 8) == 0)
+ make_dev_symlink(name);
stat(name, &stb2);
add_dev(name, &stb2, 0, NULL);
}
}
+
/*
* Open a given md device, and check that it really is one.
* If 'autof' is given, then we need to create, or recreate, the md device.
@@ -236,6 +256,12 @@ int open_mddev(char *dev, int autof)
if (must_remove)
unlink(dev);
+ if (strncmp(dev, "/dev/md/", 8) == 0) {
+ if (mkdir("/dev/md",0700)==0) {
+ chown("/dev/md", ci->uid, ci->gid);
+ chmod("/dev/md", ci->mode| ((ci->mode>>2) & 0111));
+ }
+ }
if (mknod(dev, S_IFBLK|0600, makedev(major, minor))!= 0) {
fprintf(stderr, Name ": failed to create %s\n", dev);
return -1;
@@ -253,6 +279,8 @@ int open_mddev(char *dev, int autof)
}
stat(dev, &stb);
add_dev(dev, &stb, 0, NULL);
+ if (strncmp(dev, "/dev/md/", 8) == 0)
+ make_dev_symlink(dev);
if (major != MD_MAJOR)
make_parts(dev,parts);
}