]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super0.c
Make target to install binaries only
[thirdparty/mdadm.git] / super0.c
index 55ebd8bc78778457ee23354dc05fca56dd781a73..6af140bbf72197223e54fd37b9d1fd1ac28167ad 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -76,8 +76,6 @@ static void super0_swap_endian(struct mdp_superblock_s *sb)
 
 }
 
-#ifndef MDASSEMBLE
-
 static void examine_super0(struct supertype *st, char *homehost)
 {
        mdp_super_t *sb = st->sb;
@@ -231,15 +229,16 @@ static void examine_super0(struct supertype *st, char *homehost)
             d++) {
                mdp_disk_t *dp;
                char *dv;
-               char nb[5];
-               int wonly;
+               char nb[11];
+               int wonly, failfast;
                if (d>=0) dp = &sb->disks[d];
                else dp = &sb->this_disk;
                snprintf(nb, sizeof(nb), "%4d", d);
                printf("%4s %5d   %5d    %5d    %5d     ", d < 0 ? "this" : nb,
                       dp->number, dp->major, dp->minor, dp->raid_disk);
                wonly = dp->state & (1 << MD_DISK_WRITEMOSTLY);
-               dp->state &= ~(1 << MD_DISK_WRITEMOSTLY);
+               failfast = dp->state & (1<<MD_DISK_FAILFAST);
+               dp->state &= ~(wonly | failfast);
                if (dp->state & (1 << MD_DISK_FAULTY))
                        printf(" faulty");
                if (dp->state & (1 << MD_DISK_ACTIVE))
@@ -250,6 +249,8 @@ static void examine_super0(struct supertype *st, char *homehost)
                        printf(" removed");
                if (wonly)
                        printf(" write-mostly");
+               if (failfast)
+                       printf(" failfast");
                if (dp->state == 0)
                        printf(" spare");
                if ((dv = map_dev(dp->major, dp->minor, 0)))
@@ -347,10 +348,10 @@ err:
        return 1;
 }
 
-static void detail_super0(struct supertype *st, char *homehost)
+static void detail_super0(struct supertype *st, char *homehost, char *subarray)
 {
        mdp_super_t *sb = st->sb;
-       printf("           UUID : ");
+       printf("              UUID : ");
        if (sb->minor_version >= 90)
                printf("%08x:%08x:%08x:%08x", sb->set_uuid0, sb->set_uuid1,
                       sb->set_uuid2, sb->set_uuid3);
@@ -364,10 +365,10 @@ static void detail_super0(struct supertype *st, char *homehost)
                if (memcmp(&sb->set_uuid2, hash, 8)==0)
                        printf(" (local to host %s)", homehost);
        }
-       printf("\n         Events : %d.%d\n\n", sb->events_hi, sb->events_lo);
+       printf("\n            Events : %d.%d\n\n", sb->events_hi, sb->events_lo);
 }
 
-static void brief_detail_super0(struct supertype *st)
+static void brief_detail_super0(struct supertype *st, char *subarray)
 {
        mdp_super_t *sb = st->sb;
        printf(" UUID=");
@@ -377,7 +378,6 @@ static void brief_detail_super0(struct supertype *st)
        else
                printf("%08x", sb->set_uuid0);
 }
-#endif
 
 static int match_home0(struct supertype *st, char *homehost)
 {
@@ -520,9 +520,10 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
                 * up 4 bytes before continuing
                 */
                __u32 *sb32 = (__u32*)sb;
-               memcpy(sb32+MD_SB_GENERIC_CONSTANT_WORDS+7,
-                      sb32+MD_SB_GENERIC_CONSTANT_WORDS+7+1,
-                      (MD_SB_WORDS - (MD_SB_GENERIC_CONSTANT_WORDS+7+1))*4);
+
+               memmove(sb32+MD_SB_GENERIC_CONSTANT_WORDS+7,
+                       sb32+MD_SB_GENERIC_CONSTANT_WORDS+7+1,
+                       (MD_SB_WORDS - (MD_SB_GENERIC_CONSTANT_WORDS+7+1))*4);
                if (verbose >= 0)
                        pr_err("adjusting superblock of %s for 2.2/sparc compatibility.\n",
                               devname);
@@ -581,16 +582,17 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
        } else if (strcmp(update, "assemble")==0) {
                int d = info->disk.number;
                int wonly = sb->disks[d].state & (1<<MD_DISK_WRITEMOSTLY);
-               int mask = (1<<MD_DISK_WRITEMOSTLY);
+               int failfast = sb->disks[d].state & (1<<MD_DISK_FAILFAST);
+               int mask = (1<<MD_DISK_WRITEMOSTLY)|(1<<MD_DISK_FAILFAST);
                int add = 0;
                if (sb->minor_version >= 91)
                        /* During reshape we don't insist on everything
                         * being marked 'sync'
                         */
                        add = (1<<MD_DISK_SYNC);
-               if (((sb->disks[d].state & ~mask) | add)
-                   != (unsigned)info->disk.state) {
-                       sb->disks[d].state = info->disk.state | wonly;
+               if (((sb->disks[d].state & ~mask) | add) !=
+                   (unsigned)info->disk.state) {
+                       sb->disks[d].state = info->disk.state | wonly |failfast;
                        rv = 1;
                }
                if (info->reshape_active &&
@@ -721,7 +723,7 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
  * We use the first 8 bytes (64bits) of the sha1 of the host name
  */
 static int init_super0(struct supertype *st, mdu_array_info_t *info,
-                      unsigned long long size, char *ignored_name,
+                      struct shape *s, char *ignored_name,
                       char *homehost, int *uuid,
                       unsigned long long data_offset)
 {
@@ -760,8 +762,8 @@ static int init_super0(struct supertype *st, mdu_array_info_t *info,
        sb->gvalid_words = 0; /* ignored */
        sb->ctime = time(0);
        sb->level = info->level;
-       sb->size = size;
-       if (size != (unsigned long long)sb->size)
+       sb->size = s->size;
+       if (s->size != (unsigned long long)sb->size)
                return 0;
        sb->nr_disks = info->nr_disks;
        sb->raid_disks = info->raid_disks;
@@ -810,7 +812,6 @@ struct devinfo {
        struct devinfo *next;
 };
 
-#ifndef MDASSEMBLE
 /* Add a device to the superblock being created */
 static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
                         int fd, char *devname, unsigned long long data_offset)
@@ -841,7 +842,6 @@ static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
 
        return 0;
 }
-#endif
 
 static int store_super0(struct supertype *st, int fd)
 {
@@ -895,7 +895,6 @@ static int store_super0(struct supertype *st, int fd)
        return 0;
 }
 
-#ifndef MDASSEMBLE
 static int write_init_super0(struct supertype *st)
 {
        mdp_super_t *sb = st->sb;
@@ -926,7 +925,6 @@ static int write_init_super0(struct supertype *st)
        }
        return rv;
 }
-#endif
 
 static int compare_super0(struct supertype *st, struct supertype *tst)
 {
@@ -1061,8 +1059,8 @@ static int load_super0(struct supertype *st, int fd, char *devname)
         * valid.  If it doesn't clear the bit.  An --assemble --force
         * should get that written out.
         */
-       if (read(fd, super+1, ROUND_UP(sizeof(struct bitmap_super_s),4096))
-           != ROUND_UP(sizeof(struct bitmap_super_s),4096))
+       if (read(fd, super+1, ROUND_UP(sizeof(struct bitmap_super_s),4096)) !=
+           ROUND_UP(sizeof(struct bitmap_super_s), 4096))
                goto no_bitmap;
 
        uuid_from_super0(st, uuid);
@@ -1257,13 +1255,12 @@ static void free_super0(struct supertype *st)
        st->sb = NULL;
 }
 
-#ifndef MDASSEMBLE
 static int validate_geometry0(struct supertype *st, int level,
                              int layout, int raiddisks,
                              int *chunk, unsigned long long size,
                              unsigned long long data_offset,
                              char *subdev, unsigned long long *freesize,
-                             int verbose)
+                             int consistency_policy, int verbose)
 {
        unsigned long long ldsize;
        int fd;
@@ -1294,6 +1291,12 @@ static int validate_geometry0(struct supertype *st, int level,
        if (*chunk == UnSet)
                *chunk = DEFAULT_CHUNK;
 
+       if (level == 0 && layout != UnSet) {
+               if (verbose)
+                       pr_err("0.90 metadata does not support layouts for RAID0\n");
+               return 0;
+       }
+
        if (!subdev)
                return 1;
 
@@ -1316,10 +1319,8 @@ static int validate_geometry0(struct supertype *st, int level,
        *freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
        return 1;
 }
-#endif /* MDASSEMBLE */
 
 struct superswitch super0 = {
-#ifndef MDASSEMBLE
        .examine_super = examine_super0,
        .brief_examine_super = brief_examine_super0,
        .export_examine_super = export_examine_super0,
@@ -1329,7 +1330,6 @@ struct superswitch super0 = {
        .validate_geometry = validate_geometry0,
        .add_to_super = add_to_super0,
        .copy_metadata = copy_metadata0,
-#endif
        .match_home = match_home0,
        .uuid_from_super = uuid_from_super0,
        .getinfo_super = getinfo_super0,