Whamcloud - gitweb
LU-6475 mdt: race between open and migrate
[fs/lustre-release.git] / lustre / mdc / mdc_lib.c
index d3a9365..db7cbb5 100644 (file)
@@ -397,6 +397,31 @@ void mdc_link_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
        mdc_pack_name(req, &RMF_NAME, op_data->op_name, op_data->op_namelen);
 }
 
+static void mdc_intent_close_pack(struct ptlrpc_request *req,
+                                 struct md_op_data *op_data)
+{
+       struct close_data       *data;
+       struct ldlm_lock        *lock;
+       enum mds_op_bias         bias = op_data->op_bias;
+
+       if (!(bias & (MDS_HSM_RELEASE | MDS_CLOSE_LAYOUT_SWAP |
+                     MDS_RENAME_MIGRATE)))
+               return;
+
+       data = req_capsule_client_get(&req->rq_pill, &RMF_CLOSE_DATA);
+       LASSERT(data != NULL);
+
+       lock = ldlm_handle2lock(&op_data->op_lease_handle);
+       if (lock != NULL) {
+               data->cd_handle = lock->l_remote_handle;
+               LDLM_LOCK_PUT(lock);
+       }
+       ldlm_cli_cancel(&op_data->op_lease_handle, LCF_LOCAL);
+
+       data->cd_data_version = op_data->op_data_version;
+       data->cd_fid = op_data->op_fid2;
+}
+
 void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
                     const char *old, size_t oldlen,
                     const char *new, size_t newlen)
@@ -424,6 +449,15 @@ void mdc_rename_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
 
        if (new != NULL)
                mdc_pack_name(req, &RMF_SYMTGT, new, newlen);
+
+       if (op_data->op_cli_flags & CLI_MIGRATE &&
+           op_data->op_bias & MDS_RENAME_MIGRATE) {
+               struct mdt_ioepoch *epoch;
+
+               mdc_intent_close_pack(req, op_data);
+               epoch = req_capsule_client_get(&req->rq_pill, &RMF_MDT_EPOCH);
+               mdc_ioepoch_pack(epoch, op_data);
+       }
 }
 
 void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, __u32 flags,
@@ -450,30 +484,6 @@ void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, __u32 flags,
                              op_data->op_namelen);
 }
 
-static void mdc_intent_close_pack(struct ptlrpc_request *req,
-                                 struct md_op_data *op_data)
-{
-       struct close_data       *data;
-       struct ldlm_lock        *lock;
-       enum mds_op_bias         bias = op_data->op_bias;
-
-       if (!(bias & (MDS_HSM_RELEASE | MDS_CLOSE_LAYOUT_SWAP)))
-               return;
-
-       data = req_capsule_client_get(&req->rq_pill, &RMF_CLOSE_DATA);
-       LASSERT(data != NULL);
-
-       lock = ldlm_handle2lock(&op_data->op_lease_handle);
-       if (lock != NULL) {
-               data->cd_handle = lock->l_remote_handle;
-               LDLM_LOCK_PUT(lock);
-       }
-       ldlm_cli_cancel(&op_data->op_lease_handle, LCF_LOCAL);
-
-       data->cd_data_version = op_data->op_data_version;
-       data->cd_fid = op_data->op_fid2;
-}
-
 void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
 {
         struct mdt_ioepoch *epoch;