]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super1.c
Grow: close file descriptor earlier to avoid "still in use" when stopping
[thirdparty/mdadm.git] / super1.c
index 2f1b6dc678c6e43edc37cc060d7bbcefc16d991b..10e00652c4eed59ae7f4fab4348ec5c6a48c05dd 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -1100,12 +1100,13 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
        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 (is_clustered(st)) {
-               rv = cluster_get_dlmlock(st, &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(st, lockid);
+                       cluster_release_dlmlock(lockid);
                        return rv;
                }
        }
@@ -1281,6 +1282,11 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
                        sb->bblog_shift = 0;
                        sb->bblog_offset = 0;
                }
+       } else if (strcmp(update, "force-no-bbl") == 0) {
+               sb->feature_map &= ~ __cpu_to_le32(MD_FEATURE_BAD_BLOCKS);
+               sb->bblog_size = 0;
+               sb->bblog_shift = 0;
+               sb->bblog_offset = 0;
        } else if (strcmp(update, "name") == 0) {
                if (info->name[0] == 0)
                        sprintf(info->name, "%d", info->array.md_minor);
@@ -1368,8 +1374,8 @@ 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);
+       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
+               cluster_release_dlmlock(lockid);
 
        return rv;
 }
@@ -1474,13 +1480,14 @@ 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;
 
-       if (is_clustered(st)) {
-               rv = cluster_get_dlmlock(st, &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(st, lockid);
+                       cluster_release_dlmlock(lockid);
                        return rv;
                }
        }
@@ -1513,8 +1520,8 @@ 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);
+       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
+               cluster_release_dlmlock(lockid);
 
        return 0;
 }
@@ -1529,13 +1536,14 @@ 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 (is_clustered(st)) {
-               rv = cluster_get_dlmlock(st, &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(st, lockid);
+                       cluster_release_dlmlock(lockid);
                        return rv;
                }
        }
@@ -1599,8 +1607,8 @@ static int store_super1(struct supertype *st, int fd)
                }
        }
        fsync(fd);
-       if (is_clustered(st))
-               cluster_release_dlmlock(st, lockid);
+       if (bms->version == BITMAP_MAJOR_CLUSTERED && dlm_funs_ready())
+               cluster_release_dlmlock(lockid);
 
        return 0;
 }