]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gfs2: Fix "ignore unlock failures after withdraw"
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 5 Apr 2024 11:47:51 +0000 (13:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 16 Jun 2024 11:32:05 +0000 (13:32 +0200)
[ Upstream commit 5d9231111966b6c5a65016d58dcbeab91055bc91 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/gfs2/glock.c
fs/gfs2/util.c

index dd052101e2266dccac176ede0d91ee3d4a44e786..b0f01a8e377669b8cef32cf06bb18421bdee98ee 100644 (file)
@@ -691,11 +691,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) {
index 3ece99e6490c285359bff4f1a192e003ef11f702..d11152dedb803e5e2d6a402e5b6659b77f122835 100644 (file)
@@ -348,7 +348,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);