From 92c4ad14d4b1e77e1566c8481195bb623472f149 Mon Sep 17 00:00:00 2001 From: Patrick Farrell Date: Wed, 29 May 2019 11:02:19 -0400 Subject: [PATCH] LU-12343 osc: Fix dom handling in weight_ast The DOM bit can be cancelled at any time during calls to weigh_ast, so: 1. We cannot assert that it is present 2. We cannot use it to identify the !LDLM_EXTENT case when calling osc_lock_weight Signed-off-by: Patrick Farrell Change-Id: Ic3e7370580e35d8ae06b8330971959e0d55a4e81 Reviewed-on: https://review.whamcloud.com/34966 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Andreas Dilger Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lustre/osc/osc_lock.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lustre/osc/osc_lock.c b/lustre/osc/osc_lock.c index a5b6aa3..10849d0 100644 --- a/lustre/osc/osc_lock.c +++ b/lustre/osc/osc_lock.c @@ -684,7 +684,8 @@ unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock) RETURN(1); LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT || - ldlm_has_dom(dlmlock)); + dlmlock->l_resource->lr_type == LDLM_IBITS); + lock_res_and_lock(dlmlock); obj = dlmlock->l_ast_data; if (obj) @@ -709,12 +710,17 @@ unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock) GOTO(out, weight = 1); } - if (ldlm_has_dom(dlmlock)) - weight = osc_lock_weight(env, obj, 0, OBD_OBJECT_EOF); - else + if (dlmlock->l_resource->lr_type == LDLM_EXTENT) weight = osc_lock_weight(env, obj, dlmlock->l_policy_data.l_extent.start, dlmlock->l_policy_data.l_extent.end); + else if (ldlm_has_dom(dlmlock)) + weight = osc_lock_weight(env, obj, 0, OBD_OBJECT_EOF); + /* The DOM bit can be cancelled at any time; in that case, we know + * there are no pages, so just return weight of 0 + */ + else + weight = 0; EXIT; -- 1.8.3.1