]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdadm: improve the safeguard for change cluster raid's sb
authorGuoqing Jiang <gqjiang@suse.com>
Wed, 16 Dec 2015 17:54:26 +0000 (01:54 +0800)
committerNeilBrown <neilb@suse.com>
Wed, 16 Dec 2015 22:53:37 +0000 (09:53 +1100)
This commit does the following jobs:

1. rename is_clustered to dlm_funs_ready since it match the
   function better.
2. st->cluster_name can't be use to identify the raid is a
   clustered or not, we should check the bitmap's version to
   perform the identification.
3. for cluster_get_dlmlock/cluster_release_dlmlock funcs, both
   of them just need the lockid as parameter since the cluster
   name can get by get_cluster_name().

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
mdadm.h
super1.c
util.c

diff --git a/mdadm.h b/mdadm.h
index edb8f9db5c89056b7080176ce1c31d3a3c32517e..99802c381a788cb3a1838c8130731ce147b7d592 100755 (executable)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1514,9 +1514,9 @@ struct dlm_hooks {
 };
 
 extern int get_cluster_name(char **name);
-extern int is_clustered(struct supertype *st);
-extern int cluster_get_dlmlock(struct supertype *st, int *lockid);
-extern int cluster_release_dlmlock(struct supertype *st, int lockid);
+extern int dlm_funs_ready(void);
+extern int cluster_get_dlmlock(int *lockid);
+extern int cluster_release_dlmlock(int lockid);
 extern void set_dlm_hooks(void);
 
 #define _ROUND_UP(val, base)   (((val) + (base) - 1) & ~(base - 1))
index 2f1b6dc678c6e43edc37cc060d7bbcefc16d991b..2df590ee9b311e051a9b364a2db964a6b7ac3f51 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;
                }
        }
@@ -1368,8 +1369,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 +1475,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 +1515,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 +1531,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 +1602,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;
 }
diff --git a/util.c b/util.c
index 8217e117fb546f6430a7b1b240619e79683f6589..f1b0b952ab535c25f77236c8e9d020d0802c8091 100644 (file)
--- a/util.c
+++ b/util.c
@@ -92,13 +92,9 @@ struct dlm_lock_resource {
        struct dlm_lksb lksb;
 };
 
-int is_clustered(struct supertype *st)
+int dlm_funs_ready(void)
 {
-       /* is it a cluster md or not */
-       if (is_dlm_hooks_ready && st->cluster_name)
-               return 1;
-       else
-               return 0;
+       return is_dlm_hooks_ready ? 1 : 0;
 }
 
 /* Using poll(2) to wait for and dispatch ASTs */
@@ -128,17 +124,24 @@ static void dlm_ast(void *arg)
        ast_called = 1;
 }
 
+static char *cluster_name = NULL;
 /* Create the lockspace, take bitmapXXX locks on all the bitmaps. */
-int cluster_get_dlmlock(struct supertype *st, int *lockid)
+int cluster_get_dlmlock(int *lockid)
 {
        int ret = -1;
        char str[64];
        int flags = LKF_NOQUEUE;
 
+       ret = get_cluster_name(&cluster_name);
+       if (ret) {
+               pr_err("The md can't get cluster name\n");
+               return -1;
+       }
+
        dlm_lock_res = xmalloc(sizeof(struct dlm_lock_resource));
-       dlm_lock_res->ls = dlm_hooks->create_lockspace(st->cluster_name, O_RDWR);
+       dlm_lock_res->ls = dlm_hooks->create_lockspace(cluster_name, O_RDWR);
        if (!dlm_lock_res->ls) {
-               pr_err("%s failed to create lockspace\n", st->cluster_name);
+               pr_err("%s failed to create lockspace\n", cluster_name);
                 goto out;
        }
 
@@ -146,7 +149,7 @@ int cluster_get_dlmlock(struct supertype *st, int *lockid)
        if (flags & LKF_CONVERT)
                dlm_lock_res->lksb.sb_lkid = *lockid;
 
-       snprintf(str, 64, "bitmap%04d", st->nodes);
+       snprintf(str, 64, "bitmap%s", cluster_name);
        /* if flags with LKF_CONVERT causes below return ENOENT which means
         * "No such file or directory" */
        ret = dlm_hooks->ls_lock(dlm_lock_res->ls, LKM_PWMODE, &dlm_lock_res->lksb,
@@ -171,10 +174,13 @@ out:
        return ret;
 }
 
-int cluster_release_dlmlock(struct supertype *st, int lockid)
+int cluster_release_dlmlock(int lockid)
 {
        int ret = -1;
 
+       if (!cluster_name)
+               return -1;
+
        /* if flags with LKF_CONVERT causes below return EINVAL which means
         * "Invalid argument" */
        ret = dlm_hooks->ls_unlock(dlm_lock_res->ls, lockid, 0,
@@ -195,7 +201,7 @@ int cluster_release_dlmlock(struct supertype *st, int lockid)
                 goto out;
        }
 
-       ret = dlm_hooks->release_lockspace(st->cluster_name, dlm_lock_res->ls, 1);
+       ret = dlm_hooks->release_lockspace(cluster_name, dlm_lock_res->ls, 1);
        if (ret) {
                pr_err("error %d happened when release lockspace\n", errno);
                /* XXX make sure the lockspace is released eventually */