Whamcloud - gitweb
fixed some defects after DLD.
authorhuanghua <huanghua>
Mon, 10 Jul 2006 09:08:33 +0000 (09:08 +0000)
committerhuanghua <huanghua>
Mon, 10 Jul 2006 09:08:33 +0000 (09:08 +0000)
lustre/mdt/mdt_open.c

index d274b37..38cd18d 100644 (file)
@@ -209,7 +209,7 @@ int mdt_reint_open(struct mdt_thread_info *info)
         struct ldlm_reply      *ldlm_rep;
         struct ptlrpc_request  *req = mdt_info_req(info);
         struct mdt_body        *body;
-        struct lu_fid           child_fid;
+        struct lu_fid          *child_fid = &info->mti_tmp_fid1;
         int                     result;
         int                     created = 0;
         struct mdt_reint_record *rr = &info->mti_rr;
@@ -232,21 +232,27 @@ int mdt_reint_open(struct mdt_thread_info *info)
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
                 GOTO(out, result = PTR_ERR(parent));
         }
+
+        intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
         result = mdo_lookup(info->mti_ctxt, mdt_object_child(parent),
-                            rr->rr_name, &child_fid);
+                            rr->rr_name, child_fid);
         if (result && result != -ENOENT) {
+                if (result == -EREMOTE) {
+                        /* FIXME: POS or NEG? */
+                        intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
+                        body->fid1 = *child_fid;
+                        body->valid |= OBD_MD_FLID;
+                }
                 GOTO(out_parent, result);
         }
 
-        intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
-
         if (result == -ENOENT) {
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
                 if (!(info->mti_attr.la_flags & MDS_OPEN_CREAT))
                         GOTO(out_parent, result);
                 if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
                         GOTO(out_parent, result = -EROFS);
-                child_fid = *info->mti_rr.rr_fid2;
+                *child_fid = *info->mti_rr.rr_fid2;
         } else {
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
                 if (info->mti_attr.la_flags & MDS_OPEN_EXCL &&
@@ -255,7 +261,7 @@ int mdt_reint_open(struct mdt_thread_info *info)
 
         }
 
-        child = mdt_object_find(info->mti_ctxt, mdt, &child_fid);
+        child = mdt_object_find(info->mti_ctxt, mdt, child_fid);
         if (IS_ERR(child))
                 GOTO(out_parent, result = PTR_ERR(child));
 
@@ -339,28 +345,35 @@ int mdt_close(struct mdt_thread_info *info)
         list_del_init(&mfd->mfd_list);
         spin_unlock(&med->med_open_lock);
 
-        o = mfd->mfd_object;
-        repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-        lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
+        /* mdt_handle2mfd increase reference count, we must drop it here */
+        mdt_mfd_put(mfd);
 
-        rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o),
-                         &info->mti_attr);
-        if (rc == 0) {
-                mdt_pack_attr2body(repbody, &info->mti_attr, mdt_object_fid(o));
+        o = mfd->mfd_object;
+        if (lu_object_is_dying(&o->mot_header)) {
+                repbody = req_capsule_server_get(&info->mti_pill, 
+                                                 &RMF_MDT_BODY);
+                lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
+
+                rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o),
+                                 &info->mti_attr);
+                if (rc == 0) {
+                        mdt_pack_attr2body(repbody, &info->mti_attr, 
+                                           mdt_object_fid(o));
 /*
-                rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
-                                  lmm, info->mti_mdt->mdt_max_mdsize, "lov");
-                if (rc >= 0) {
-                        if (S_ISDIR(info->mti_attr.la_mode))
-                                repbody->valid |= OBD_MD_FLDIREA;
-                        else
-                                repbody->valid |= OBD_MD_FLEASIZE;
-                        repbody->eadatasize = rc;
-                        rc = 0;
-                }
+                        rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
+                                          lmm, info->mti_mdt->mdt_max_mdsize, 
+                                          XATTR_NAME_LOV);
+                        if (rc >= 0) {
+                                if (S_ISDIR(info->mti_attr.la_mode))
+                                        repbody->valid |= OBD_MD_FLDIREA;
+                                else
+                                        repbody->valid |= OBD_MD_FLEASIZE;
+                                repbody->eadatasize = rc;
+                                rc = 0;
+                        }
 */
+               }
         }
-
         rc = mdt_mfd_close(info->mti_ctxt, mfd, 1);
 
         RETURN(rc);