Whamcloud - gitweb
LU-12624 lod: alloc dir stripes by QoS
[fs/lustre-release.git] / lustre / mdt / mdt_reint.c
index c9bb061..81c148f 100644 (file)
@@ -363,8 +363,8 @@ static int mdt_create(struct mdt_thread_info *info)
        int rc;
        ENTRY;
 
-       DEBUG_REQ(D_INODE, mdt_info_req(info), "Create  ("DNAME"->"DFID") "
-                 "in "DFID,
+       DEBUG_REQ(D_INODE, mdt_info_req(info),
+                 "Create ("DNAME"->"DFID") in "DFID,
                  PNAME(&rr->rr_name), PFID(rr->rr_fid2), PFID(rr->rr_fid1));
 
        if (!fid_is_md_operative(rr->rr_fid1))
@@ -649,6 +649,8 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
        if (info->mti_dlm_req)
                ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
+       OBD_RACE(OBD_FAIL_PTLRPC_RESEND_RACE);
+
        repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
        mo = mdt_object_find(info->mti_env, mdt, rr->rr_fid1);
        if (IS_ERR(mo))
@@ -766,19 +768,6 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
 
                        buf->lb_buf = lmu;
                        buf->lb_len = ma->ma_lmv_size;
-
-                       if (le32_to_cpu(lmu->lum_hash_type) &
-                           LMV_HASH_FLAG_SPACE) {
-                               /*
-                                * only allow setting "space" hash flag on
-                                * plain directory.
-                                */
-                               rc = mdt_object_striped(info, mo);
-                               if (rc)
-                                       GOTO(out_put,
-                                            rc = (rc == 1) ? -EPERM : rc);
-                       }
-
                        name = XATTR_NAME_DEFAULT_LMV;
                        /* force client to update dir default layout */
                        lockpart |= MDS_INODELOCK_LOOKUP;
@@ -1129,6 +1118,11 @@ static int mdt_reint_link(struct mdt_thread_info *info,
        if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK))
                RETURN(err_serious(-ENOENT));
 
+       if (OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_RESEND_RACE)) {
+               req->rq_no_reply = 1;
+               RETURN(err_serious(-ENOENT));
+       }
+
        if (info->mti_dlm_req)
                ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
 
@@ -2177,6 +2171,10 @@ unlock_open_sem:
        if (open_sem_locked)
                up_write(&sobj->mot_open_sem);
 unlock_links:
+       /* if we've got too many locks to save into RPC,
+        * then just commit before the locks are released */
+       if (!rc && do_sync)
+               mdt_device_sync(env, mdt);
        mdt_unlock_list(info, &link_locks, do_sync ? 1 : rc);
 put_source:
        mdt_object_put(env, sobj);
@@ -2190,9 +2188,6 @@ unlock_rename:
        if (lustre_handle_is_used(&rename_lh))
                mdt_rename_unlock(&rename_lh);
 
-       if (!rc && do_sync)
-               mdt_device_sync(env, mdt);
-
        return rc;
 }
 
@@ -2695,17 +2690,18 @@ static int mdt_reint_resync(struct mdt_thread_info *info,
                            struct mdt_lock_handle *lhc)
 {
        struct mdt_reint_record *rr = &info->mti_rr;
-       struct ptlrpc_request   *req = mdt_info_req(info);
-       struct md_attr          *ma = &info->mti_attr;
-       struct mdt_object       *mo;
-       struct ldlm_lock        *lease;
-       struct mdt_body         *repbody;
-       struct md_layout_change  layout = { .mlc_mirror_id = rr->rr_mirror_id };
-       bool                     lease_broken;
-       int                      rc, rc2;
+       struct ptlrpc_request *req = mdt_info_req(info);
+       struct md_attr *ma = &info->mti_attr;
+       struct mdt_object *mo;
+       struct ldlm_lock *lease;
+       struct mdt_body *repbody;
+       struct md_layout_change layout = { .mlc_mirror_id = rr->rr_mirror_id };
+       bool lease_broken;
+       int rc, rc2;
+
        ENTRY;
 
-       DEBUG_REQ(D_INODE, req, DFID": FLR file resync\n", PFID(rr->rr_fid1));
+       DEBUG_REQ(D_INODE, req, DFID", FLR file resync", PFID(rr->rr_fid1));
 
        if (info->mti_dlm_req)
                ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP);
@@ -2742,10 +2738,13 @@ static int mdt_reint_resync(struct mdt_thread_info *info,
 
        /* the file has yet opened by anyone else after we took the lease. */
        layout.mlc_opc = MD_LAYOUT_RESYNC;
-       rc = mdt_layout_change(info, mo, &layout);
+       lhc = &info->mti_lh[MDT_LH_LOCAL];
+       rc = mdt_layout_change(info, mo, lhc, &layout);
        if (rc)
                GOTO(out_unlock, rc);
 
+       mdt_object_unlock(info, mo, lhc, 0);
+
        ma->ma_need = MA_INODE;
        ma->ma_valid = 0;
        rc = mdt_attr_get_complex(info, mo, ma);