GFS2: Reinstate withdraw ack system
authorSteven Whitehouse <swhiteho@redhat.com>
Wed, 13 Feb 2013 12:21:40 +0000 (12:21 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 13 Feb 2013 12:21:40 +0000 (12:21 +0000)
This patch reinstates the ack system which withdraw should be using. It
appears to have been accidentally forgotten when the lock module was
merged into GFS2, due to two different sysfs files having the same name.

Reported-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/incore.h
fs/gfs2/ops_fstype.c
fs/gfs2/sys.c
fs/gfs2/util.c

index 1533cf8b42692160cc1a683230a6fcd14537f39c..e2601ba38ef56899869ff69e101f957f18313709 100644 (file)
@@ -642,6 +642,7 @@ struct gfs2_sbd {
        wait_queue_head_t sd_glock_wait;
        atomic_t sd_glock_disposal;
        struct completion sd_locking_init;
+       struct completion sd_wdack;
        struct delayed_work sd_control_work;
 
        /* Inode Stuff */
index e063f22d9e4c1fa1e2fdd4c7686d49ba206a09f2..1b612be4b873c663640cbd1338d9ff2d5aaa5d8e 100644 (file)
@@ -81,6 +81,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
        init_waitqueue_head(&sdp->sd_glock_wait);
        atomic_set(&sdp->sd_glock_disposal, 0);
        init_completion(&sdp->sd_locking_init);
+       init_completion(&sdp->sd_wdack);
        spin_lock_init(&sdp->sd_statfs_spin);
 
        spin_lock_init(&sdp->sd_rindex_spin);
index 462e84142759b1690f5346201844e0ff6df4b7f7..4fb9ad80d2600ac5ac53ddd399ff29ec1cb61f89 100644 (file)
@@ -330,6 +330,28 @@ static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
        return ret;
 }
 
+static ssize_t wdack_show(struct gfs2_sbd *sdp, char *buf)
+{
+       int val = completion_done(&sdp->sd_wdack) ? 1 : 0;
+
+       return sprintf(buf, "%d\n", val);
+}
+
+static ssize_t wdack_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
+{
+       ssize_t ret = len;
+       int val;
+
+       val = simple_strtol(buf, NULL, 0);
+
+       if ((val == 1) &&
+           !strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
+               complete(&sdp->sd_wdack);
+       else
+               ret = -EINVAL;
+       return ret;
+}
+
 static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf)
 {
        struct lm_lockstruct *ls = &sdp->sd_lockstruct;
@@ -461,7 +483,7 @@ static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
 
 GDLM_ATTR(proto_name,          0444, proto_name_show,          NULL);
 GDLM_ATTR(block,               0644, block_show,               block_store);
-GDLM_ATTR(withdraw,            0644, withdraw_show,            withdraw_store);
+GDLM_ATTR(withdraw,            0644, wdack_show,               wdack_store);
 GDLM_ATTR(jid,                 0644, jid_show,                 jid_store);
 GDLM_ATTR(first,               0644, lkfirst_show,             lkfirst_store);
 GDLM_ATTR(first_done,          0444, first_done_show,          NULL);
index f00d7c5744f66585333f25f7b324d2549f2ebe8a..6402fb69d71bd838d943c4d60d1a8879d15f6217 100644 (file)
@@ -54,6 +54,9 @@ int gfs2_lm_withdraw(struct gfs2_sbd *sdp, char *fmt, ...)
 
                kobject_uevent(&sdp->sd_kobj, KOBJ_OFFLINE);
 
+               if (!strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
+                       wait_for_completion(&sdp->sd_wdack);
+
                if (lm->lm_unmount) {
                        fs_err(sdp, "telling LM to unmount\n");
                        lm->lm_unmount(sdp);