Whamcloud - gitweb
LU-15070 mdt: revoke remote LOOKUP lock for default LMV 36/45236/4
authorLai Siyao <lai.siyao@whamcloud.com>
Tue, 12 Oct 2021 22:20:21 +0000 (18:20 -0400)
committerOleg Drokin <green@whamcloud.com>
Wed, 3 Nov 2021 02:42:15 +0000 (02:42 +0000)
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.

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I9f079a0bcff530603725ce72cd89c14935ba913b
Reviewed-on: https://review.whamcloud.com/45236
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mdt/mdt_reint.c

index 6090ff0..07552c5 100644 (file)
@@ -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);
 
                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;
                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;
 
                        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)
 
                rc = mdt_object_lock(info, mo, lh, lockpart);
                if (rc != 0)