]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Central calls to ioctl BLKGETSIZE
authorNeil Brown <neilb@suse.de>
Thu, 14 Dec 2006 06:32:57 +0000 (17:32 +1100)
committerNeil Brown <neilb@suse.de>
Thu, 14 Dec 2006 06:32:57 +0000 (17:32 +1100)
Instead of opencoding the same thing everywhere.

12 files changed:
Assemble.c
Build.c
Create.c
Detail.c
Grow.c
Manage.c
Query.c
mdadm.h
super0.c
super1.c
test
util.c

index c731105dfab28351ff2718df5066616a30106850..5e4e3941ac735592abcdd1f573140a0867b9bdbe 100644 (file)
@@ -951,8 +951,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
                                        while (usecs < 1000) {
                                                mdfd = open(mddev, O_RDONLY);
                                                if (mdfd >= 0) {
-                                                       unsigned long size;
-                                                       if (ioctl(mdfd, BLKGETSIZE, &size) == 0 &&
+                                                       unsigned long long size;
+                                                       if (get_dev_size(mdfd, NULL, &size) &&
                                                            size > 0)
                                                                break;
                                                        close(mdfd);
diff --git a/Build.c b/Build.c
index ea314638dd44a4879f5a76a23b01fa0ead034bba..df9f4f2f5a5585eca174625b7b17c5ff43f0ca4b 100644 (file)
--- a/Build.c
+++ b/Build.c
@@ -148,7 +148,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
        }
        /* now add the devices */
        for ((i=0), (dv = devlist) ; dv ; i++, dv=dv->next) {
-               unsigned long dsize;
+               unsigned long long dsize;
                int fd;
                if (strcmp("missing", dv->devname) == 0)
                        continue;
@@ -168,12 +168,9 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
                                dv->devname, strerror(errno));
                        goto abort;
                }
-               if (ioctl(fd, BLKGETSIZE, &dsize) == 0 && dsize > 0) {
-                       unsigned long long ldsize = dsize;
-                       ldsize <<= 9;
-                       if (size== 0 || ldsize < size)
-                               size = ldsize;
-               }
+               if (get_dev_size(fd, NULL, &dsize) &&
+                   (size == 0 || dsize < size))
+                               size = dsize;
                close(fd);
                if (vers>= 9000) {
                        mdu_disk_info_t disk;
index cd4356ccd587197df2657b84ae22c5530c1b11c3..2a30ace7e0acd54eea67bb22946d4ae96611423b 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -180,7 +180,6 @@ int Create(struct supertype *st, char *mddev, int mdfd,
        dnum = 0;
        for (dv=devlist; dv; dv=dv->next, dnum++) {
                char *dname = dv->devname;
-               unsigned long dsize;
                unsigned long long ldsize, freesize;
                int fd;
                if (strcasecmp(dname, "missing")==0) {
@@ -199,22 +198,11 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                        fail=1;
                        continue;
                }
-#ifdef BLKGETSIZE64
-               if (ioctl(fd, BLKGETSIZE64, &ldsize)==0)
-                       ;
-               else
-#endif
-               if (ioctl(fd, BLKGETSIZE, &dsize)) {
-                       fprintf(stderr, Name ": Cannot get size of %s: %s\n",
-                               dname, strerror(errno));
+               if (!get_dev_size(fd, dname, &ldsize)) {
                        fail = 1;
                        close(fd);
                        continue;
                }
-               else {
-                       ldsize = dsize;
-                       ldsize <<= 9;
-               }
                if (st == NULL) {
                        struct createinfo *ci = conf_get_create_info();
                        if (ci)
index 42e990771a7d1f6ea1a0a1cedfa4714ad94b1545..ca34f1d48f125618bf33b554c7c96385296772d9 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -132,7 +132,6 @@ int Detail(char *dev, int brief, int test, char *homehost)
                printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks );
        else {
                mdu_bitmap_file_t bmf;
-               unsigned long array_size;
                unsigned long long larray_size;
                struct mdstat_ent *ms = mdstat_read(0, 0);
                struct mdstat_ent *e;
@@ -143,17 +142,8 @@ int Detail(char *dev, int brief, int test, char *homehost)
                for (e=ms; e; e=e->next)
                        if (e->devnum == devnum)
                                break;
-#ifdef BLKGETSIZE64
-               if (ioctl(fd, BLKGETSIZE64, &larray_size)==0)
-                       ;
-               else
-#endif
-                       if (ioctl(fd, BLKGETSIZE, &array_size)==0) {
-                               larray_size = array_size;
-                               larray_size <<= 9;
-                       }
-               
-               else larray_size = 0;
+               if (!get_dev_size(fd, NULL, &larray_size))
+                       larray_size = 0;
 
                printf("%s:\n", dev);
                printf("        Version : %02d.%02d.%02d\n",
diff --git a/Grow.c b/Grow.c
index fec0d3279300cbf97b8a05788d4967e3b74f6d5c..c160f2c6251306dda602c4fec87c5bb5a71f4767 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -257,15 +257,13 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
        }
        bitmapsize = array.size;
        bitmapsize <<= 1;
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &array_size) == 0 &&
+       if (get_dev_size(fd, NULL, &array_size) &&
            array_size > (0x7fffffffULL<<9)) {
                /* Array is big enough that we cannot trust array.size
                 * try other approaches
                 */
                bitmapsize = get_component_size(fd);
        }
-#endif
        if (bitmapsize == 0) {
                fprintf(stderr, Name ": Cannot reliably determine size of array to create bitmap - sorry.\n");
                return 1;
index 144fb4fb88bf9683a602b6dfcfa9e30f8f836cca..4b5ec80667b90ccd41f84f1640ccff3eaa74b5ab 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -187,7 +187,6 @@ int Manage_subdevs(char *devname, int fd,
        }
        for (dv = devlist ; dv; dv=dv->next) {
                unsigned long long ldsize;
-               unsigned long dsize;
 
                if (stat(dv->devname, &stb)) {
                        fprintf(stderr, Name ": cannot find %s: %s\n",
@@ -224,19 +223,9 @@ int Manage_subdevs(char *devname, int fd,
                        if (array.not_persistent==0)
                                st->ss->load_super(st, tfd, &osuper, NULL);
                        /* will use osuper later */
-#ifdef BLKGETSIZE64
-                       if (ioctl(tfd, BLKGETSIZE64, &ldsize)==0)
-                               ;
-                       else
-#endif
-                       if (ioctl(tfd, BLKGETSIZE, &dsize)) {
-                               fprintf(stderr, Name ": Cannot get size of %s: %s\n",
-                                       dv->devname, strerror(errno));
+                       if (!get_dev_size(tfd, dv->devname, &ldsize)) {
                                close(tfd);
                                return 1;
-                       } else {
-                               ldsize = dsize;
-                               ldsize <<= 9;
                        }
                        close(tfd);
 
diff --git a/Query.c b/Query.c
index 46707edda1aff750487566bc5abcbeec0f59e527..4cfcf5789b9b9e2901f1b009036d83dac182d68b 100644 (file)
--- a/Query.c
+++ b/Query.c
@@ -47,7 +47,6 @@ int Query(char *dev)
        struct supertype *st = NULL;
 
        unsigned long long larray_size;
-       unsigned long array_size;
        struct stat stb;
        char *mddev;
        mdu_disk_info_t disc;
@@ -67,15 +66,8 @@ int Query(char *dev)
        fstat(fd, &stb);
 
        if (vers>=9000 && !ioctlerr) {
-#ifdef BLKGETSIZE64
-               if (ioctl(fd, BLKGETSIZE64, &larray_size)==0)
-                       ;
-               else
-#endif
-                       if (ioctl(fd, BLKGETSIZE, &array_size)==0) {
-                               larray_size = array_size;
-                               larray_size <<= 9;
-                       } else larray_size = 0;
+               if (!get_dev_size(fd, NULL, &larray_size))
+                       larray_size = 0;
        }
 
        if (vers < 0) 
diff --git a/mdadm.h b/mdadm.h
index 318edd47234b506d50d83774d9ec88cf6ff6208f..f88eb23fd02347e77f77f104cee87dc8103e69b9 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -344,6 +344,7 @@ struct supertype {
 
 extern struct supertype *super_by_version(int vers, int minor);
 extern struct supertype *guess_super(int fd);
+extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
 
 #if __GNUC__ < 3
 struct stat64;
index 2408c25b971e0b633cf382b34b846cc59a211741..770d96e990ec492ea6b71154d2a19d219644bcea 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -588,20 +588,12 @@ static void add_to_super0(void *sbv, mdu_disk_info_t *dinfo)
 
 static int store_super0(struct supertype *st, int fd, void *sbv)
 {
-       unsigned long size;
        unsigned long long dsize;
        unsigned long long offset;
        mdp_super_t *super = sbv;
-    
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = ((unsigned long long)size)<<9;
-       }
+
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
 
        if (dsize < MD_RESERVED_SECTORS*2*512)
                return 2;
@@ -708,20 +700,10 @@ static int load_super0(struct supertype *st, int fd, void **sbp, char *devname)
        int uuid[4];
        struct bitmap_super_s *bsb;
     
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size)) {
-                       if (devname)
-                               fprintf(stderr, Name ": cannot find device size for %s: %s\n",
-                                       devname, strerror(errno));
-                       return 1;
-               } else
-                       dsize = size << 9;
-       }
+       if (!get_dev_size(fd, devname, &dsize))
+               return 1;
 
-       if (dsize < MD_RESERVED_SECTORS*2) {
+       if (dsize < MD_RESERVED_SECTORS*512 * 2) {
                if (devname)
                        fprintf(stderr, Name ": %s is too small for md: size is %ld sectors.\n",
                                devname, size);
@@ -877,19 +859,12 @@ static int add_internal_bitmap0(struct supertype *st, void *sbv, int *chunkp,
 void locate_bitmap0(struct supertype *st, int fd, void *sbv)
 {
        unsigned long long dsize;
-       unsigned long size;
        unsigned long long offset;
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return;
-               else
-                       dsize = ((unsigned long long)size)<<9;
-       }
 
-       if (dsize < MD_RESERVED_SECTORS*2)
+       if (!get_dev_size(fd, NULL, &dsize))
+               return;
+
+       if (dsize < MD_RESERVED_SECTORS*512 * 2)
                return;
 
        offset = MD_NEW_SIZE_SECTORS(dsize>>9);
@@ -903,7 +878,6 @@ void locate_bitmap0(struct supertype *st, int fd, void *sbv)
 
 int write_bitmap0(struct supertype *st, int fd, void *sbv)
 {
-       unsigned long size;
        unsigned long long dsize;
        unsigned long long offset;
        mdp_super_t *sb = sbv;
@@ -913,17 +887,11 @@ int write_bitmap0(struct supertype *st, int fd, void *sbv)
        int towrite, n;
        char buf[4096];
 
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = ((unsigned long long)size)<<9;
-       }
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
+
 
-       if (dsize < MD_RESERVED_SECTORS*2)
+       if (dsize < MD_RESERVED_SECTORS*512 * 2)
        return -1;
 
        offset = MD_NEW_SIZE_SECTORS(dsize>>9);
index 14f9c8af6563eab2bc6642eec1a9a96fb8e00907..f1732f7b6c751e56842b255702e4bf3ad5b2f729 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -696,19 +696,12 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
        struct mdp_superblock_1 *sb = sbv;
        unsigned long long sb_offset;
        int sbsize;
-       unsigned long size;
        unsigned long long dsize;
 
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = (unsigned long long)size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
+
+       dsize >>= 9;
 
        if (dsize < 24)
                return 2;
@@ -820,17 +813,9 @@ static int write_init_super1(struct supertype *st, void *sbv,
                free(refsb);
        }
 
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               unsigned long size;
-               if (ioctl(fd, BLKGETSIZE, &size))
-                       return 1;
-               else
-                       dsize = size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, NULL, &dsize))
+               return 1;
+       dsize >>= 9;
 
        if (dsize < 24) {
                close(fd);
@@ -937,7 +922,6 @@ static int compare_super1(void **firstp, void *secondv)
 
 static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
 {
-       unsigned long size;
        unsigned long long dsize;
        unsigned long long sb_offset;
        struct mdp_superblock_1 *super;
@@ -978,19 +962,9 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
                st->ss = NULL;
                return 2;
        }
-#ifdef BLKGETSIZE64
-       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
-#endif
-       {
-               if (ioctl(fd, BLKGETSIZE, &size)) {
-                       if (devname)
-                               fprintf(stderr, Name ": cannot find device size for %s: %s\n",
-                                       devname, strerror(errno));
-                       return 1;
-               }
-               dsize = size;
-       } else
-               dsize >>= 9;
+       if (!get_dev_size(fd, devname, &dsize))
+               return 1;
+       dsize >>= 9;
 
        if (dsize < 24) {
                if (devname)
diff --git a/test b/test
index f0a4388f592e5bdc0155abffd630d7c824b4c54b..a83b68e69d181f737f17696a5b79656c76c04403 100644 (file)
--- a/test
+++ b/test
@@ -65,6 +65,7 @@ fi
 
 # mdadm always adds --quiet, and we want to see any unexpected messages
 mdadm() {
+    rm -f $targetdir/stderr
     case $* in
        *-C* ) $mdadm 2> $targetdir/stderr --quiet "$@" --auto=yes;;
         * )   $mdadm 2> $targetdir/stderr --quiet "$@"
@@ -161,6 +162,7 @@ for script in tests/$prefix tests/$prefix*[^~]
 do
   if [ -f "$script" ]
   then
+   rm -f $targetdir/stderr
    # source script in a subshell, so it has access to our
    # namespace, but cannot change it.
    if ( set -ex ; . $script )  2> $targetdir/log
diff --git a/util.c b/util.c
index 6148ff8c8fd1506cec4fb79a822c84f8106321e7..ffb113c3c9d5179a872e0e55ed39b7f8f7ef0043 100644 (file)
--- a/util.c
+++ b/util.c
@@ -773,6 +773,28 @@ struct supertype *guess_super(int fd)
        return NULL;
 }
 
+/* Return size of device in bytes */
+int get_dev_size(int fd, char *dname, unsigned long long *sizep)
+{
+       unsigned long long ldsize;
+#ifdef BLKGETSIZE64
+       if (ioctl(fd, BLKGETSIZE64, &ldsize) != 0)
+#endif
+       {
+               unsigned long dsize;
+               if (ioctl(fd, BLKGETSIZE, &dsize) == 0) {
+                       ldsize = dsize;
+                       ldsize <<= 9;
+               } else {
+                       if (dname)
+                               fprintf(stderr, Name ": Cannot get size of %s: %s\b",
+                                       dname, strerror(errno));
+                       return 0;
+               }
+       }
+       *sizep = ldsize;
+       return 1;
+}
 
 #ifdef __TINYC__
 /* tinyc doesn't optimize this check in ioctl.h out ... */