Whamcloud - gitweb
handle NULL parent in open replay.
authorhuanghua <huanghua>
Mon, 11 Sep 2006 10:52:05 +0000 (10:52 +0000)
committerhuanghua <huanghua>
Mon, 11 Sep 2006 10:52:05 +0000 (10:52 +0000)
lustre/mdd/mdd_lov.c
lustre/mdt/mdt_open.c

index 6ad425b..ac7099e 100644 (file)
@@ -290,20 +290,22 @@ int mdd_lov_set_md(const struct lu_context *ctxt, struct mdd_object *pobj,
                 if (lmmp == NULL && lmm_size == 0) {
                         struct lov_mds_md *lmm = &mdd_ctx_info(ctxt)->mti_lmm;
                         int size = sizeof(lmm);
+
                         /* Get parent dir stripe and set */
-                        rc = mdd_get_md(ctxt, pobj, &lmm, &size,
-                                        MDS_LOV_MD_NAME);
+                        if (pobj != NULL)
+                                rc = mdd_get_md(ctxt, pobj, &lmm, &size,
+                                                MDS_LOV_MD_NAME);
                         if (rc > 0) {
                                 rc = mdd_xattr_set_txn(ctxt, child, lmm, size,
                                                MDS_LOV_MD_NAME, 0, handle);
                                 if (rc)
-                                        CERROR("error on copy stripe info: rc = %d\n",
-                                                rc);
+                                        CERROR("error on copy stripe info: rc "
+                                                "= %d\n", rc);
                         }
                 } else {
                        LASSERT(lmmp != NULL && lmm_size > 0);
-                        /* delete lmm */
-                       rc = mdd_lov_set_dir_md(ctxt, child, lmmp, lmm_size, handle);
+                       rc = mdd_lov_set_dir_md(ctxt, child, lmmp, 
+                                               lmm_size, handle);
                 }
         }
         CDEBUG(D_INFO, "Set lov md %p size %d for fid "DFID" rc %d\n",
index 67426d8..4ad6472 100644 (file)
@@ -82,7 +82,7 @@ static int mdt_create_data(struct mdt_thread_info *info,
         struct md_create_spec *spec = &info->mti_spec;
 
         ma->ma_need = MA_INODE | MA_LOV;
-        return mdo_create_data(info->mti_ctxt, mdt_object_child(p),
+        return mdo_create_data(info->mti_ctxt, p ? mdt_object_child(p) : NULL,
                                mdt_object_child(o), spec, ma);
 }
 
@@ -180,21 +180,26 @@ static void mdt_open_transno(struct mdt_thread_info* info)
         struct mdt_device *mdt = info->mti_mdt;
         struct ptlrpc_request *req = mdt_info_req(info);
 
-        if (info->mti_transno != 0)
+        if (info->mti_transno != 0) {
+                /* This request has created something, so we have transno */
+                CDEBUG(D_INODE, "open | create: transno = %llu,"
+                                " last_committed = %llu\n",
+                                info->mti_transno,
+                                req->rq_export->exp_obd->obd_last_committed);
                 return;
-
-        CDEBUG(D_INODE, "open transno = %llu, last_committed = %llu\n",
-               info->mti_transno,
-               req->rq_export->exp_obd->obd_last_committed);
+        }
 
         spin_lock(&mdt->mdt_transno_lock);
         info->mti_transno = ++ mdt->mdt_last_transno;
+        spin_unlock(&mdt->mdt_transno_lock);
+
+        CDEBUG(D_INODE, "open only: transno = %llu, last_committed = %llu\n",
+                        info->mti_transno,
+                        req->rq_export->exp_obd->obd_last_committed);
+
         req->rq_transno = info->mti_transno;
         lustre_msg_set_transno(req->rq_repmsg, info->mti_transno);
-        
         target_committed_to_req(req);
-        
-        spin_unlock(&mdt->mdt_transno_lock);
         lustre_msg_set_last_xid(req->rq_repmsg, req->rq_xid);
 }
 
@@ -265,7 +270,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                 ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill,
                                                        &RMF_MDT_MD,
                                                        RCL_SERVER);
-                /* TODO: handle REPLAY (p == NULL)*/
+                /* in replay case, p == NULL */
                 rc = mdt_create_data(info, p, o);
                 if (rc)
                         RETURN(rc);
@@ -319,9 +324,7 @@ static int mdt_mfd_open(struct mdt_thread_info *info,
                 spin_unlock(&med->med_open_lock);
 
                 repbody->handle.cookie = mfd->mfd_handle.h_cookie;
-                
                 mdt_open_transno(info);
-
         } else
                 rc = -ENOMEM;
         RETURN(rc);
@@ -508,46 +511,36 @@ out:
 }
 
 static int mdt_open_by_fid(struct mdt_thread_info* info, 
-                           const struct lu_fid *fid,
-                           struct ldlm_reply *rep, 
-                           __u32 flags)
+                           struct ldlm_reply *rep)
 {
-        struct md_attr    *ma = &info->mti_attr;
-        struct mdt_object *o;
-        int                rc;
+        __u32                    flags = info->mti_spec.sp_cr_flags;
+        struct mdt_reint_record *rr = &info->mti_rr;
+        struct md_attr          *ma = &info->mti_attr;
+        struct mdt_object       *o;
+        int                     rc;
         ENTRY;
 
-        o = mdt_object_find(info->mti_ctxt, info->mti_mdt, fid);
+        o = mdt_object_find(info->mti_ctxt, info->mti_mdt, rr->rr_fid2);
         if (IS_ERR(o)) 
                 RETURN(rc = PTR_ERR(o));
 
         rc = lu_object_exists(&o->mot_obj.mo_lu);
 
         if (rc > 0) {
-                /* successfully found the child object */
-                if (flags & MDS_OPEN_EXCL && flags & MDS_OPEN_CREAT)
-                        rc = -EEXIST;
-                else {
-                        const struct lu_context *ctxt = info->mti_ctxt;
-                        struct mdt_device *mdt = info->mti_mdt;
-
-                        spin_lock(&mdt->mdt_transno_lock);
-                        info->mti_transno = ++ mdt->mdt_last_transno;
-                        spin_unlock(&mdt->mdt_transno_lock);
-                        
-                        mdt_set_disposition(info, rep, DISP_LOOKUP_EXECD);
-                        mdt_set_disposition(info, rep, DISP_LOOKUP_POS);
-                        rc = mo_attr_get(ctxt, mdt_object_child(o), ma);
-                        if (rc == 0)
-                                rc = mdt_mfd_open(info, NULL, o, flags, 0, rep);
-                } 
+                const struct lu_context *ctxt = info->mti_ctxt;
+
+                mdt_set_disposition(info, rep, DISP_LOOKUP_EXECD);
+                mdt_set_disposition(info, rep, DISP_LOOKUP_POS);
+                rc = mo_attr_get(ctxt, mdt_object_child(o), ma);
+                if (rc == 0)
+                        rc = mdt_mfd_open(info, NULL, o, flags, 0, rep);
         } else if (rc == 0) {
                 rc = -ENOENT;
         } else  {
                 /* the child object was created on remote server */
                 struct mdt_body *repbody;
                 repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-                repbody->fid1 = *fid;
+                repbody->fid1 = *rr->rr_fid2;
                 repbody->valid |= (OBD_MD_FLID | OBD_MD_MDS);
                 rc = 0;
         }
@@ -638,8 +631,7 @@ int mdt_open(struct mdt_thread_info *info)
 
         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
                 /* this is a replay request. */
-                result = mdt_open_by_fid(info, rr->rr_fid2, ldlm_rep, 
-                                         create_flags);
+                result = mdt_open_by_fid(info, ldlm_rep);
 
                 if (result != -ENOENT)
                         RETURN(result);