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.
This commit is contained in:
Neil Brown 2006-06-26 15:10:48 +10:00
parent 08110d41bc
commit 45e878bba6
3 changed files with 46 additions and 34 deletions

View File

@ -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

28
mdadm.h
View File

@ -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 {};
# define FTW_PHYS 1
#else
# include <ftw.h>
# ifdef __dietlibc__
# define FTW_PHYS 1
# 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
# 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);

50
util.c
View File

@ -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;