Whamcloud - gitweb
(1) call mdt_shrink_reply() whenever possaible;
authorhuanghua <huanghua>
Thu, 14 Sep 2006 10:29:10 +0000 (10:29 +0000)
committerhuanghua <huanghua>
Thu, 14 Sep 2006 10:29:10 +0000 (10:29 +0000)
(2) fix a bug in mdc_xxx_pack(): 32 bit integer to __u64 convertion

lustre/mdc/mdc_internal.h
lustre/mdc/mdc_lib.c
lustre/mdd/mdd_handler.c
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c

index 43dcc49..f85c873 100644 (file)
@@ -33,7 +33,7 @@ void mdc_pack_req_body(struct ptlrpc_request *req, int offset,
 void mdc_pack_rep_body(struct ptlrpc_request *);
 void mdc_readdir_pack(struct ptlrpc_request *req, int pos, __u64 offset,
                      __u32 size, const struct lu_fid *fid);
-void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid,
+void mdc_getattr_pack(struct ptlrpc_request *req, int offset, __u64 valid,
                       int flags, struct md_op_data *data);
 void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
                       struct md_op_data *op_data,
@@ -56,7 +56,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset,
                      struct md_op_data *op_data,
                      const char *old, int oldlen, const char *new, int newlen);
 void mdc_close_pack(struct ptlrpc_request *req, int offset, struct md_op_data *op_data,
-                   int valid, struct obd_client_handle *och);
+                   __u64 valid, struct obd_client_handle *och);
 void mdc_exit_request(struct client_obd *cli);
 void mdc_enter_request(struct client_obd *cli);
 
index e4d0f12..336abee 100644 (file)
@@ -293,7 +293,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset,
         }
 }
 
-void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid,
+void mdc_getattr_pack(struct ptlrpc_request *req, int offset, __u64 valid,
                       int flags, struct md_op_data *op_data)
 {
         struct mdt_body *b;
@@ -317,7 +317,7 @@ void mdc_getattr_pack(struct ptlrpc_request *req, int offset, int valid,
 }
 
 void mdc_close_pack(struct ptlrpc_request *req, int offset,
-                    struct md_op_data *op_data, int valid,
+                    struct md_op_data *op_data, __u64  valid,
                     struct obd_client_handle *och)
 {
         struct mdt_body *body;
index db5a13a..3c4ac7b 100644 (file)
@@ -1646,7 +1646,16 @@ static int mdd_create_data(const struct lu_context *ctxt,
 
         /*XXX: setting the lov ea is not locked
          * but setting the attr is locked? */
-        rc = mdd_lov_set_md(ctxt, mdd_pobj, son, lmm, lmm_size, handle, 0);
+
+        /* replay creates has objects already */
+        if (spec->u.sp_ea.no_lov_create)
+                rc = mdd_lov_set_md(ctxt, mdd_pobj, son,
+                                    (struct lov_mds_md *)spec->u.sp_ea.eadata,
+                                    spec->u.sp_ea.eadatalen, handle, 0);
+        else
+                rc = mdd_lov_set_md(ctxt, mdd_pobj, son, lmm,
+                                    lmm_size, handle, 0);
+
         if (rc == 0)
                rc = mdd_attr_get_internal_locked(ctxt, son, ma);
 
index 6ba8fed..298617e 100644 (file)
@@ -223,8 +223,6 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
         LASSERT(ma->ma_valid & MA_INODE);
 
         repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-        repbody->eadatasize = 0;
-        repbody->aclsize = 0;
 
         isreg = S_ISREG(la->la_mode);
         isdir = S_ISDIR(la->la_mode);
@@ -286,9 +284,6 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                 else
                         repbody->valid |= OBD_MD_FLEASIZE;
         }
-        /* FIXME: should determine the offset dynamicly,
-         * did not get ACL before shrink. */
-        mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1);
 
 
         if (flags & FMODE_WRITE) {
@@ -362,7 +357,14 @@ void mdt_reconstruct_open(struct mdt_thread_info *info)
         LASSERT(pill->rc_fmt == &RQF_LDLM_INTENT_OPEN);
 
         mdt_req_from_mcd(req, med->med_mcd);
-        mdt_set_disposition(info, ldlm_rep, le32_to_cpu(mcd->mcd_last_data));
+        mdt_set_disposition(info, ldlm_rep, mcd->mcd_last_data);
+
+        ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD);
+        ma->ma_lmm_size = mdt->mdt_max_mdsize;
+        ma->ma_need = MA_INODE | MA_LOV;
+        repbody = req_capsule_server_get(pill, &RMF_MDT_BODY);
+        repbody->eadatasize = 0;
+        repbody->aclsize = 0;
 
         if (mdt_get_disposition(ldlm_rep, DISP_OPEN_CREATE) && req->rq_status) {
                 /* we did not create successfully, return error to client. */
@@ -397,13 +399,6 @@ void mdt_reconstruct_open(struct mdt_thread_info *info)
         if (IS_ERR(child))
                 GOTO(out_parent, result = PTR_ERR(child));
 
-        ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD);
-        ma->ma_lmm_size = mdt->mdt_max_mdsize;
-        ma->ma_need = MA_INODE | MA_LOV;
-        repbody = req_capsule_server_get(pill, &RMF_MDT_BODY);
-        repbody->eadatasize = 0;
-        repbody->aclsize = 0;
-
         result = mo_attr_get(ctxt, mdt_object_child(child), ma);
         if (result == -EREMOTE) {
                 /* the object is on remote node
@@ -453,7 +448,6 @@ void mdt_reconstruct_open(struct mdt_thread_info *info)
                 else
                         repbody->valid |= OBD_MD_FLEASIZE;
         }
-        mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1);
 
         if (flags & FMODE_WRITE) {
                 /* FIXME: in recovery, need to pass old epoch here */
@@ -506,6 +500,7 @@ out_child:
 out_parent:
         mdt_object_put(ctxt, parent);
 out:
+        mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1);
         req->rq_status = result;
 }
 
@@ -597,6 +592,7 @@ int mdt_open(struct mdt_thread_info *info)
         struct mdt_object      *child;
         struct mdt_lock_handle *lh;
         struct ldlm_reply      *ldlm_rep;
+        struct mdt_body        *repbody;
         struct lu_fid          *child_fid = &info->mti_tmp_fid1;
         struct md_attr         *ma = &info->mti_attr;
         struct lu_attr         *la = &ma->ma_attr;
@@ -609,6 +605,10 @@ int mdt_open(struct mdt_thread_info *info)
         OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_PAUSE_OPEN | OBD_FAIL_ONCE,
                          (obd_timeout + 1) / 4);
 
+        repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+        repbody->eadatasize = 0;
+        repbody->aclsize = 0;
+
         ma->ma_lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
         ma->ma_lmm_size = mdt->mdt_max_mdsize;
         ma->ma_need = MA_INODE | MA_LOV;
@@ -619,7 +619,7 @@ int mdt_open(struct mdt_thread_info *info)
         /* TODO: JOIN file */
         if (create_flags & MDS_OPEN_JOIN_FILE) {
                 CERROR("JOIN file will be supported soon\n");
-                RETURN(-EOPNOTSUPP);
+                GOTO(out, result = -EOPNOTSUPP);
         }
 
         CDEBUG(D_INODE, "I am going to create "DFID"/("DFID":%s) "
@@ -633,25 +633,26 @@ int mdt_open(struct mdt_thread_info *info)
                 result = mdt_open_by_fid(info, ldlm_rep);
 
                 if (result != -ENOENT)
-                        RETURN(result);
+                        GOTO(out, result);
 
                 /* We didn't find the correct object, so we
                  * need to re-create it via a regular replay. */
                 if (!(create_flags & MDS_OPEN_CREAT)) {
                         DEBUG_REQ(D_ERROR, req,"OPEN_CREAT not in open replay");
-                        RETURN(-EFAULT);
+                        GOTO(out, result = -EFAULT);
                 }
+                CERROR("RRRRPPPPPP failed, continue to regular open\n");
         }
 
         if (MDT_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK))
-                RETURN(-ENOMEM);
+                GOTO(out, result = -ENOMEM);
 
         mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD);
         if (rr->rr_name[0] == 0) {
                 /* this is cross-ref open */
                 mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
                 result = mdt_cross_open(info, rr->rr_fid1, ldlm_rep, create_flags);
-                RETURN(result);
+                GOTO(out, result);
         }
 
         lh = &info->mti_lh[MDT_LH_PARENT];
@@ -712,11 +713,6 @@ int mdt_open(struct mdt_thread_info *info)
                 result = mo_attr_get(info->mti_ctxt, 
                                      mdt_object_child(child), ma);
                 if (result == -EREMOTE) {
-                        struct mdt_body *repbody;
-
-                        repbody = req_capsule_server_get(&info->mti_pill,
-                                                         &RMF_MDT_BODY);
-
                         /* the object is on remote node
                          * return its FID for remote open */
                         repbody->fid1 = *mdt_object_fid(child);
@@ -744,6 +740,7 @@ out_child:
 out_parent:
         mdt_object_unlock_put(info, parent, lh, result);
 out:
+        mdt_shrink_reply(info, DLM_REPLY_REC_OFF + 1);
         return result;
 }
 
index 84c4b6c..a6a224e 100644 (file)
@@ -238,7 +238,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
                   rr->rr_name);
 
         if (MDT_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNLINK))
-                RETURN(-ENOENT);
+                GOTO(out, rc = -ENOENT);
 
         /* step 1: lock the parent */
         lhp = &info->mti_lh[MDT_LH_PARENT];
@@ -246,7 +246,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
         mp = mdt_object_find_lock(info, rr->rr_fid1, lhp,
                                   MDS_INODELOCK_UPDATE);
         if (IS_ERR(mp))
-                RETURN(PTR_ERR(mp));
+                GOTO(out, rc = PTR_ERR(mp));
 
         if (strlen(rr->rr_name) == 0) {
                 /* remote partial operation */
@@ -301,6 +301,7 @@ out_unlock_child:
         mdt_object_unlock_put(info, mc, lhc, rc);
 out_unlock_parent:
         mdt_object_unlock_put(info, mp, lhp, rc);
+out:
         mdt_shrink_reply(info, REPLY_REC_OFF + 1);
         return rc;
 }