diff -u mdadm-1.2.0/mdadm.h mdadm-1.2.0-/mdadm.h --- mdadm-1.2.0/mdadm.h Tue Mar 11 03:29:58 2003 +++ mdadm-1.2.0-/mdadm.h Thu May 22 22:06:13 2003 @@ -29,7 +29,6 @@ #define __USE_LARGEFILE64 #include -extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence)); #include #include @@ -41,6 +40,8 @@ #include #include +#define __KERNEL_STRICT_NAMES + #include /*#include */ #include Only in mdadm-1.2.0-: mdadm.h.orig diff -u mdadm-1.2.0/util.c mdadm-1.2.0-/util.c --- mdadm-1.2.0/util.c Tue Feb 11 23:50:49 2003 +++ mdadm-1.2.0-/util.c Thu May 22 22:09:03 2003 @@ -30,6 +30,7 @@ #include "mdadm.h" #include "md_p.h" #include +#include /* * Parse a 128 bit uuid in 4 integers @@ -369,62 +370,78 @@ /* * convert a major/minor pair for a block device into a name in /dev, if possible. * On the first call, walk /dev collecting name. - * Put them in a simple linked listfor now. */ -struct devmap { - int major, minor; - char *name; - struct devmap *next; -} *devlist = NULL; + int devlist_ready = 0; +char **devlist[256]; -#ifdef UCLIBC -char *map_dev(int major, int minor) +void collect_devs(const char *name) { -#if 0 - fprintf(stderr, "Warning - fail to map %d,%d to a device name\n", - major, minor); -#endif - return NULL; -} -#else -#define __USE_XOPEN_EXTENDED -#include - - -int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s) -{ - if ((stb->st_mode&S_IFMT)== S_IFBLK) { - char *n = strdup(name); - struct devmap *dm = malloc(sizeof(*dm)); - if (dm) { - dm->major = MAJOR(stb->st_rdev); - dm->minor = MINOR(stb->st_rdev); - dm->name = n; - dm->next = devlist; - devlist = dm; + DIR *d; + struct dirent *e; + int n = strlen(name); + char *cur; + int major, minor; + struct stat st; + + chdir(name); + d = opendir("."); + if (d == NULL) + return; + + while ((e = readdir(d))) { + stat(e->d_name, &st); + if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0) + continue; + if (!S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode)) + continue; + cur = malloc(n + strlen(e->d_name) + 2); + strcpy(cur, name); + cur[n] = '/'; + strcpy(cur + n + 1, e->d_name); + if (S_ISDIR(st.st_mode)) { + lstat(name, &st); + if (!S_ISLNK(st.st_mode)) + collect_devs(cur); + free(cur); + chdir(name); + } else { + major = MAJOR(st.st_rdev) & 0xff; + minor = MINOR(st.st_rdev) & 0xff; + + if (devlist[major] == NULL) + devlist[major] = calloc(sizeof(char*), 256); + /* shortest name wins, this can be quite usable + * with devfs and devfsd (/dev/hdaX links) + */ + if (devlist[major][minor] && + strlen(devlist[major][minor]) < strlen(cur)) + free(cur); + else { + free(devlist[major][minor]); + devlist[major][minor] = cur; + } + } } - } - return 0; + + closedir(d); } char *map_dev(int major, int minor) { - struct devmap *p; if (!devlist_ready) { - nftw("/dev", add_dev, 10, FTW_PHYS); + collect_devs("/dev"); devlist_ready=1; } - for (p=devlist; p; p=p->next) - if (p->major == major && - p->minor == minor) - return p->name; - return NULL; + major &= 0xff; + minor &= 0xff; + if (devlist[major]) + return devlist[major][minor]; + else + return NULL; } -#endif - int calc_sb_csum(mdp_super_t *super) { unsigned int oldcsum = super->sb_csum; @@ -525,3 +542,14 @@ if (strncmp(name, "/dev/.tmp.md", 12)==0) unlink(name); } + +#ifdef __UCLIBC__ +long long lseek64(int fd, long long off, int w) +{ + long long res; + + llseek(fd, off >> 32, off & 0xffffffff, &res, w); + + return res; +} +#endif Only in mdadm-1.2.0-: util.c.orig Only in mdadm-1.2.0-: util.c.rej