summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-06-14 00:15:04 +0000
committerNeil Brown <neilb@suse.de>2005-06-14 00:15:04 +0000
commit331d4d2a33e5213ed3e149b68bf38b2dc8d83494 (patch)
tree16116cfec6fbc9a4aa93aaea8bfa8808cc18f835
parente0869bd203f2a5a78c2e8a04fca6600568b1e973 (diff)
downloadmdadm-331d4d2a33e5213ed3e149b68bf38b2dc8d83494.tar.gz
mdadm-331d4d2a33e5213ed3e149b68bf38b2dc8d83494.tar.xz
mdadm-331d4d2a33e5213ed3e149b68bf38b2dc8d83494.zip
Add device files created with --auto to list of known device files.
Description... Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
-rw-r--r--ChangeLog3
-rw-r--r--mdadm.h13
-rw-r--r--mdopen.c4
-rw-r--r--util.c23
4 files changed, 33 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index fbde4ec..42d7069 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -22,6 +22,9 @@ Changes Prior to 1.12.0 release
stable aspect of the array
- Allow --force with --grow so '-Gfn1' works (on raid1)
- Make --examine --brief report spares= properly.
+ - When device files are made with "--assemble --auto",
+ add them to the list of known device name, so that
+ assembling stacked devices has a better chance of working.
Changes Prior to 1.11.0 release
- Fix embarassing bug which causes --add to always fail.
diff --git a/mdadm.h b/mdadm.h
index 8542f57..d8a36a4 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -154,6 +154,19 @@ extern mapping_t r5layout[], pers[], modes[], faultylayout[];
extern char *map_dev(int major, int minor);
+#ifdef UCLIBC
+ struct FTW {};
+# define FTW_PHYS 1
+#else
+# define __USE_XOPEN_EXTENDED
+# include <ftw.h>
+# ifdef __dietlibc__
+# define FTW_PHYS 1
+# endif
+#endif
+
+extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
+
extern int Manage_ro(char *devname, int fd, int readonly);
extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
diff --git a/mdopen.c b/mdopen.c
index 721d74a..9309fbd 100644
--- a/mdopen.c
+++ b/mdopen.c
@@ -66,6 +66,8 @@ void make_parts(char *dev, int cnt)
mknod(name, S_IFBLK | 0600, makedev(major, minor+i));
chown(name, stb2.st_uid, stb2.st_gid);
chmod(name, stb2.st_mode & 07777);
+ stat(name, &stb2);
+ add_dev(name, &stb2, 0, NULL);
}
}
@@ -205,6 +207,8 @@ int open_mddev(char *dev, int autof)
chown(dev, stb.st_uid, stb.st_gid);
chmod(dev, stb.st_mode & 07777);
}
+ stat(dev, &stb);
+ add_dev(dev, &stb, 0, NULL);
make_parts(dev,autof);
}
}
diff --git a/util.c b/util.c
index a7dc7c7..e5b7256 100644
--- a/util.c
+++ b/util.c
@@ -443,6 +443,9 @@ struct devmap {
int devlist_ready = 0;
#ifdef UCLIBC
+int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
+{
+}
char *map_dev(int major, int minor)
{
#if 0
@@ -452,15 +455,19 @@ char *map_dev(int major, int minor)
return NULL;
}
#else
-#define __USE_XOPEN_EXTENDED
-#include <ftw.h>
+#ifdef __dietlibc__
+int add_dev_1(const char *name, const struct stat *stb, int flag)
+{
+ return add_dev(name, stb, flag, NULL);
+}
+int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int flag, struct FTW *s), int nopenfd, int flags)
+{
+ ftw(path, add_dev_1, nopenfd);
+}
+#endif
-#ifndef __dietlibc__
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
-#else
-int add_dev(const char *name, const struct stat *stb, int flag)
-#endif
{
if ((stb->st_mode&S_IFMT)== S_IFBLK) {
char *n = strdup(name);
@@ -488,11 +495,7 @@ char *map_dev(int major, int minor)
struct devmap *p;
char *std = NULL, *nonstd=NULL;
if (!devlist_ready) {
-#ifndef __dietlibc__
nftw("/dev", add_dev, 10, FTW_PHYS);
-#else
- ftw("/dev", add_dev, 10);
-#endif
devlist_ready=1;
}