diff options
author | Alexander Aring <aahringo@redhat.com> | 2023-05-29 23:44:30 +0200 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2023-06-14 17:17:33 +0200 |
commit | 7a931477bff1c7548aa8492bccf600f5f29452b1 (patch) | |
tree | 963787e86ad19efb3845b30c3c70c4225f48858d /fs/dlm/ast.c | |
parent | fs: dlm: revert check required context while close (diff) | |
download | linux-7a931477bff1c7548aa8492bccf600f5f29452b1.tar.xz linux-7a931477bff1c7548aa8492bccf600f5f29452b1.zip |
fs: dlm: clear pending bit when queue was empty
This patch clears the DLM_IFL_CB_PENDING_BIT flag which will be set when
there is callback work queued when there was no callback to dequeue. It
is a buggy case and should never happen, that's why there is a
WARN_ON(). However if the case happens we are prepared to somehow
recover from it.
Cc: stable@vger.kernel.org
Fixes: 61bed0baa4db ("fs: dlm: use a non-static queue for callbacks")
Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm/ast.c')
-rw-r--r-- | fs/dlm/ast.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/dlm/ast.c b/fs/dlm/ast.c index 700ff2e0515a..ff0ef4653535 100644 --- a/fs/dlm/ast.c +++ b/fs/dlm/ast.c @@ -181,10 +181,12 @@ void dlm_callback_work(struct work_struct *work) spin_lock(&lkb->lkb_cb_lock); rv = dlm_dequeue_lkb_callback(lkb, &cb); - spin_unlock(&lkb->lkb_cb_lock); - - if (WARN_ON_ONCE(rv == DLM_DEQUEUE_CALLBACK_EMPTY)) + if (WARN_ON_ONCE(rv == DLM_DEQUEUE_CALLBACK_EMPTY)) { + clear_bit(DLM_IFL_CB_PENDING_BIT, &lkb->lkb_iflags); + spin_unlock(&lkb->lkb_cb_lock); goto out; + } + spin_unlock(&lkb->lkb_cb_lock); for (;;) { castfn = lkb->lkb_astfn; |