From 45e878bba6b490bf204db824be71f070689c8737 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Mon, 26 Jun 2006 15:10:48 +1000 Subject: [PATCH] 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. --- ChangeLog | 2 ++ mdadm.h | 26 +++++++++++++++++++++----- util.c | 50 ++++++++++++++++++++++---------------------------- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75e53bbb..3ff36ce8 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 9113560a..6afdf863 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 +# 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 -# ifdef __dietlibc__ -# define FTW_PHYS 1 +# ifndef HAVE_FTW + struct FTW {}; # endif #endif +#ifdef HAVE_FTW +# include +#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 2cb6dd31..08319cb6 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; -- 2.39.2