]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Build.c
Some support for external metadata.
[thirdparty/mdadm.git] / Build.c
diff --git a/Build.c b/Build.c
index ea314638dd44a4879f5a76a23b01fa0ead034bba..d6e20fb84d6acfa57e69c6a9036d13c10bb2c07b 100644 (file)
--- a/Build.c
+++ b/Build.c
@@ -114,7 +114,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
 
 
        vers = md_get_version(mdfd);
-       
+
        /* looks Ok, go for it */
        if (vers >= 9000) {
                mdu_array_info_t array;
@@ -146,9 +146,15 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
                fprintf(stderr, Name ": bitmaps not supported with this kernel\n");
                return 1;
        }
+
+       if (bitmap_file && level <= 0) {
+               fprintf(stderr, Name ": bitmaps not meaningful with level %s\n",
+                       map_num(pers, level)?:"given");
+               return 1;
+       }
        /* 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;
@@ -164,16 +170,13 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
                }
                fd = open(dv->devname, O_RDONLY|O_EXCL);
                if (fd < 0) {
-                       fprintf(stderr, Name ": Cannot open %s: %s\n", 
+                       fprintf(stderr, Name ": Cannot open %s: %s\n",
                                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;
@@ -229,7 +232,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
                                                bitmap_file);
                                        return 1;
                                }
-                       }                               
+                       }
                        if (bitmap_fd >= 0) {
                                if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
                                        fprintf(stderr, Name ": Cannot set bitmap file for %s: %s\n",
@@ -270,5 +273,4 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
        else
            ioctl(mdfd, STOP_MD, 0);
        return 1;
-               
 }