]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
mdadm fix compilation for uClibc
[thirdparty/mdadm.git] / super1.c
index 7ea6958ad846475e421ef6e1762db9e141cf50ae..1eb88aac1d4f39371ba5b34fed8e001b19b62b14 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -248,10 +248,9 @@ static void examine_super1(struct supertype *st, char *homehost)
                                printf("     New Layout : %s\n", c?c:"-unknown-");
                        }
                        if (__le32_to_cpu(sb->level) == 10) {
-                               printf("     New Layout : near=%d, %s=%d\n",
-                                      __le32_to_cpu(sb->new_layout)&255,
-                                      (__le32_to_cpu(sb->new_layout)&0x10000)?"offset":"far",
-                                      (__le32_to_cpu(sb->new_layout)>>8)&255);
+                               printf("     New Layout :");
+                               print_r10_layout(__le32_to_cpu(sb->new_layout));
+                               printf("\n");
                        }
                }
                if (__le32_to_cpu(sb->new_chunk) != __le32_to_cpu(sb->chunksize))
@@ -281,10 +280,9 @@ static void examine_super1(struct supertype *st, char *homehost)
        }
        if (__le32_to_cpu(sb->level) == 10) {
                int lo = __le32_to_cpu(sb->layout);
-               printf("         Layout : near=%d, %s=%d\n",
-                      lo&255,
-                      (lo&0x10000)?"offset":"far",
-                      (lo>>8)&255);
+               printf("         Layout :");
+               print_r10_layout(lo);
+               printf("\n");
        }
        switch(__le32_to_cpu(sb->level)) {
        case 0:
@@ -375,6 +373,40 @@ static void brief_examine_super1(struct supertype *st)
        printf("\n");
 }
 
+static void export_examine_super1(struct supertype *st)
+{
+       struct mdp_superblock_1 *sb = st->sb;
+       int i;
+       int len = 32;
+
+       printf("MD_LEVEL=%s\n", map_num(pers, __le32_to_cpu(sb->level)));
+       printf("MD_DEVICES=%d\n", __le32_to_cpu(sb->raid_disks));
+       for (i=0; i<32; i++)
+               if (sb->set_name[i] == '\n' ||
+                   sb->set_name[i] == '\0') {
+                       len = i;
+                       break;
+               }
+       if (len)
+               printf("MD_NAME=%.*s\n", len, sb->set_name);
+       printf("MD_UUID=");
+       for (i=0; i<16; i++) {
+               if ((i&3)==0 && i != 0) printf(":");
+               printf("%02x", sb->set_uuid[i]);
+       }
+       printf("\n");
+       printf("MD_UPDATE_TIME=%llu\n",
+              __le64_to_cpu(sb->utime) & 0xFFFFFFFFFFULL);
+       printf("MD_DEV_UUID=");
+       for (i=0; i<16; i++) {
+               if ((i&3)==0 && i != 0) printf(":");
+               printf("%02x", sb->device_uuid[i]);
+       }
+       printf("\n");
+       printf("MD_EVENTS=%llu\n",
+              (unsigned long long)__le64_to_cpu(sb->events));
+}
+
 static void detail_super1(struct supertype *st, char *homehost)
 {
        struct mdp_superblock_1 *sb = st->sb;
@@ -408,7 +440,7 @@ static void brief_detail_super1(struct supertype *st)
        }
 }
 
-static void export_super1(struct supertype *st)
+static void export_detail_super1(struct supertype *st)
 {
        struct mdp_superblock_1 *sb = st->sb;
        int i;
@@ -567,7 +599,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
        }
        if (strcmp(update, "linear-grow-new") == 0) {
                int i;
-               int rfd;
+               int rfd, fd;
                int max = __le32_to_cpu(sb->max_dev);
 
                for (i=0 ; i < max ; i++)
@@ -588,6 +620,25 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 
                sb->dev_roles[i] =
                        __cpu_to_le16(info->disk.raid_disk);
+
+               fd = open(devname, O_RDONLY);
+               if (fd >= 0) {
+                       unsigned long long ds;
+                       get_dev_size(fd, devname, &ds);
+                       close(fd);
+                       ds >>= 9;
+                       if (__le64_to_cpu(sb->super_offset) <
+                           __le64_to_cpu(sb->data_offset)) {
+                               sb->data_size = __cpu_to_le64(
+                                       ds - __le64_to_cpu(sb->data_offset));
+                       } else {
+                               ds -= 8*2;
+                               ds &= ~(unsigned long long)(4*2-1);
+                               sb->super_offset = __cpu_to_le64(ds);
+                               sb->data_size = __cpu_to_le64(
+                                       ds - __le64_to_cpu(sb->data_offset));
+                       }
+               }
        }
        if (strcmp(update, "linear-grow-update") == 0) {
                sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
@@ -1152,6 +1203,9 @@ static struct supertype *match_metadata_desc1(char *arg)
        st->ss = &super1;
        st->max_devs = 384;
        st->sb = NULL;
+       /* Eliminate pointless leading 0 from some versions of mdadm -D */
+       if (strncmp(arg, "01.", 3) == 0)
+               arg++;
        if (strcmp(arg, "1.0") == 0) {
                st->minor_version = 0;
                return st;
@@ -1180,10 +1234,21 @@ static struct supertype *match_metadata_desc1(char *arg)
  */
 static __u64 avail_size1(struct supertype *st, __u64 devsize)
 {
+       struct mdp_superblock_1 *super = st->sb;
        if (devsize < 24)
                return 0;
 
-       devsize -= choose_bm_space(devsize);
+       if (super == NULL)
+               /* creating:  allow suitable space for bitmap */
+               devsize -= choose_bm_space(devsize);
+#ifndef MDASSEMBLE
+       else if (__le32_to_cpu(super->feature_map)&MD_FEATURE_BITMAP_OFFSET) {
+               /* hot-add. allow for actual size of bitmap */
+               struct bitmap_super_s *bsb;
+               bsb = (struct bitmap_super_s *)(((char*)super)+1024);
+               devsize -= bitmap_sectors(bsb);
+       }
+#endif
 
        switch(st->minor_version) {
        case -1: /* no specified.  Now time to set default */
@@ -1386,9 +1451,10 @@ struct superswitch super1 = {
 #ifndef MDASSEMBLE
        .examine_super = examine_super1,
        .brief_examine_super = brief_examine_super1,
+       .export_examine_super = export_examine_super1,
        .detail_super = detail_super1,
        .brief_detail_super = brief_detail_super1,
-       .export_super = export_super1,
+       .export_detail_super = export_detail_super1,
 #endif
        .match_home = match_home1,
        .uuid_from_super = uuid_from_super1,