summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2006-06-26 15:10:48 +1000
committerNeil Brown <neilb@suse.de>2006-06-26 15:10:48 +1000
commit45e878bba6b490bf204db824be71f070689c8737 (patch)
tree195397cfc3d4529edb80412cc7b1d506a8d3f529
parent08110d41bc376e0a5724ab54b72a8793d03a79c0 (diff)
downloadmdadm-45e878bba6b490bf204db824be71f070689c8737.tar.gz
mdadm-45e878bba6b490bf204db824be71f070689c8737.tar.xz
mdadm-45e878bba6b490bf204db824be71f070689c8737.zip
Improve ftw handling.
If not 'ftw' is available, still allow openning of devices by dev number. More recent version of uclibc support nftw, so add support to check for that.
-rw-r--r--ChangeLog2
-rw-r--r--mdadm.h26
-rw-r--r--util.c50
3 files changed, 45 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index 75e53bb..3ff36ce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@ Changes Prior to this release
information in superblocks.
- Don't claim newly added spares are InSync!! (don't know why that
code was ever in there)
+ - Work better when no 'ftw' is available, and check to see
+ if current uclibc provides ftw.
Changes Prior to 2.5.1 release
- Various fixes for gcc warnings
diff --git a/mdadm.h b/mdadm.h
index 9113560..6afdf86 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -343,16 +343,32 @@ extern struct supertype *guess_super(int fd);
struct stat64;
#endif
+#define HAVE_NFTW we assume
+#define HAVE_FTW
+
#ifdef UCLIBC
- struct FTW {};
+# include <features.h>
+# ifndef __UCLIBC_HAS_FTW__
+# undef HAVE_FTW
+# undef HAVE_NFTW
+# endif
+#endif
+
+#ifdef __dietlibc__
+# undef HAVE_NFTW
+#endif
+
+#ifndef HAVE_NFTW
# define FTW_PHYS 1
-#else
-# include <ftw.h>
-# ifdef __dietlibc__
-# define FTW_PHYS 1
+# ifndef HAVE_FTW
+ struct FTW {};
# endif
#endif
+#ifdef HAVE_FTW
+# include <ftw.h>
+#endif
+
extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
diff --git a/util.c b/util.c
index 2cb6dd3..08319cb 100644
--- a/util.c
+++ b/util.c
@@ -354,32 +354,6 @@ struct devmap {
} *devlist = NULL;
int devlist_ready = 0;
-#ifdef UCLIBC
-int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
-{
- return 0;
-}
-char *map_dev(int major, int minor, int create)
-{
-#if 0
- fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
- major, minor);
-#endif
- return NULL;
-}
-#else
-
-#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)
-{
- return ftw(path, add_dev_1, nopenfd);
-}
-#endif
-
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
{
struct stat st;
@@ -404,6 +378,28 @@ int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
return 0;
}
+#ifndef HAVE_NFTW
+#ifdef HAVE_FTW
+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)
+{
+ return ftw(path, add_dev_1, nopenfd);
+}
+#else
+int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
+{
+ return 0;
+}
+int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int flag, struct FTW *s), int nopenfd, int flags)
+{
+ return 0;
+}
+#endif /* HAVE_FTW */
+#endif /* HAVE_NFTW */
+
/*
* Find a block device with the right major/minor number.
* If we find multiple names, choose the shortest.
@@ -464,8 +460,6 @@ char *map_dev(int major, int minor, int create)
return nonstd ? nonstd : std;
}
-#endif
-
unsigned long calc_csum(void *super, int bytes)
{
unsigned long long newcsum = 0;