staging/lustre/osc: glimpse lock should match only with granted locks
A deadlock is possible during ccc_prep_size()->ldlm_lock_match() vs cl_io_lock() which is waiting for a matched lock and conflicts with already taken lock before ccc_prep_size(). It is better to send an additional lock request to avoid deadlock. Seagate-bug-id: MRP-3312 Signed-off-by: Andriy Skulysh <andriy.skulysh@seagate.com> Reviewed-on: http://review.whamcloud.com/18738 Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7829 Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com> Reviewed-by: Bobi Jam <bobijam@hotmail.com> Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
cb96191ff4
commit
025fd3c20b
|
@ -2246,7 +2246,7 @@ int osc_enqueue_base(struct obd_export *exp, struct ldlm_res_id *res_id,
|
|||
struct lustre_handle lockh = { 0 };
|
||||
struct ptlrpc_request *req = NULL;
|
||||
int intent = *flags & LDLM_FL_HAS_INTENT;
|
||||
__u64 match_lvb = agl ? 0 : LDLM_FL_LVB_READY;
|
||||
__u64 match_flags = *flags;
|
||||
enum ldlm_mode mode;
|
||||
int rc;
|
||||
|
||||
|
@ -2281,7 +2281,11 @@ int osc_enqueue_base(struct obd_export *exp, struct ldlm_res_id *res_id,
|
|||
mode = einfo->ei_mode;
|
||||
if (einfo->ei_mode == LCK_PR)
|
||||
mode |= LCK_PW;
|
||||
mode = ldlm_lock_match(obd->obd_namespace, *flags | match_lvb, res_id,
|
||||
if (agl == 0)
|
||||
match_flags |= LDLM_FL_LVB_READY;
|
||||
if (intent != 0)
|
||||
match_flags |= LDLM_FL_BLOCK_GRANTED;
|
||||
mode = ldlm_lock_match(obd->obd_namespace, match_flags, res_id,
|
||||
einfo->ei_type, policy, mode, &lockh, 0);
|
||||
if (mode) {
|
||||
struct ldlm_lock *matched;
|
||||
|
|
Loading…
Reference in New Issue