]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
Create: user container_dev rather than subarray for some tests.
[thirdparty/mdadm.git] / super1.c
index 216690d4893216b30a974cbdc3a20dacbeacd6a5..6974daa0fb304cc26aa794b3e13550d771278efe 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -199,7 +199,7 @@ static void examine_super1(struct supertype *st, char *homehost)
 {
        struct mdp_superblock_1 *sb = st->sb;
        time_t atime;
-       int d;
+       unsigned int d;
        int role;
        int delta_extra = 0;
        int i;
@@ -239,7 +239,7 @@ static void examine_super1(struct supertype *st, char *homehost)
        printf(" Avail Dev Size : %llu%s\n",
               (unsigned long long)__le64_to_cpu(sb->data_size),
               human_size(__le64_to_cpu(sb->data_size)<<9));
-       if (__le32_to_cpu(sb->level) >= 0) {
+       if (__le32_to_cpu(sb->level) > 0) {
                int ddsks=0;
                switch(__le32_to_cpu(sb->level)) {
                case 1: ddsks=1;break;
@@ -388,9 +388,9 @@ static void examine_super1(struct supertype *st, char *homehost)
        for (d=0; d<__le32_to_cpu(sb->raid_disks) + delta_extra; d++) {
                int cnt = 0;
                int me = 0;
-               int i;
+               unsigned int i;
                for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
-                       int role = __le16_to_cpu(sb->dev_roles[i]);
+                       unsigned int role = __le16_to_cpu(sb->dev_roles[i]);
                        if (role == d) {
                                if (i == __le32_to_cpu(sb->dev_number))
                                        me = 1;
@@ -558,12 +558,13 @@ static void uuid_from_super1(struct supertype *st, int uuid[4])
                cuuid[i] = super->set_uuid[i];
 }
 
-static void getinfo_super1(struct supertype *st, struct mdinfo *info)
+static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
 {
        struct mdp_superblock_1 *sb = st->sb;
        int working = 0;
-       int i;
-       int role;
+       unsigned int i;
+       unsigned int role;
+       unsigned int map_disks = info->array.raid_disks;
 
        info->array.major_version = 1;
        info->array.minor_version = st->minor_version;
@@ -629,15 +630,33 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info)
        } else
                info->reshape_active = 0;
 
-       for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
+       if (map)
+               for (i=0; i<map_disks; i++)
+                       map[i] = 0;
+       for (i = 0; i < __le32_to_cpu(sb->max_dev); i++) {
                role = __le16_to_cpu(sb->dev_roles[i]);
-               if (/*role == 0xFFFF || */role < info->array.raid_disks)
+               if (/*role == 0xFFFF || */role < (unsigned) info->array.raid_disks) {
                        working++;
+                       if (map && role < map_disks)
+                               map[role] = 1;
+               }
        }
 
        info->array.working_disks = working;
 }
 
+static struct mdinfo *container_content1(struct supertype *st, char *subarray)
+{
+       struct mdinfo *info;
+
+       if (subarray)
+               return NULL;
+
+       info = malloc(sizeof(*info));
+       getinfo_super1(st, info, NULL);
+       return info;
+}
+
 static int update_super1(struct supertype *st, struct mdinfo *info,
                         char *update,
                         char *devname, int verbose,
@@ -656,8 +675,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                if (sb->events != __cpu_to_le64(info->events))
                        rv = 1;
                sb->events = __cpu_to_le64(info->events);
-       }
-       if (strcmp(update, "force-array")==0) {
+       } else if (strcmp(update, "force-array")==0) {
                /* Degraded array and 'force' requests to
                 * maybe need to mark it 'clean'.
                 */
@@ -668,8 +686,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                                rv = 1;
                        sb->resync_offset = MaxSector;
                }
-       }
-       if (strcmp(update, "assemble")==0) {
+       } else if (strcmp(update, "assemble")==0) {
                int d = info->disk.number;
                int want;
                if (info->disk.state == 6)
@@ -680,11 +697,10 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        sb->dev_roles[d] = want;
                        rv = 1;
                }
-       }
-       if (strcmp(update, "linear-grow-new") == 0) {
-               int i;
+       } else if (strcmp(update, "linear-grow-new") == 0) {
+               unsigned int i;
                int rfd, fd;
-               int max = __le32_to_cpu(sb->max_dev);
+               unsigned int max = __le32_to_cpu(sb->max_dev);
 
                for (i=0 ; i < max ; i++)
                        if (__le16_to_cpu(sb->dev_roles[i]) >= 0xfffe)
@@ -723,17 +739,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                                        ds - __le64_to_cpu(sb->data_offset));
                        }
                }
-       }
-       if (strcmp(update, "linear-grow-update") == 0) {
+       } else if (strcmp(update, "linear-grow-update") == 0) {
                sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
                sb->dev_roles[info->disk.number] =
                        __cpu_to_le16(info->disk.raid_disk);
-       }
-       if (strcmp(update, "resync") == 0) {
+       } else if (strcmp(update, "resync") == 0) {
                /* make sure resync happens */
                sb->resync_offset = 0ULL;
-       }
-       if (strcmp(update, "uuid") == 0) {
+       } else if (strcmp(update, "uuid") == 0) {
                copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid);
 
                if (__le32_to_cpu(sb->feature_map)&MD_FEATURE_BITMAP_OFFSET) {
@@ -741,8 +754,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        bm = (struct bitmap_super_s*)(st->sb+1024);
                        memcpy(bm->uuid, sb->set_uuid, 16);
                }
-       }
-       if (strcmp(update, "homehost") == 0 &&
+       } else if (strcmp(update, "homehost") == 0 &&
            homehost) {
                char *c;
                update = "name";
@@ -752,8 +764,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                else
                        strncpy(info->name, sb->set_name, 32);
                info->name[32] = 0;
-       }
-       if (strcmp(update, "name") == 0) {
+       } else if (strcmp(update, "name") == 0) {
                if (info->name[0] == 0)
                        sprintf(info->name, "%d", info->array.md_minor);
                memset(sb->set_name, 0, sizeof(sb->set_name));
@@ -765,8 +776,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        strcat(sb->set_name, info->name);
                } else
                        strcpy(sb->set_name, info->name);
-       }
-       if (strcmp(update, "devicesize") == 0 &&
+       } else if (strcmp(update, "devicesize") == 0 &&
            __le64_to_cpu(sb->super_offset) <
            __le64_to_cpu(sb->data_offset)) {
                /* set data_size to device size less data_offset */
@@ -778,9 +788,10 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        misc->device_size - __le64_to_cpu(sb->data_offset));
                printf("Size is %llu\n", (unsigned long long)
                       __le64_to_cpu(sb->data_size));
-       }
-       if (strcmp(update, "_reshape_progress")==0)
+       } else if (strcmp(update, "_reshape_progress")==0)
                sb->reshape_position = __cpu_to_le64(info->reshape_progress);
+       else
+               rv = -1;
 
        sb->sb_csum = calc_sb_1_csum(sb);
        return rv;
@@ -894,7 +905,7 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        else
                *rp = 0xfffe;
 
-       if (dk->number >= __le32_to_cpu(sb->max_dev) &&
+       if (dk->number >= (int)__le32_to_cpu(sb->max_dev) &&
            __le32_to_cpu(sb->max_dev) < 384)
                sb->max_dev = __cpu_to_le32(dk->number+1);
 
@@ -1012,11 +1023,11 @@ static int write_init_super1(struct supertype *st)
        struct supertype refst;
        int rfd;
        int rv = 0;
-       int bm_space;
+       unsigned long long bm_space;
        unsigned long long reserved;
        struct devinfo *di;
        unsigned long long dsize, array_size;
-       long long sb_offset;
+       unsigned long long sb_offset;
 
        for (di = st->info; di && ! rv ; di = di->next) {
                if (di->disk.state == 1)
@@ -1091,7 +1102,7 @@ static int write_init_super1(struct supertype *st)
                        sb_offset &= ~(4*2-1);
                        sb->super_offset = __cpu_to_le64(sb_offset);
                        sb->data_offset = __cpu_to_le64(0);
-                       if (sb_offset - bm_space < array_size)
+                       if (sb_offset < array_size + bm_space)
                                bm_space = sb_offset - array_size;
                        sb->data_size = __cpu_to_le64(sb_offset - bm_space);
                        break;
@@ -1206,9 +1217,6 @@ static int load_super1(struct supertype *st, int fd, char *devname)
 
        free_super1(st);
 
-       if (st->subarray[0])
-               return 1;
-
        if (st->ss == NULL || st->minor_version == -1) {
                int bestvers = -1;
                struct supertype tst;
@@ -1363,6 +1371,7 @@ static struct supertype *match_metadata_desc1(char *arg)
        if (!st) return st;
 
        memset(st, 0, sizeof(*st));
+       st->container_dev = NoMdDev;
        st->ss = &super1;
        st->max_devs = 384;
        st->sb = NULL;
@@ -1467,7 +1476,7 @@ add_internal_bitmap1(struct supertype *st,
        unsigned long long max_bits;
        unsigned long long min_chunk;
        long offset;
-       int chunk = *chunkp;
+       unsigned long long chunk = *chunkp;
        int room = 0;
        struct mdp_superblock_1 *sb = st->sb;
        bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + 1024);
@@ -1684,6 +1693,7 @@ struct superswitch super1 = {
        .match_home = match_home1,
        .uuid_from_super = uuid_from_super1,
        .getinfo_super = getinfo_super1,
+       .container_content = container_content1,
        .update_super = update_super1,
        .init_super = init_super1,
        .store_super = store_super1,