]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Grow.c
Add gpt pseudo-metadata
[thirdparty/mdadm.git] / Grow.c
diff --git a/Grow.c b/Grow.c
index dd05d4d988a89dc3decca48fd1f5223a16949989..0571f5b0e16d170e5bb9671d7f62df5f0cefa65c 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -409,7 +409,7 @@ static struct mdp_backup_super {
        __u8 pad[512-68-32];
 } __attribute__((aligned(512))) bsb, bsb2;
 
-int bsb_csum(char *buf, int len)
+__u32 bsb_csum(char *buf, int len)
 {
        int i;
        int csum = 0;
@@ -505,7 +505,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
        int nchunk, ochunk;
        int nlayout, olayout;
        int ndisks, odisks;
-       int ndata, odata;
+       unsigned int ndata, odata;
        int orig_level = UnSet;
        char alt_layout[40];
        int *fdlist;
@@ -515,7 +515,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
        int err;
        int frozen;
        unsigned long a,b, blocks, stripes;
-       int cache;
+       unsigned long cache;
        unsigned long long array_size;
        int changed = 0;
        int done;
@@ -759,6 +759,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                                        if (err == EBUSY && 
                                            (array.state & (1<<MD_SB_BITMAP_PRESENT)))
                                                fprintf(stderr, "       Bitmap must be removed before level can be changed\n");
+                                       rv = 1;
                                }
                        }
                } else if (!changed && !quiet)
@@ -789,7 +790,6 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 
                array.layout = parse_layout_faulty(layout_str);
                if (array.layout < 0) {
-                       int rv;
                        fprintf(stderr, Name ": %s: layout %s not understood for 'faulty' array\n",
                                devname, layout_str);
                        rv = 1;
@@ -923,7 +923,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 
                /* Check that we can hold all the data */
                get_dev_size(fd, NULL, &array_size);
-               if (ndata * size < (array_size/1024)) {
+               if (ndata * (unsigned long long)size < (array_size/1024)) {
                        fprintf(stderr, Name ": this change will reduce the size of the array.\n"
                                "       use --grow --array-size first to truncate array.\n"
                                "       e.g. mdadm --grow %s --array-size %llu\n",
@@ -979,7 +979,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                        rv = 1;
                        break;
                }
-               nrdisks = array.nr_disks + sra->array.spare_disks;
+               nrdisks = array.raid_disks + sra->array.spare_disks;
                /* Now we need to open all these devices so we can read/write.
                 */
                fdlist = malloc((1+nrdisks) * sizeof(int));
@@ -1054,7 +1054,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                                break;
                        }
                        memset(buf, 0, 512);
-                       for (i=0; i < blocks + 1 ; i++) {
+                       for (i=0; i < (signed)blocks + 1 ; i++) {
                                if (write(fdlist[d], buf, 512) != 512) {
                                        fprintf(stderr, Name ": %s: cannot create backup file %s: %s\n",
                                                devname, backup_file, strerror(errno));
@@ -1284,7 +1284,8 @@ int grow_backup(struct mdinfo *sra,
        int odata = disks;
        int rv = 0;
        int i;
-       unsigned long long new_degraded;
+       unsigned long long ll;
+       int new_degraded;
        //printf("offset %llu\n", offset);
        if (level >= 4)
                odata--;
@@ -1292,7 +1293,8 @@ int grow_backup(struct mdinfo *sra,
                odata--;
        sysfs_set_num(sra, NULL, "suspend_hi", (offset + stripes * (chunk/512)) * odata);
        /* Check that array hasn't become degraded, else we might backup the wrong data */
-       sysfs_get_ll(sra, NULL, "degraded", &new_degraded);
+       sysfs_get_ll(sra, NULL, "degraded", &ll);
+       new_degraded = (int)ll;
        if (new_degraded != *degraded) {
                /* check each device to ensure it is still working */
                struct mdinfo *sd;
@@ -1348,16 +1350,21 @@ int grow_backup(struct mdinfo *sra,
                        bsb.sb_csum2 = bsb_csum((char*)&bsb,
                                                ((char*)&bsb.sb_csum2)-((char*)&bsb));
 
-               if (lseek64(destfd[i], destoffsets[i] - 4096, 0) != destoffsets[i] - 4096)
-                       rv = 1;
-               rv = rv ?: write(destfd[i], &bsb, 512);
+               rv = -1;
+               if ((unsigned long long)lseek64(destfd[i], destoffsets[i] - 4096, 0)
+                   != destoffsets[i] - 4096)
+                       break;
+               if (write(destfd[i], &bsb, 512) != 512)
+                       break;
                if (destoffsets[i] > 4096) {
-                       if (lseek64(destfd[i], destoffsets[i]+stripes*chunk*odata, 0) !=
+                       if ((unsigned long long)lseek64(destfd[i], destoffsets[i]+stripes*chunk*odata, 0) !=
                            destoffsets[i]+stripes*chunk*odata)
-                               rv = 1;
-                       rv = rv ?: write(destfd[i], &bsb, 512);
+                               break;
+                       if (write(destfd[i], &bsb, 512) != 512)
+                               break;
                }
                fsync(destfd[i]);
+               rv = 0;
        }
 
        return rv;
@@ -1426,10 +1433,12 @@ int wait_backup(struct mdinfo *sra,
                if (memcmp(bsb.magic, "md_backup_data-2", 16) == 0)
                        bsb.sb_csum2 = bsb_csum((char*)&bsb,
                                                ((char*)&bsb.sb_csum2)-((char*)&bsb));
-               if (lseek64(destfd[i], destoffsets[i]-4096, 0) !=
+               if ((unsigned long long)lseek64(destfd[i], destoffsets[i]-4096, 0) !=
                    destoffsets[i]-4096)
-                       rv = 1;
-               rv = rv ?: write(destfd[i], &bsb, 512);
+                       rv = -1;
+               if (rv == 0 && 
+                   write(destfd[i], &bsb, 512) != 512)
+                       rv = -1;
                fsync(destfd[i]);
        }
        return rv;
@@ -1438,13 +1447,13 @@ int wait_backup(struct mdinfo *sra,
 static void fail(char *msg)
 {
        int rv;
-       rv = write(2, msg, strlen(msg));
-       rv |= write(2, "\n", 1);
+       rv = (write(2, msg, strlen(msg)) != (int)strlen(msg));
+       rv |= (write(2, "\n", 1) != 1);
        exit(rv ? 1 : 2);
 }
 
 static char *abuf, *bbuf;
-static int abuflen;
+static unsigned long long abuflen;
 static void validate(int afd, int bfd, unsigned long long offset)
 {
        /* check that the data in the backup against the array.
@@ -1485,12 +1494,12 @@ static void validate(int afd, int bfd, unsigned long long offset)
                }
 
                lseek64(bfd, offset, 0);
-               if (read(bfd, bbuf, len) != len) {
+               if ((unsigned long long)read(bfd, bbuf, len) != len) {
                        //printf("len %llu\n", len);
                        fail("read first backup failed");
                }
                lseek64(afd, __le64_to_cpu(bsb2.arraystart)*512, 0);
-               if (read(afd, abuf, len) != len)
+               if ((unsigned long long)read(afd, abuf, len) != len)
                        fail("read first from array failed");
                if (memcmp(bbuf, abuf, len) != 0) {
                        #if 0
@@ -1518,10 +1527,10 @@ static void validate(int afd, int bfd, unsigned long long offset)
                }
 
                lseek64(bfd, offset+__le64_to_cpu(bsb2.devstart2)*512, 0);
-               if (read(bfd, bbuf, len) != len)
+               if ((unsigned long long)read(bfd, bbuf, len) != len)
                        fail("read second backup failed");
                lseek64(afd, __le64_to_cpu(bsb2.arraystart2)*512, 0);
-               if (read(afd, abuf, len) != len)
+               if ((unsigned long long)read(afd, abuf, len) != len)
                        fail("read second from array failed");
                if (memcmp(bbuf, abuf, len) != 0)
                        fail("data2 compare failed");
@@ -1763,8 +1772,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, int cnt
                 * sometimes they aren't... So allow considerable flexability in matching, and allow
                 * this test to be overridden by an environment variable.
                 */
-               if (info->array.utime > __le64_to_cpu(bsb.mtime) + 2*60*60 ||
-                   info->array.utime < __le64_to_cpu(bsb.mtime) - 10*60) {
+               if (info->array.utime > (int)__le64_to_cpu(bsb.mtime) + 2*60*60 ||
+                   info->array.utime < (int)__le64_to_cpu(bsb.mtime) - 10*60) {
                        if (check_env("MDADM_GROW_ALLOW_OLD")) {
                                fprintf(stderr, Name ": accepting backup with timestamp %lu "
                                        "for array with timestamp %lu\n",
@@ -1973,15 +1982,9 @@ int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
        int d;
        struct mdinfo *sra, *sd;
        int rv;
-       int cache;
+       unsigned long cache;
        int done = 0;
 
-       sra = sysfs_read(-1, devname2devnum(info->sys_name),
-                        GET_COMPONENT|GET_DEVS|GET_OFFSET|GET_STATE|
-                        GET_CACHE);
-       if (!sra)
-               return 1;
-
        err = sysfs_set_str(info, NULL, "array_state", "readonly");
        if (err)
                return err;
@@ -1989,7 +1992,13 @@ int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
        /* make sure reshape doesn't progress until we are ready */
        sysfs_set_str(info, NULL, "sync_max", "0");
        sysfs_set_str(info, NULL, "array_state", "active"); /* FIXME or clean */
-       
+
+       sra = sysfs_read(-1, devname2devnum(info->sys_name),
+                        GET_COMPONENT|GET_DEVS|GET_OFFSET|GET_STATE|
+                        GET_CACHE);
+       if (!sra)
+               return 1;
+
        /* ndisks is not growing, so raid_disks is old and +delta is new */
        odisks = info->array.raid_disks;
        ndisks = odisks + info->delta_disks;