]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
mdmon: fix wrong array state when disk fails during mdmon startup
[thirdparty/mdadm.git] / super1.c
index 7ae6dc3266835a3f9f1bbad33cc2e87e635bd088..b85dc20ca605bc27e93afc8f8758f35062e50fd3 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -360,7 +360,7 @@ static void examine_super1(struct supertype *st, char *homehost)
        printf("     Raid Level : %s\n", c?c:"-unknown-");
        printf("   Raid Devices : %d\n", __le32_to_cpu(sb->raid_disks));
        printf("\n");
-       printf(" Avail Dev Size : %llu%s\n",
+       printf(" Avail Dev Size : %llu sectors%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) {
@@ -378,11 +378,11 @@ static void examine_super1(struct supertype *st, char *homehost)
                if (ddsks) {
                        long long asize = __le64_to_cpu(sb->size);
                        asize = (asize << 9) * ddsks / ddsks_denom;
-                       printf("     Array Size : %llu%s\n",
+                       printf("     Array Size : %llu KiB%s\n",
                               asize >> 10,  human_size(asize));
                }
                if (sb->size != sb->data_size)
-                       printf("  Used Dev Size : %llu%s\n",
+                       printf("  Used Dev Size : %llu sectors%s\n",
                               (unsigned long long)__le64_to_cpu(sb->size),
                               human_size(__le64_to_cpu(sb->size)<<9));
        }
@@ -1185,20 +1185,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
         * ignored.
         */
        int rv = 0;
-       int lockid;
        struct mdp_superblock_1 *sb = st->sb;
        bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
-
        if (strcmp(update, "homehost") == 0 &&
            homehost) {
                /* Note that 'homehost' is special as it is really
@@ -1445,8 +1434,15 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        strcpy(sb->set_name, homehost);
                        strcat(sb->set_name, ":");
                        strcat(sb->set_name, info->name);
-               } else
-                       strncpy(sb->set_name, info->name, sizeof(sb->set_name));
+               } else {
+                       int namelen;
+
+                       namelen = min((int)strlen(info->name),
+                                     (int)sizeof(sb->set_name) - 1);
+                       memcpy(sb->set_name, info->name, namelen);
+                       memset(&sb->set_name[namelen], '\0',
+                              sizeof(sb->set_name) - namelen);
+               }
        } else if (strcmp(update, "devicesize") == 0 &&
                   __le64_to_cpu(sb->super_offset) <
                   __le64_to_cpu(sb->data_offset)) {
@@ -1551,8 +1547,6 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                rv = -1;
 
        sb->sb_csum = calc_sb_1_csum(sb);
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
 
        return rv;
 }
@@ -1605,8 +1599,15 @@ static int init_super1(struct supertype *st, mdu_array_info_t *info,
                strcpy(sb->set_name, homehost);
                strcat(sb->set_name, ":");
                strcat(sb->set_name, name);
-       } else
-               strncpy(sb->set_name, name, sizeof(sb->set_name));
+       } else {
+               int namelen;
+
+               namelen = min((int)strlen(name),
+                             (int)sizeof(sb->set_name) - 1);
+               memcpy(sb->set_name, name, namelen);
+               memset(&sb->set_name[namelen], '\0',
+                      sizeof(sb->set_name) - namelen);
+       }
 
        sb->ctime = __cpu_to_le64((unsigned long long)time(0));
        sb->level = __cpu_to_le32(info->level);
@@ -1656,20 +1657,8 @@ 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;
-       bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
-       int rv, lockid;
        int dk_state;
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
-
        dk_state = dk->state & ~(1<<MD_DISK_FAILFAST);
        if ((dk_state & (1<<MD_DISK_ACTIVE)) &&
            (dk_state & (1<<MD_DISK_SYNC)))/* active, sync */
@@ -1701,9 +1690,6 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
        di->next = NULL;
        *dip = di;
 
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
-
        return 0;
 }
 
@@ -1716,18 +1702,6 @@ static int store_super1(struct supertype *st, int fd)
        struct align_fd afd;
        int sbsize;
        unsigned long long dsize;
-       bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
-       int rv, lockid;
-
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready()) {
-               rv = cluster_get_dlmlock(&lockid);
-               if (rv) {
-                       pr_err("Cannot get dlmlock in %s return %d\n",
-                              __func__, rv);
-                       cluster_release_dlmlock(lockid);
-                       return rv;
-               }
-       }
 
        if (!get_dev_size(fd, NULL, &dsize))
                return 1;
@@ -1788,8 +1762,6 @@ static int store_super1(struct supertype *st, int fd)
                }
        }
        fsync(fd);
-       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
-               cluster_release_dlmlock(lockid);
 
        return 0;
 }