[lustre-devel] [PATCH 048/622] lustre: ldlm: fix for l_lru usage
James Simmons
jsimmons at infradead.org
Thu Feb 27 13:08:36 PST 2020
From: Yang Sheng <ys at whamcloud.com>
Fixes for lock convert code to prevent false assertion and
busy locks in LRU:
- ensure no l_readers and l_writers when add lock to LRU after
convert.
- don't verify l_lru without ns_lock.
WC-bug-id: https://jira.whamcloud.com/browse/LU-11003
Lustre-commit: 2a77dd3bee76 ("LU-11003 ldlm: fix for l_lru usage")
Signed-off-by: Yang Sheng <ys at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32309
Reviewed-by: Fan Yong <fan.yong at intel.com>
Reviewed-by: Mikhal Pershin <mpershin at whamcloud.com>
Reviewed-by: Oleg Drokin <green at whamcloud.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
fs/lustre/ldlm/ldlm_inodebits.c | 1 -
fs/lustre/ldlm/ldlm_request.c | 19 +++++++++++--------
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/fs/lustre/ldlm/ldlm_inodebits.c b/fs/lustre/ldlm/ldlm_inodebits.c
index e74928e..ddbf8d4 100644
--- a/fs/lustre/ldlm/ldlm_inodebits.c
+++ b/fs/lustre/ldlm/ldlm_inodebits.c
@@ -171,7 +171,6 @@ int ldlm_cli_dropbits(struct ldlm_lock *lock, u64 drop_bits)
ldlm_set_cbpending(lock);
ldlm_set_bl_ast(lock);
unlock_res_and_lock(lock);
- LASSERT(list_empty(&lock->l_lru));
goto exit;
}
diff --git a/fs/lustre/ldlm/ldlm_request.c b/fs/lustre/ldlm/ldlm_request.c
index 67c23fc..5833f59 100644
--- a/fs/lustre/ldlm/ldlm_request.c
+++ b/fs/lustre/ldlm/ldlm_request.c
@@ -881,21 +881,25 @@ static int lock_convert_interpret(const struct lu_env *env,
} else {
ldlm_clear_converting(lock);
- /* Concurrent BL AST has arrived, it may cause another convert
- * or cancel so just exit here.
+ /* Concurrent BL AST may arrive and cause another convert
+ * or cancel so just do nothing here if bl_ast is set,
+ * finish with convert otherwise.
*/
if (!ldlm_is_bl_ast(lock)) {
struct ldlm_namespace *ns = ldlm_lock_to_ns(lock);
/* Drop cancel_bits since there are no more converts
- * and put lock into LRU if it is not there yet.
+ * and put lock into LRU if it is still not used and
+ * is not there yet.
*/
lock->l_policy_data.l_inodebits.cancel_bits = 0;
- spin_lock(&ns->ns_lock);
- if (!list_empty(&lock->l_lru))
+ if (!lock->l_readers && !lock->l_writers) {
+ spin_lock(&ns->ns_lock);
+ /* there is check for list_empty() inside */
ldlm_lock_remove_from_lru_nolock(lock);
- ldlm_lock_add_to_lru_nolock(lock);
- spin_unlock(&ns->ns_lock);
+ ldlm_lock_add_to_lru_nolock(lock);
+ spin_unlock(&ns->ns_lock);
+ }
}
}
unlock_res_and_lock(lock);
@@ -903,7 +907,6 @@ static int lock_convert_interpret(const struct lu_env *env,
if (rc) {
lock_res_and_lock(lock);
if (ldlm_is_converting(lock)) {
- LASSERT(list_empty(&lock->l_lru));
ldlm_clear_converting(lock);
ldlm_set_cbpending(lock);
ldlm_set_bl_ast(lock);
--
1.8.3.1
More information about the lustre-devel
mailing list