GFS2: Reinstate withdraw ack system
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>
This commit is contained in:
parent
d2b47cfb26
commit
fd95e81cb1
4 changed files with 28 additions and 1 deletions
|
@ -642,6 +642,7 @@ struct gfs2_sbd {
|
||||||
wait_queue_head_t sd_glock_wait;
|
wait_queue_head_t sd_glock_wait;
|
||||||
atomic_t sd_glock_disposal;
|
atomic_t sd_glock_disposal;
|
||||||
struct completion sd_locking_init;
|
struct completion sd_locking_init;
|
||||||
|
struct completion sd_wdack;
|
||||||
struct delayed_work sd_control_work;
|
struct delayed_work sd_control_work;
|
||||||
|
|
||||||
/* Inode Stuff */
|
/* Inode Stuff */
|
||||||
|
|
|
@ -81,6 +81,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
|
||||||
init_waitqueue_head(&sdp->sd_glock_wait);
|
init_waitqueue_head(&sdp->sd_glock_wait);
|
||||||
atomic_set(&sdp->sd_glock_disposal, 0);
|
atomic_set(&sdp->sd_glock_disposal, 0);
|
||||||
init_completion(&sdp->sd_locking_init);
|
init_completion(&sdp->sd_locking_init);
|
||||||
|
init_completion(&sdp->sd_wdack);
|
||||||
spin_lock_init(&sdp->sd_statfs_spin);
|
spin_lock_init(&sdp->sd_statfs_spin);
|
||||||
|
|
||||||
spin_lock_init(&sdp->sd_rindex_spin);
|
spin_lock_init(&sdp->sd_rindex_spin);
|
||||||
|
|
|
@ -330,6 +330,28 @@ static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
|
||||||
return ret;
|
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)
|
static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf)
|
||||||
{
|
{
|
||||||
struct lm_lockstruct *ls = &sdp->sd_lockstruct;
|
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(proto_name, 0444, proto_name_show, NULL);
|
||||||
GDLM_ATTR(block, 0644, block_show, block_store);
|
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(jid, 0644, jid_show, jid_store);
|
||||||
GDLM_ATTR(first, 0644, lkfirst_show, lkfirst_store);
|
GDLM_ATTR(first, 0644, lkfirst_show, lkfirst_store);
|
||||||
GDLM_ATTR(first_done, 0444, first_done_show, NULL);
|
GDLM_ATTR(first_done, 0444, first_done_show, NULL);
|
||||||
|
|
|
@ -54,6 +54,9 @@ int gfs2_lm_withdraw(struct gfs2_sbd *sdp, char *fmt, ...)
|
||||||
|
|
||||||
kobject_uevent(&sdp->sd_kobj, KOBJ_OFFLINE);
|
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) {
|
if (lm->lm_unmount) {
|
||||||
fs_err(sdp, "telling LM to unmount\n");
|
fs_err(sdp, "telling LM to unmount\n");
|
||||||
lm->lm_unmount(sdp);
|
lm->lm_unmount(sdp);
|
||||||
|
|
Loading…
Reference in a new issue