From 0a6e1c6743122c3fb060ced194ce5f08690b31e6 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Fri, 11 Aug 2006 18:00:00 +1000 Subject: [PATCH] Create symlinks from /dev into /dev/md When (auto)creating devices in /dev/md/, create an appropriate symlink from /dev to avoid confusion. --- mdopen.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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 + +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); } -- 2.39.2