]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Make scanning of /dev work even if it is a symlink
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index abc576ed3281f07519e97718382e23dfe363caae..ab606ab12fa08f4861eb6fef549e89050f6f4131 100644 (file)
--- a/util.c
+++ b/util.c
@@ -229,7 +229,7 @@ int check_reiser(int fd, char *name)
         *
         */
        unsigned char sb[1024];
-       int size;
+       unsigned long size;
        if (lseek(fd, 64*1024, 0) != 64*1024)
                return 0;
        if (read(fd, sb, 1024) != 1024)
@@ -239,7 +239,7 @@ int check_reiser(int fd, char *name)
                return 0;
        fprintf(stderr, Name ": %s appears to contain a reiserfs file system\n",name);
        size = sb[0]|(sb[1]|(sb[2]|sb[3]<<8)<<8)<<8;
-       fprintf(stderr, "    size = %dK\n", size*4);
+       fprintf(stderr, "    size = %luK\n", size*4);
                
        return 1;
 }
@@ -248,7 +248,6 @@ int check_raid(int fd, char *name)
 {
        void *super;
        struct mdinfo info;
-       struct mddev_ident_s ident;
        time_t crtime;
        char *level;
        struct supertype *st = guess_super(fd);
@@ -258,7 +257,7 @@ int check_raid(int fd, char *name)
        /* Looks like a raid array .. */
        fprintf(stderr, Name ": %s appears to be part of a raid array:\n",
                name);
-       st->ss->getinfo_super(&info, &ident, super);
+       st->ss->getinfo_super(&info, super);
        free(super);
        crtime = info.array.ctime;
        level = map_num(pers, info.array.level);
@@ -385,6 +384,8 @@ 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 (strncmp(n, "/dev/.", 6)==0)
+               strcpy(n+4, name+6);
        if (dm) {
            dm->major = major(stb->st_rdev);
            dm->minor = minor(stb->st_rdev);
@@ -408,7 +409,12 @@ char *map_dev(int major, int minor)
        struct devmap *p;
        char *std = NULL, *nonstd=NULL;
        if (!devlist_ready) {
-               nftw("/dev", add_dev, 10, FTW_PHYS);
+               char *dev = "/dev";
+               struct stat stb;
+               if (lstat(dev, &stb)==0 &&
+                   S_ISLNK(stb.st_mode))
+                       dev = "/dev/.";
+               nftw(dev, add_dev, 10, FTW_PHYS);
                devlist_ready=1;
        }
 
@@ -653,8 +659,7 @@ struct supertype *guess_super(int fd)
                rv = ss->load_super(st, fd, &sbp, NULL);
                if (rv == 0) {
                        struct mdinfo info;
-                       struct mddev_ident_s ident;
-                       ss->getinfo_super(&info, &ident, sbp);
+                       ss->getinfo_super(&info, sbp);
                        if (bestsuper == -1 ||
                            besttime < info.array.ctime) {
                                bestsuper = i;
@@ -676,34 +681,6 @@ struct supertype *guess_super(int fd)
        return NULL;
 }
 
-unsigned long long get_component_size(int fd)
-{
-       /* Find out the component size of the array.
-        * We cannot trust GET_ARRAY_INFO ioctl as it's
-        * size field is only 32bits.
-        * So look in /sys/block/mdXXX/md/component_size
-        */
-       struct stat stb;
-       char fname[50];
-       int n;
-       if (fstat(fd, &stb)) return 0;
-       if (major(stb.st_rdev) == 9)
-               sprintf(fname, "/sys/block/md%d/md/component_size",
-                       minor(stb.st_rdev));
-       else
-               sprintf(fname, "/sys/block/md_d%d/md/component_size",
-                       minor(stb.st_rdev)/16);
-       fd = open(fname, O_RDONLY);
-       if (fd < 0)
-               return 0;
-       n = read(fd, fname, sizeof(fname));
-       close(fd);
-       if (n == sizeof(fname))
-               return 0;
-       fname[n] = 0;
-       return strtoull(fname, NULL, 10);
-}
-
 
 #ifdef __TINYC__
 /* tinyc doesn't optimize this check in ioctl.h out ... */