]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
Fix some compiler warnings.
[thirdparty/mdadm.git] / super1.c
index f879e669db79ee1bb3f0376d43bfc850141139fc..410436c8f734f20998f4b138fdd3970a46b1a809 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -111,7 +111,6 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
        unsigned long long newcsum;
        int size = sizeof(*sb) + __le32_to_cpu(sb->max_dev)*2;
        unsigned int *isuper = (unsigned int*)sb;
-       int i;
 
 /* make sure I can count... */
        if (offsetof(struct mdp_superblock_1,data_offset) != 128 ||
@@ -123,7 +122,7 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
        disk_csum = sb->sb_csum;
        sb->sb_csum = 0;
        newcsum = 0;
-       for (i=0; size>=4; size -= 4 ) {
+       for (; size>=4; size -= 4 ) {
                newcsum += __le32_to_cpu(*isuper);
                isuper++;
        }
@@ -387,15 +386,11 @@ static void examine_super1(struct supertype *st, char *homehost)
        printf("   Array State : ");
        for (d=0; d<__le32_to_cpu(sb->raid_disks) + delta_extra; d++) {
                int cnt = 0;
-               int me = 0;
                unsigned int i;
                for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
                        unsigned int role = __le16_to_cpu(sb->dev_roles[i]);
-                       if (role == d) {
-                               if (i == __le32_to_cpu(sb->dev_number))
-                                       me = 1;
+                       if (role == d)
                                cnt++;
-                       }
                }
                if (cnt > 1) printf("?");
                else if (cnt == 1) printf("A");
@@ -566,6 +561,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
        unsigned int role;
        unsigned int map_disks = info->array.raid_disks;
 
+       memset(info, 0, sizeof(*info));
        info->array.major_version = 1;
        info->array.minor_version = st->minor_version;
        info->array.patch_version = 0;
@@ -698,6 +694,20 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        sb->dev_roles[d] = __cpu_to_le16(want);
                        rv = 1;
                }
+               if (info->reshape_active &&
+                   sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
+                   info->delta_disks >= 0 &&
+                   info->reshape_progress < __le64_to_cpu(sb->reshape_position)) {
+                       sb->reshape_position = __cpu_to_le64(info->reshape_progress);
+                       rv = 1;
+               }
+               if (info->reshape_active &&
+                   sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE) &&
+                   info->delta_disks < 0 &&
+                   info->reshape_progress > __le64_to_cpu(sb->reshape_position)) {
+                       sb->reshape_position = __cpu_to_le64(info->reshape_progress);
+                       rv = 1;
+               }
        } else if (strcmp(update, "linear-grow-new") == 0) {
                unsigned int i;
                int rfd, fd;
@@ -758,7 +768,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
        } else if (strcmp(update, "no-bitmap") == 0) {
                sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
        } else if (strcmp(update, "homehost") == 0 &&
-           homehost) {
+                  homehost) {
                char *c;
                update = "name";
                c = strchr(sb->set_name, ':');
@@ -1019,11 +1029,13 @@ static unsigned long choose_bm_space(unsigned long devsize)
        return 4*2;
 }
 
+static void free_super1(struct supertype *st);
+
 #ifndef MDASSEMBLE
 static int write_init_super1(struct supertype *st)
 {
        struct mdp_superblock_1 *sb = st->sb;
-       struct supertype refst;
+       struct supertype *refst;
        int rfd;
        int rv = 0;
        unsigned long long bm_space;
@@ -1055,10 +1067,9 @@ static int write_init_super1(struct supertype *st)
 
                sb->events = 0;
 
-               refst =*st;
-               refst.sb = NULL;
-               if (load_super1(&refst, di->fd, NULL)==0) {
-                       struct mdp_superblock_1 *refsb = refst.sb;
+               refst = dup_super(st);
+               if (load_super1(refst, di->fd, NULL)==0) {
+                       struct mdp_superblock_1 *refsb = refst->sb;
 
                        memcpy(sb->device_uuid, refsb->device_uuid, 16);
                        if (memcmp(sb->set_uuid, refsb->set_uuid, 16)==0) {
@@ -1071,8 +1082,9 @@ static int write_init_super1(struct supertype *st)
                                if (get_linux_version() >= 2006018)
                                        sb->dev_number = refsb->dev_number;
                        }
-                       free(refsb);
+                       free_super1(refst);
                }
+               free(refst);
 
                if (!get_dev_size(di->fd, NULL, &dsize))
                        return 1;
@@ -1207,8 +1219,6 @@ static int compare_super1(struct supertype *st, struct supertype *tst)
        return 0;
 }
 
-static void free_super1(struct supertype *st);
-
 static int load_super1(struct supertype *st, int fd, char *devname)
 {
        unsigned long long dsize;
@@ -1641,13 +1651,20 @@ static void free_super1(struct supertype *st)
 {
        if (st->sb)
                free(st->sb);
+       while (st->info) {
+               struct devinfo *di = st->info;
+               st->info = di->next;
+               if (di->fd >= 0)
+                       close(di->fd);
+               free(di);
+       }
        st->sb = NULL;
 }
 
 #ifndef MDASSEMBLE
 static int validate_geometry1(struct supertype *st, int level,
                              int layout, int raiddisks,
-                             int chunk, unsigned long long size,
+                             int *chunk, unsigned long long size,
                              char *subdev, unsigned long long *freesize,
                              int verbose)
 {
@@ -1659,6 +1676,9 @@ static int validate_geometry1(struct supertype *st, int level,
                        fprintf(stderr, Name ": 1.x metadata does not support containers\n");
                return 0;
        }
+       if (chunk && *chunk == UnSet)
+               *chunk = DEFAULT_CHUNK;
+
        if (!subdev)
                return 1;