]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
mdadm: don't show cluster name once the bitmap is cleared
[thirdparty/mdadm.git] / super1.c
index 47acdec578dc71dec448018722dbe2d066a665bb..332d492eb05f3c7aaf4ebfc433aef7f5122e6d23 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -140,21 +140,6 @@ struct misc_dev_info {
                                        |MD_FEATURE_BITMAP_VERSIONED    \
                                        |MD_FEATURE_JOURNAL             \
                                        )
-/* return value:
- *    0, jouranl not required
- *    1, journal required
- *    2, no superblock loated (st->sb == NULL)
- */
-static int require_journal1(struct supertype *st)
-{
-       struct mdp_superblock_1 *sb = st->sb;
-
-       if (sb->feature_map & MD_FEATURE_JOURNAL)
-               return 1;
-       else if (!sb)
-               return 2;  /* no sb loaded */
-       return 0;
-}
 
 static int role_from_sb(struct mdp_superblock_1 *sb)
 {
@@ -339,7 +324,7 @@ static void examine_super1(struct supertype *st, char *homehost)
            strncmp(sb->set_name, homehost, l) == 0)
                printf("  (local to host %s)", homehost);
        printf("\n");
-       if (bms->nodes > 0)
+       if (bms->nodes > 0 && (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
                printf("   Cluster Name : %-64s\n", bms->cluster_name);
        atime = __le64_to_cpu(sb->ctime) & 0xFFFFFFFFFFULL;
        printf("  Creation Time : %.24s\n", ctime(&atime));
@@ -795,7 +780,7 @@ static void detail_super1(struct supertype *st, char *homehost)
            sb->set_name[l] == ':' &&
            strncmp(sb->set_name, homehost, l) == 0)
                printf("  (local to host %s)", homehost);
-       if (bms->nodes > 0)
+       if (bms->nodes > 0 && (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET))
            printf("\n   Cluster Name : %-64s", bms->cluster_name);
        printf("\n           UUID : ");
        for (i=0; i<16; i++) {
@@ -1086,6 +1071,9 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
        }
 
        info->array.working_disks = working;
+       if (sb->feature_map & __le32_to_cpu(MD_FEATURE_JOURNAL))
+               info->journal_device_required = 1;
+       info->journal_clean = 0;
 }
 
 static struct mdinfo *container_content1(struct supertype *st, char *subarray)
@@ -1110,8 +1098,18 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
         * ignored.
         */
        int rv = 0;
+       int lockid;
        struct mdp_superblock_1 *sb = st->sb;
 
+       if (is_clustered(st)) {
+               rv = cluster_get_dlmlock(st, &lockid);
+               if (rv) {
+                       pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
+                       cluster_release_dlmlock(st, lockid);
+                       return rv;
+               }
+       }
+
        if (strcmp(update, "homehost") == 0 &&
            homehost) {
                /* Note that 'homehost' is special as it is really
@@ -1370,6 +1368,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                rv = -1;
 
        sb->sb_csum = calc_sb_1_csum(sb);
+       if (is_clustered(st))
+               cluster_release_dlmlock(st, lockid);
+
        return rv;
 }
 
@@ -1473,6 +1474,16 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        struct mdp_superblock_1 *sb = st->sb;
        __u16 *rp = sb->dev_roles + dk->number;
        struct devinfo *di, **dip;
+       int rv, lockid;
+
+       if (is_clustered(st)) {
+               rv = cluster_get_dlmlock(st, &lockid);
+               if (rv) {
+                       pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
+                       cluster_release_dlmlock(st, lockid);
+                       return rv;
+               }
+       }
 
        if ((dk->state & 6) == 6) /* active, sync */
                *rp = __cpu_to_le16(dk->raid_disk);
@@ -1502,6 +1513,9 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        di->next = NULL;
        *dip = di;
 
+       if (is_clustered(st))
+               cluster_release_dlmlock(st, lockid);
+
        return 0;
 }
 #endif
@@ -1515,6 +1529,16 @@ static int store_super1(struct supertype *st, int fd)
        struct align_fd afd;
        int sbsize;
        unsigned long long dsize;
+       int rv, lockid;
+
+       if (is_clustered(st)) {
+               rv = cluster_get_dlmlock(st, &lockid);
+               if (rv) {
+                       pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
+                       cluster_release_dlmlock(st, lockid);
+                       return rv;
+               }
+       }
 
        if (!get_dev_size(fd, NULL, &dsize))
                return 1;
@@ -1575,6 +1599,9 @@ static int store_super1(struct supertype *st, int fd)
                }
        }
        fsync(fd);
+       if (is_clustered(st))
+               cluster_release_dlmlock(st, lockid);
+
        return 0;
 }
 
@@ -1598,10 +1625,7 @@ static unsigned long choose_bm_space(unsigned long devsize)
 static void free_super1(struct supertype *st);
 
 #define META_BLOCK_SIZE 4096
-unsigned long crc32(
-       unsigned long crc,
-       const unsigned char *buf,
-       unsigned len);
+__u32 crc32c_le(__u32 crc, unsigned char const *p, size_t len);
 
 static int write_empty_r5l_meta_block(struct supertype *st, int fd)
 {
@@ -1625,9 +1649,9 @@ static int write_empty_r5l_meta_block(struct supertype *st, int fd)
        mb->seq = __cpu_to_le64(random32());
        mb->position = __cpu_to_le64(0);
 
-       crc = crc32(0xffffffff, sb->set_uuid, sizeof(sb->set_uuid));
-       crc = crc32(crc, (void *)mb, META_BLOCK_SIZE);
-       mb->checksum = __cpu_to_le32(crc);
+       crc = crc32c_le(0xffffffff, sb->set_uuid, sizeof(sb->set_uuid));
+       crc = crc32c_le(crc, (void *)mb, META_BLOCK_SIZE);
+       mb->checksum = crc;
 
        if (lseek64(fd, (sb->data_offset) * 512, 0) < 0LL) {
                pr_err("cannot seek to offset of the meta block\n");
@@ -1689,7 +1713,8 @@ static int write_init_super1(struct supertype *st)
                if (rfd >= 0)
                        close(rfd);
 
-               sb->events = 0;
+               if (!(di->disk.state & (1<<MD_DISK_JOURNAL)))
+                       sb->events = 0;
 
                refst = dup_super(st);
                if (load_super1(refst, di->fd, NULL)==0) {
@@ -2391,6 +2416,16 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update
 
 static void free_super1(struct supertype *st)
 {
+       int rv, lockid;
+       if (is_clustered(st)) {
+               rv = cluster_get_dlmlock(st, &lockid);
+               if (rv) {
+                       pr_err("Cannot get dlmlock in %s return %d\n", __func__, rv);
+                       cluster_release_dlmlock(st, lockid);
+                       return;
+               }
+       }
+
        if (st->sb)
                free(st->sb);
        while (st->info) {
@@ -2401,6 +2436,8 @@ static void free_super1(struct supertype *st)
                free(di);
        }
        st->sb = NULL;
+       if (is_clustered(st))
+               cluster_release_dlmlock(st, lockid);
 }
 
 #ifndef MDASSEMBLE
@@ -2586,7 +2623,6 @@ struct superswitch super1 = {
        .locate_bitmap = locate_bitmap1,
        .write_bitmap = write_bitmap1,
        .free_super = free_super1,
-       .require_journal = require_journal1,
 #if __BYTE_ORDER == BIG_ENDIAN
        .swapuuid = 0,
 #else