]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Grow.c
Create: cleanup after failed create in duplicated array member case
[thirdparty/mdadm.git] / Grow.c
diff --git a/Grow.c b/Grow.c
index 62c67d04fe4881e277c6d3208dd8945e0ff3b922..053a372ac3b526f7a5b5cccce6955f02735914ea 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -288,6 +288,11 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
                return 1;
        } else if (strcmp(file, "internal") == 0) {
                int d;
+               if (st->ss->add_internal_bitmap == NULL) {
+                       fprintf(stderr, Name ": Internal bitmaps not supported "
+                               "with %s metadata\n", st->ss->name);
+                       return 1;
+               }
                for (d=0; d< st->max_devs; d++) {
                        mdu_disk_info_t disk;
                        char *dv;
@@ -1337,10 +1342,13 @@ int grow_backup(struct mdinfo *sra,
                        bsb.sb_csum2 = bsb_csum((char*)&bsb,
                                                ((char*)&bsb.sb_csum2)-((char*)&bsb));
 
-               rv |= lseek64(destfd[i], destoffsets[i] - 4096, 0);
+               if (lseek64(destfd[i], destoffsets[i] - 4096, 0) != destoffsets[i] - 4096)
+                       rv = 1;
                rv = rv ?: write(destfd[i], &bsb, 512);
                if (destoffsets[i] > 4096) {
-                       rv |= lseek64(destfd[i], destoffsets[i]+stripes*chunk*odata, 0);
+                       if (lseek64(destfd[i], destoffsets[i]+stripes*chunk*odata, 0) !=
+                           destoffsets[i]+stripes*chunk*odata)
+                               rv = 1;
                        rv = rv ?: write(destfd[i], &bsb, 512);
                }
                fsync(destfd[i]);
@@ -1412,7 +1420,9 @@ 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));
-               rv |= lseek64(destfd[i], destoffsets[i]-4096, 0);
+               if (lseek64(destfd[i], destoffsets[i]-4096, 0) !=
+                   destoffsets[i]-4096)
+                       rv = 1;
                rv = rv ?: write(destfd[i], &bsb, 512);
                fsync(destfd[i]);
        }