From ecb6d03d2021b3121e46cc0b6d7add4c3ed6674f Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Tue, 12 Oct 2021 18:20:21 -0400 Subject: [PATCH] LU-15070 mdt: revoke remote LOOKUP lock for default LMV When setting default LMV, it will revoke LOOKUP lock, while if dir is remote dir, its LOOKUP lock is on MDT where its parent is located. Lustre-change: https://review.whamcloud.com/45236 Lustre-commit: b4645b5469c0722fdf66697379be878c071839cf Signed-off-by: Lai Siyao Change-Id: I9f079a0bcff530603725ce72cd89c14935ba913b Reviewed-by: Andreas Dilger Reviewed-by: Hongchao Zhang Reviewed-on: https://review.whamcloud.com/45495 Tested-by: jenkins Tested-by: Maloo --- lustre/mdt/mdt_reint.c | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index fe34bed..87ab651 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -935,22 +935,56 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, if (ma->ma_attr.la_valid != 0) GOTO(out_put, rc = -EPROTO); + lh = &info->mti_lh[MDT_LH_PARENT]; + mdt_lock_reg_init(lh, LCK_PW); + if (ma->ma_valid & MA_LOV) { buf->lb_buf = ma->ma_lmm; buf->lb_len = ma->ma_lmm_size; name = XATTR_NAME_LOV; } else { struct lmv_user_md *lmu = &ma->ma_lmv->lmv_user_md; + struct lu_fid *pfid = &info->mti_tmp_fid1; + struct lu_name *pname = &info->mti_name; + const char dotdot[] = ".."; + struct mdt_object *pobj; buf->lb_buf = lmu; buf->lb_len = ma->ma_lmv_size; name = XATTR_NAME_DEFAULT_LMV; - /* force client to update dir default layout */ - lockpart |= MDS_INODELOCK_LOOKUP; - } - lh = &info->mti_lh[MDT_LH_PARENT]; - mdt_lock_reg_init(lh, LCK_PW); + if (fid_is_root(rr->rr_fid1)) { + lockpart |= MDS_INODELOCK_LOOKUP; + } else { + /* force client to update dir default layout */ + fid_zero(pfid); + pname->ln_name = dotdot; + pname->ln_namelen = sizeof(dotdot); + rc = mdo_lookup(info->mti_env, + mdt_object_child(mo), pname, + pfid, NULL); + if (rc) + GOTO(out_put, rc); + + pobj = mdt_object_find(info->mti_env, mdt, + pfid); + if (IS_ERR(pobj)) + GOTO(out_put, rc = PTR_ERR(pobj)); + + if (mdt_object_remote(pobj)) + rc = mdt_remote_object_lock(info, pobj, + mdt_object_fid(mo), + &lh->mlh_rreg_lh, LCK_EX, + MDS_INODELOCK_LOOKUP, false); + else + lockpart |= MDS_INODELOCK_LOOKUP; + + mdt_object_put(info->mti_env, pobj); + + if (rc) + GOTO(out_put, rc); + } + } rc = mdt_object_lock(info, mo, lh, lockpart); if (rc != 0) -- 1.8.3.1