summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2024-04-05 13:47:51 +0200
committerAndreas Gruenbacher <agruenba@redhat.com>2024-04-09 18:35:58 +0200
commit5d9231111966b6c5a65016d58dcbeab91055bc91 (patch)
treeef17cdf5ae294389f6c07df33af7a2c78e12c01f
parent262ee3a07e98e8e56230547d4fe75d485348a55a (diff)
downloadlinux-stable-5d9231111966b6c5a65016d58dcbeab91055bc91.tar.gz
linux-stable-5d9231111966b6c5a65016d58dcbeab91055bc91.tar.bz2
linux-stable-5d9231111966b6c5a65016d58dcbeab91055bc91.zip
gfs2: Fix "ignore unlock failures after withdraw"
Commit 3e11e53041502 tries to suppress dlm_lock() lock conversion errors that occur when the lockspace has already been released. It does that by setting and checking the SDF_SKIP_DLM_UNLOCK flag. This conflicts with the intended meaning of the SDF_SKIP_DLM_UNLOCK flag, so check whether the lockspace is still allocated instead. (Given the current DLM API, checking for this kind of error after the fact seems easier that than to make sure that the lockspace is still allocated before calling dlm_lock(). Changing the DLM API so that users maintain the lockspace references themselves would be an option.) Fixes: 3e11e53041502 ("GFS2: ignore unlock failures after withdraw") Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
-rw-r--r--fs/gfs2/glock.c4
-rw-r--r--fs/gfs2/util.c1
2 files changed, 3 insertions, 2 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index fa047331ea3c..ec1f8eb28950 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -810,11 +810,13 @@ skip_inval:
}
if (sdp->sd_lockstruct.ls_ops->lm_lock) {
+ struct lm_lockstruct *ls = &sdp->sd_lockstruct;
+
/* lock_dlm */
ret = sdp->sd_lockstruct.ls_ops->lm_lock(gl, target, lck_flags);
if (ret == -EINVAL && gl->gl_target == LM_ST_UNLOCKED &&
target == LM_ST_UNLOCKED &&
- test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags)) {
+ test_bit(DFL_UNMOUNT, &ls->ls_recover_flags)) {
finish_xmote(gl, target);
gfs2_glock_queue_work(gl, 0);
} else if (ret) {
diff --git a/fs/gfs2/util.c b/fs/gfs2/util.c
index 0535a0206512..09238604d741 100644
--- a/fs/gfs2/util.c
+++ b/fs/gfs2/util.c
@@ -350,7 +350,6 @@ int gfs2_withdraw(struct gfs2_sbd *sdp)
fs_err(sdp, "telling LM to unmount\n");
lm->lm_unmount(sdp);
}
- set_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags);
fs_err(sdp, "File system withdrawn\n");
dump_stack();
clear_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags);