Whamcloud - gitweb
LU-15456 llite: deadlock in ll_new_node() 57/46157/2
authorLai Siyao <lai.siyao@whamcloud.com>
Tue, 18 Jan 2022 04:29:19 +0000 (23:29 -0500)
committerOleg Drokin <green@whamcloud.com>
Wed, 26 Jan 2022 05:12:21 +0000 (05:12 +0000)
ll_new_node() will call ll_dir_getstripe() to fetch parent default
LMV if md_create() returns -EREMOTE, it should call
ll_finish_md_op_data() before calling ll_dir_getstripe() because
the latter will lock lli_lsm_sem again, which will deadlock.

Fixes: 55ca00c3d1cd863 ("LU-11213 ptlrpc: intent_getattr fetches default LMV")
Test-Parameters: mdscount=2 mdtcount=4 testlist=racer,racer,racer
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: Ib858bae19ff88533fe487583c27d544026aafa3f
Reviewed-on: https://review.whamcloud.com/46157
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/llite/namei.c

index 3b0267e..8dfe614 100644 (file)
@@ -1659,11 +1659,11 @@ again:
 
                ptlrpc_req_finished(request);
                request = NULL;
+               ll_finish_md_op_data(op_data);
+               op_data = NULL;
 
                err2 = ll_dir_getstripe(dir, (void **)&lum, &lumsize, &request,
                                        OBD_MD_DEFAULT_MEA);
-               ll_finish_md_op_data(op_data);
-               op_data = NULL;
                if (err2 == 0) {
                        struct lustre_md md = { NULL };