diff options
author | Alexander Aring <aahringo@redhat.com> | 2023-03-06 23:48:15 +0300 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2023-03-07 00:49:07 +0300 |
commit | 8a39dcd9c32dd3f0d3af745c72834d58a43ed90a (patch) | |
tree | 3bada81c1d1ec675af9147cf7653f0d71ab4a167 /fs/dlm/user.c | |
parent | 8c11ba64ce577a993701616e335319a0afbbd49a (diff) | |
download | linux-8a39dcd9c32dd3f0d3af745c72834d58a43ed90a.tar.xz |
fs: dlm: change dflags to use atomic bits
Currently manipulating lkb_dflags assumes to held the rsb lock assigned
to the lkb. This is held by dlm message processing after certain
time to lookup the right rsb from the received lkb message id. For user
space locks flags, which is currently the only use case for lkb_dflags,
flags are also being set during dlm character device handling without
holding the rsb lock. To minimize the risk that bit operations are
getting corrupted we switch to atomic bit operations. This patch will
also introduce helpers to snapshot atomic bit values in an non atomic
way. There might be still issues with the flag handling e.g. running in
case of manipulating bit ops and snapshot them at the same time, but this
patch minimize them and will start to use atomic bit operations.
Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
Diffstat (limited to 'fs/dlm/user.c')
-rw-r--r-- | fs/dlm/user.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/dlm/user.c b/fs/dlm/user.c index dd4b9c8f226c..233c88e46710 100644 --- a/fs/dlm/user.c +++ b/fs/dlm/user.c @@ -183,7 +183,7 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode, struct dlm_user_proc *proc; int rv; - if (lkb->lkb_dflags & DLM_DFL_ORPHAN || + if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) || lkb->lkb_flags & DLM_IFL_DEAD) return; @@ -196,7 +196,7 @@ void dlm_user_add_ast(struct dlm_lkb *lkb, uint32_t flags, int mode, for cases where a completion ast is received for an operation that began before clear_proc_locks did its cancel/unlock. */ - if (lkb->lkb_dflags & DLM_DFL_ORPHAN || + if (test_bit(DLM_DFL_ORPHAN_BIT, &lkb->lkb_dflags) || lkb->lkb_flags & DLM_IFL_DEAD) goto out; |