--- /dev/null
+diff -ur mdctl/util.c mdctl-/util.c
+--- mdctl/util.c Thu Jul 26 07:30:28 2001
++++ mdctl-/util.c Mon Aug 6 19:01:03 2001
+@@ -30,6 +30,7 @@
+ #include "mdctl.h"
+ #include "md_p.h"
+ #include <sys/utsname.h>
++#include <dirent.h>
+
+ /*
+ * Parse a 128 bit uuid in 4 integers
+@@ -364,51 +365,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;
+-
+-#define __USE_XOPEN_EXTENDED
+-#include <ftw.h>
+
++int devlist_ready = 0;
++char **devlist[256];
+
+-int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
++void collect_devs(const char *name)
+ {
+- 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;
+ }
+
+-
+ int calc_sb_csum(mdp_super_t *super)
+ {
+ unsigned int oldcsum = super->sb_csum;
+@@ -424,3 +452,14 @@
+ super->sb_csum = oldcsum;
+ return csum;
+ }
++
++#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
+diff -ur mdctl/mdctl.h mdctl-/mdctl.h
+--- mdctl/mdadm.h Tue Jun 19 01:56:53 2001
++++ mdctl-/mdadm.h Fri Mar 15 14:01:40 2002
+@@ -29,7 +29,6 @@
+
+ #define __USE_LARGEFILE64
+ #include <unistd.h>
+-extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+@@ -41,6 +40,8 @@
+ #include <errno.h>
+ #include <string.h>
+
++#define __KERNEL_STRICT_NAMES
++
+ #include <linux/kdev_t.h>
+ #include <linux/fs.h>
+ #include <sys/ioctl.h>