Whamcloud - gitweb
Correctly set lsm size for open replay.
[fs/lustre-release.git] / lustre / mdc / mdc_locks.c
index 47b6cd7..1da0c78 100644 (file)
@@ -111,11 +111,15 @@ int it_open_error(int phase, struct lookup_intent *it)
 EXPORT_SYMBOL(it_open_error);
 
 /* this must be called on a lockh that is known to have a referenced lock */
-int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data)
+int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data,
+                      __u32 *bits)
 {
         struct ldlm_lock *lock;
         ENTRY;
 
+        if(bits)
+                *bits = 0;
+
         if (!*lockh) {
                 EXIT;
                 RETURN(0);
@@ -138,6 +142,9 @@ int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data)
         }
 #endif
         lock->l_ast_data = data;
+        if (bits)
+                *bits = lock->l_policy_data.l_inodebits.bits;
+
         unlock_res_and_lock(lock);
         LDLM_LOCK_PUT(lock);
 
@@ -241,8 +248,8 @@ static struct ptlrpc_request *mdc_intent_open_pack(struct obd_export *exp,
         struct ptlrpc_request *req;
         struct obd_device     *obddev = class_exp2obd(exp);
         struct ldlm_intent    *lit;
-        int                    joinfile = !!((it->it_flags & O_JOIN_FILE) &&
-                                              op_data->op_data);
+        int           joinfile = !!((it->it_create_mode & M_JOIN_FILE) &&
+                                    op_data->op_data);
         CFS_LIST_HEAD(cancels);
         int                    count = 0;
         int                    mode;
@@ -310,7 +317,7 @@ static struct ptlrpc_request *mdc_intent_open_pack(struct obd_export *exp,
         }
 
         spin_lock(&req->rq_lock);
-        req->rq_replay = 1;
+        req->rq_replay = req->rq_import->imp_replayable;
         spin_unlock(&req->rq_lock);
 
         /* pack the intent */
@@ -479,6 +486,7 @@ static int mdc_finish_enqueue(struct obd_export *exp,
         it->d.lustre.it_disposition = (int)lockrep->lock_policy_res1;
         it->d.lustre.it_status = (int)lockrep->lock_policy_res2;
         it->d.lustre.it_lock_mode = einfo->ei_mode;
+        it->d.lustre.it_lock_handle = lockh->cookie;
         it->d.lustre.it_data = req;
 
         if (it->d.lustre.it_status < 0 && req->rq_replay)
@@ -544,12 +552,17 @@ static int mdc_finish_enqueue(struct obd_export *exp,
                                 void *lmm;
                                 if (req_capsule_get_size(pill, &RMF_EADATA,
                                                          RCL_CLIENT) <
-                                    body->eadatasize) {
+                                    body->eadatasize)
                                         mdc_realloc_openmsg(req, body);
-                                        req_capsule_set_size(pill, &RMF_EADATA,
-                                                             RCL_CLIENT,
-                                                             body->eadatasize);
-                                }
+                                else
+                                        req_capsule_shrink(pill, &RMF_EADATA,
+                                                           body->eadatasize,
+                                                           RCL_CLIENT);
+
+                                req_capsule_set_size(pill, &RMF_EADATA,
+                                                     RCL_CLIENT,
+                                                     body->eadatasize);
+
                                 lmm = req_capsule_client_get(pill, &RMF_EADATA);
                                 if (lmm)
                                         memcpy(lmm, eadata, body->eadatasize);
@@ -629,7 +642,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo,
                 policy = *(ldlm_policy_data_t *)lmm;
                 res_id.name[3] = LDLM_FLOCK;
         } else if (it->it_op & IT_OPEN) {
-                int joinfile = !!((it->it_flags & O_JOIN_FILE) &&
+                int joinfile = !!((it->it_create_mode & M_JOIN_FILE) &&
                                               op_data->op_data);
 
                 req = mdc_intent_open_pack(exp, it, op_data, lmm, lmmsize,
@@ -639,7 +652,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo,
                         einfo->ei_cbdata = NULL;
                         lmm = NULL;
                 } else
-                        it->it_flags &= ~O_JOIN_FILE;
+                        it->it_create_mode &= ~M_JOIN_FILE;
         } else if (it->it_op & IT_UNLINK)
                 req = mdc_intent_unlink_pack(exp, it, op_data);
         else if (it->it_op & (IT_GETATTR | IT_LOOKUP))
@@ -722,7 +735,7 @@ static int mdc_finish_intent_lock(struct obd_export *exp,
         /* If we were revalidating a fid/name pair, mark the intent in
          * case we fail and get called again from lookup */
         if (fid_is_sane(&op_data->op_fid2) &&
-            it->it_flags & O_CHECK_STALE &&
+            it->it_create_mode & M_CHECK_STALE &&
             it->it_op != IT_GETATTR) {
                 it_set_disposition(it, DISP_ENQ_COMPLETE);
 
@@ -909,9 +922,8 @@ int mdc_intent_lock(struct obd_export *exp, struct md_op_data *op_data,
                                  lmm, lmmsize, NULL, extra_lock_flags);
                 if (rc < 0)
                         RETURN(rc);
-                it->d.lustre.it_lock_handle = lockh.cookie;
         } else if (!fid_is_sane(&op_data->op_fid2) ||
-                   !(it->it_flags & O_CHECK_STALE)) {
+                   !(it->it_create_mode & M_CHECK_STALE)) {
                 /* DISP_ENQ_COMPLETE set means there is extra reference on
                  * request referenced from this intent, saved for subsequent
                  * lookup.  This path is executed when we proceed to this
@@ -957,8 +969,6 @@ static int mdc_intent_getattr_async_interpret(const struct lu_env *env,
         if (rc)
                 GOTO(out, rc);
 
-        it->d.lustre.it_lock_handle = lockh->cookie;
-
         rc = mdc_finish_intent_lock(exp, req, &minfo->mi_data, it, lockh);
         EXIT;