Whamcloud - gitweb
(1)fix some defects found in inspection.
authorhuanghua <huanghua>
Fri, 7 Jul 2006 03:45:47 +0000 (03:45 +0000)
committerhuanghua <huanghua>
Fri, 7 Jul 2006 03:45:47 +0000 (03:45 +0000)
(2)disabled mdt_fs operation, waiting for read & write of osd.

lustre/include/lu_object.h
lustre/mdt/mdt_fs.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_reint.c
lustre/mdt/mdt_xattr.c

index c3993ec..9ee5988 100644 (file)
@@ -337,10 +337,8 @@ struct lu_attr {
         __u32          la_flags;  /* object flags */
         __u32          la_nlink;  /* number of persistent references to this
                                    * object */
-#ifdef MDT_CODE
         __u32          la_rdev;   /* real device */
-        __u64          la_valid;   /* real device */
-#endif
+        __u64          la_valid;  /* valid bits */
 };
 
 
index 239c578..484fc84 100644 (file)
@@ -400,8 +400,8 @@ int mdt_fs_setup(const struct lu_context *ctxt,
                         mdt->mdt_last = NULL;
                 }
         } else {
-                CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc);
                 rc = PTR_ERR(last);
+                CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc);
         }
         return rc;
 }
index 9536238..d4f4aba 100644 (file)
@@ -10,6 +10,7 @@
  *   Author: Phil Schwan <phil@clusterfs.com>
  *   Author: Mike Shaver <shaver@clusterfs.com>
  *   Author: Nikita Danilov <nikita@clusterfs.com>
+ *   Author: Huang Hua <huanghua@clusterfs.com>
  *
  *   This file is part of the Lustre file system, http://www.lustre.org
  *   Lustre is a trademark of Cluster File Systems, Inc.
@@ -173,14 +174,13 @@ void mdt_pack_attr2body(struct mdt_body *b, struct lu_attr *attr)
         b->nlink      = attr->la_nlink;
 }
 
-static int mdt_getattr_pack_msg(struct mdt_thread_info *info)
+static int mdt_getattr_pack_msg(struct mdt_thread_info *info, 
+                                struct mdt_object *o)
 {
-#ifdef MDT_CODE
         const struct mdt_body *body = info->mti_body;
         struct req_capsule *pill = &info->mti_pill;
         struct ptlrpc_request *req = mdt_info_req(info);
-#endif
-        struct md_object *next = mdt_object_child(info->mti_object);
+        struct md_object *next = mdt_object_child(o);
         struct lu_attr *la = &info->mti_attr;
         int rc;
         ENTRY;
@@ -189,36 +189,32 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info)
         if (rc){
                 RETURN(rc);
         }
-#ifdef MDT_CODE
         if ((S_ISREG(la->la_mode) && (body->valid & OBD_MD_FLEASIZE)) ||
             (S_ISDIR(la->la_mode) && (body->valid & OBD_MD_FLDIREA))) {
                 rc = mo_xattr_get(info->mti_ctxt, next, NULL, 0, "lov");
 
                 CDEBUG(D_INODE, "got %d bytes MD data for object "DFID3"\n",
-                       rc, PFID3(mdt_object_fid(info->mti_object)));
+                       rc, PFID3(mdt_object_fid(o)));
                 if (rc < 0) {
-                        if (rc != -ENODATA) {
+                        if (rc != -ENODATA && rc != -EOPNOTSUPP) {
                                 CERROR("error getting MD "DFID3": rc = %d\n",
-                                       PFID3(mdt_object_fid(info->mti_object)),
+                                       PFID3(mdt_object_fid(o)),
                                        rc);
                                 RETURN(rc);
                         }
-                        req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0);
+                        rc = 0;
                 } else if (rc > MAX_MD_SIZE) {
-                        req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0);
                         CERROR("MD size %d larger than maximum possible %u\n",
                                rc, MAX_MD_SIZE);
-                } else {
-                        req_capsule_set_size(pill, &RMF_MDT_MD,
-                                             RCL_SERVER, rc);
+                        rc = 0;
                 }
         } else if (S_ISLNK(la->la_mode) && (body->valid & OBD_MD_LINKNAME)) {
-                /* XXX:It also uese the mdt_md to hold symname.
+                /* XXX:It also uses the mdt_md to hold symname.
                  * Are there any problem? will be swabbed? hope not.
                  */
-                int len = min_t(int, la->la_size + 1, body->eadatasize);
-                req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, len);
+                rc = min_t(int, la->la_size + 1, body->eadatasize);
         }
+        req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, rc);
 
 #ifdef CONFIG_FS_POSIX_ACL
         if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
@@ -227,17 +223,15 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info)
                 rc = mo_xattr_get(info->mti_ctxt, next,
                                   NULL, 0, XATTR_NAME_ACL_ACCESS);
                 if (rc < 0) {
-                        if (rc != -ENODATA) {
+                        if (rc != -ENODATA && rc != -EOPNOTSUPP) {
                                 CERROR("got acl size: %d\n", rc);
                                 RETURN(rc);
                         }
-                        req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, 0);
-                } else
-                        req_capsule_set_size(pill, &RMF_EADATA,
-                                             RCL_SERVER, rc);
+                        rc = 0;
+                } 
+                req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
         }
 #endif
-#endif
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
                 CERROR("failed MDT_GETATTR_PACK test\n");
                 RETURN(-ENOMEM);
@@ -245,24 +239,22 @@ static int mdt_getattr_pack_msg(struct mdt_thread_info *info)
         rc = req_capsule_pack(&info->mti_pill);
         if (rc) {
                 CERROR("lustre_pack_reply failed: rc %d\n", rc);
-                RETURN(rc);
         }
 
-        RETURN(0);
+        RETURN(rc);
 }
 
-static int mdt_getattr_internal(struct mdt_thread_info *info)
+static int mdt_getattr_internal(struct mdt_thread_info *info,
+                                struct mdt_object *o)
 {
-        struct md_object *next = mdt_object_child(info->mti_object);
+        struct md_object *next = mdt_object_child(o);
         const struct mdt_body  *reqbody = info->mti_body;
         struct mdt_body  *repbody;
         struct lu_attr *la = &info->mti_attr;
         int rc;
-#ifdef MDT_CODE
         void *buffer;
         int length;
         struct ptlrpc_request *req = mdt_info_req(info);
-#endif
         ENTRY;
 
         rc = mo_attr_get(info->mti_ctxt, next, la);
@@ -274,10 +266,9 @@ static int mdt_getattr_internal(struct mdt_thread_info *info)
 
         repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
         mdt_pack_attr2body(repbody, la);
-        repbody->fid1 = *mdt_object_fid(info->mti_object);
+        repbody->fid1 = *mdt_object_fid(o);
         repbody->valid |= OBD_MD_FLID;
 
-#ifdef MDT_CODE
         buffer = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
         length = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD,
                                       RCL_SERVER);
@@ -330,7 +321,7 @@ static int mdt_getattr_internal(struct mdt_thread_info *info)
                                   buffer, length, XATTR_NAME_ACL_ACCESS);
 
                 if (rc < 0) {
-                        if (rc != -ENODATA) {
+                        if (rc != -ENODATA && rc != -EOPNOTSUPP) {
                                 CERROR("got acl size: %d\n", rc);
                                 RETURN(rc);
                         }
@@ -340,7 +331,6 @@ static int mdt_getattr_internal(struct mdt_thread_info *info)
                 repbody->valid |= OBD_MD_FLACL;
         }
 #endif
-#endif
         RETURN(0);
 }
 
@@ -357,9 +347,9 @@ static int mdt_getattr(struct mdt_thread_info *info)
                 CERROR(LUSTRE_MDT0_NAME": getattr lustre_pack_reply failed\n");
                 result = -ENOMEM;
         } else {
-                result = mdt_getattr_pack_msg(info);
+                result = mdt_getattr_pack_msg(info, info->mti_object);
                 if (result == 0)
-                        result = mdt_getattr_internal(info);
+                        result = mdt_getattr_internal(info, info->mti_object);
         }
         RETURN(result);
 }
@@ -400,6 +390,22 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
 
         /*step 2: lookup child's fid by name */
         result = mdo_lookup(info->mti_ctxt, next, name, &child_fid);
+        if (result == -EREMOTE) {
+                /* This object is located on remote node */
+                req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD, 
+                                     RCL_SERVER, 0);
+#ifdef CONFIG_FS_POSIX_ACL
+                req_capsule_set_size(&info->mti_pill, &RMF_EADATA, 
+                                     RCL_SERVER, 0);
+#endif
+                result = req_capsule_pack(&info->mti_pill);
+                if (result == 0) {
+                        struct mdt_body *repbody;
+                        repbody = req_capsule_server_get(&info->mti_pill, 
+                                                         &RMF_MDT_BODY);
+                        repbody->fid1 = child_fid;
+                }
+        } 
         if (result != 0)
                 GOTO(out_parent, result);
 
@@ -411,9 +417,9 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
                 GOTO(out_parent, result = PTR_ERR(child));
 
         /* finally, we can get attr for child. */
-        result = mdt_getattr_pack_msg(info);
+        result = mdt_getattr_pack_msg(info, child);
         if (result == 0) {
-                result = mdt_getattr_internal(info);
+                result = mdt_getattr_internal(info, child);
         }
         if (result != 0)
                 mdt_object_unlock(ns, child, lhc);
@@ -488,19 +494,7 @@ static int mdt_reint_internal(struct mdt_thread_info *info, __u32 op)
 
         rc = mdt_reint_unpack(info, op);
         if (rc == 0) {
-                struct mdt_reint_reply *rep;
-
-                rep = &info->mti_reint_rep;
-                rep->mrr_body = req_capsule_server_get(&info->mti_pill,
-                                                       &RMF_MDT_BODY);
-                if (rep->mrr_body != NULL)
-                        /*
-                         * XXX fill other fields in @rep with pointers to
-                         * reply buffers.
-                         */
-                        rc = mdt_reint_rec(info);
-                else
-                        rc = -EFAULT;
+                rc = mdt_reint_rec(info);
         }
 
         RETURN(rc);
@@ -1443,14 +1437,16 @@ static int mdt_intent_getattr(enum mdt_it_code opcode,
         intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
 
         if (rc) {
-                intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
+                if (rc == -EREMOTE)
+                        intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
+                else
+                        intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
                 if (ldlm_rep)
                         ldlm_rep->lock_policy_res2 = 0;
                 RETURN(ELDLM_LOCK_ABORTED);
         }
-        else
-                intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
 
+        intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
 
         new_lock = ldlm_handle2lock(&lhc.mlh_lh);
         if (new_lock == NULL && (flags & LDLM_FL_INTENT_ONLY))
@@ -2019,8 +2015,9 @@ static void mdt_fini(const struct lu_context *ctx, struct mdt_device *m)
 
         ENTRY;
         
+/*
         mdt_fs_cleanup(ctx, m);
-
+*/
         mdt_stop_ptlrpc_service(m);
 
         /* finish the stack */
@@ -2067,6 +2064,13 @@ static int mdt_init0(const struct lu_context *ctx, struct mdt_device *m,
         m->mdt_max_mdsize = MAX_MD_SIZE;
         m->mdt_max_cookiesize = sizeof(struct llog_cookie);
 
+        m->mdt_flags = 0;
+
+        /* Temporary. should parse mount option. */
+        m->mdt_opts.mo_user_xattr = 0;
+        m->mdt_opts.mo_acl = 0;
+
+
         OBD_ALLOC_PTR(s);
         if (s == NULL)
                 RETURN(-ENOMEM);
@@ -2109,14 +2113,16 @@ static int mdt_init0(const struct lu_context *ctx, struct mdt_device *m,
         rc = mdt_start_ptlrpc_service(m);
         if (rc)
                 GOTO(err_free_ns, rc);
-
+/* TODO: wait for read & write
         rc = mdt_fs_setup(ctx, m);
         if (rc)
                 GOTO(err_stop_service, rc);
-
+*/
         RETURN(0);
+/*
 err_stop_service:
         mdt_stop_ptlrpc_service(m);
+*/
 err_free_ns:
         ldlm_namespace_free(m->mdt_namespace, 0);
         m->mdt_namespace = NULL;
@@ -2130,6 +2136,7 @@ err_fini_site:
         lu_site_fini(s);
 err_free_site:
         OBD_FREE_PTR(s);
+        md_device_fini(&m->mdt_md_dev);
         return (rc);
 }
 
@@ -2346,6 +2353,7 @@ static int mdt_obd_disconnect(struct obd_export *exp)
         RETURN(rc);
 }
 
+/* FIXME: Can we avoid using these two interfaces? */
 static int mdt_init_export(struct obd_export *exp)
 {
         struct mdt_export_data *med = &exp->exp_mdt_data;
@@ -2646,10 +2654,10 @@ static struct mdt_opc_slice mdt_handlers[] = {
 };
 
 MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
-MODULE_DESCRIPTION("Lustre Meta-data Target Prototype ("LUSTRE_MDT0_NAME")");
+MODULE_DESCRIPTION("Lustre Meta-data Target ("LUSTRE_MDT0_NAME")");
 MODULE_LICENSE("GPL");
 
 CFS_MODULE_PARM(mdt_num_threads, "ul", ulong, 0444,
                 "number of mdt service threads to start");
 
-cfs_module(mdt, "0.0.4", mdt_mod_init, mdt_mod_exit);
+cfs_module(mdt, "0.1.0", mdt_mod_init, mdt_mod_exit);
index 0e83c69..ee6ada9 100644 (file)
@@ -182,11 +182,6 @@ struct mdt_reint_record {
 
 };
 
-struct mdt_reint_reply {
-        struct mdt_body    *mrr_body;
-        struct lov_mds_md  *mrr_md;
-        struct llog_cookie *mrr_cookie;
-};
 
 #define XATTR_NAME_ACL_ACCESS   "system.posix_acl_access"
 
@@ -245,7 +240,6 @@ struct mdt_thread_info {
          * frequent.
          */
         struct kstatfs             mti_sfs;
-        struct mdt_reint_reply     mti_reint_rep;
 };
 
 static inline struct md_device_operations *mdt_child_ops(struct mdt_device * m)
index cf022d7..c574855 100644 (file)
@@ -44,7 +44,6 @@
 /* unpacking */
 static int mdt_setattr_unpack(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_rec_setattr *rec;
         struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
@@ -82,9 +81,6 @@ static int mdt_setattr_unpack(struct mdt_thread_info *info)
         }
 
         RETURN(0);
-#endif
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 static int mdt_create_unpack(struct mdt_thread_info *info)
@@ -102,15 +98,14 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
                 rr->rr_fid2 = &rec->cr_fid2;
                 attr->la_mode = rec->cr_mode;
                 rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
-#ifdef MDT_CODE
                 attr->la_rdev  = rec->cr_rdev;
                 attr->la_uid   = rec->cr_fsuid;
                 attr->la_gid   = rec->cr_fsgid;
                 attr->la_flags = rec->cr_flags;
                 attr->la_ctime = rec->cr_time;
+                attr->la_mtime = rec->cr_time;
                 if (req_capsule_field_present(pill, &RMF_SYMTGT))
                         rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT);
-#endif
         } else
                 result = -EFAULT;
         RETURN(result);
@@ -118,7 +113,6 @@ static int mdt_create_unpack(struct mdt_thread_info *info)
 
 static int mdt_link_unpack(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_rec_link *rec;
         struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
@@ -134,19 +128,16 @@ static int mdt_link_unpack(struct mdt_thread_info *info)
         rr->rr_fid1 = &rec->lk_fid1;
         rr->rr_fid2 = &rec->lk_fid2;
         attr->la_ctime = rec->lk_time;
+        attr->la_mtime = rec->lk_time;
 
         rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
         if (rr->rr_name == NULL)
                 RETURN(-EFAULT);
         RETURN(0);
-#endif
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 static int mdt_unlink_unpack(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_rec_unlink *rec;
         struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
@@ -162,20 +153,17 @@ static int mdt_unlink_unpack(struct mdt_thread_info *info)
         rr->rr_fid1 = &rec->ul_fid1;
         rr->rr_fid2 = &rec->ul_fid2;
         attr->la_ctime = rec->ul_time;
+        attr->la_mtime = rec->ul_time;
         attr->la_mode  = rec->ul_mode;
 
         rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
         if (rr->rr_name == NULL)
                 RETURN(-EFAULT);
         RETURN(0);
-#endif
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 static int mdt_rename_unpack(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_rec_rename *rec;
         struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
@@ -191,6 +179,7 @@ static int mdt_rename_unpack(struct mdt_thread_info *info)
         rr->rr_fid1 = &rec->rn_fid1;
         rr->rr_fid2 = &rec->rn_fid2;
         attr->la_ctime = rec->rn_time;
+        attr->la_mtime = rec->rn_time;
 
         rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
         if (rr->rr_name == NULL)
@@ -199,10 +188,6 @@ static int mdt_rename_unpack(struct mdt_thread_info *info)
         if (rr->rr_tgt == NULL)
                 RETURN(-EFAULT);
         RETURN(0);
-#endif
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 static int mdt_open_unpack(struct mdt_thread_info *info)
index 79b98bc..51d4d70 100644 (file)
@@ -43,12 +43,14 @@ static int mdt_md_create(struct mdt_thread_info *info)
         struct mdt_object      *parent;
         struct mdt_object      *child;
         struct mdt_lock_handle *lh;
-        struct mdt_body        *repbody = info->mti_reint_rep.mrr_body;
+        struct mdt_body        *repbody;
         struct lu_attr         *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
         int rc;
         ENTRY;
 
+        repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+
         lh = &info->mti_lh[MDT_LH_PARENT];
         lh->mlh_mode = LCK_PW;
 
@@ -82,49 +84,17 @@ static int mdt_md_create(struct mdt_thread_info *info)
         RETURN(rc);
 }
 
-#if 0
-static int mdt_md_mkdir(struct mdt_thread_info *info)
-{
-        struct mdt_device      *mdt = info->mti_mdt;
-        struct mdt_object      *parent;
-        struct mdt_object      *child;
-        struct mdt_lock_handle *lh;
-
-        int result;
-
-        lh = &info->mti_lh[MDT_LH_PARENT];
-        lh->mlh_mode = LCK_PW;
-
-        parent = mdt_object_find_lock(info->mti_ctxt, mdt, info->mti_rr.rr_fid1,
-                                      lh, MDS_INODELOCK_UPDATE);
-        if (IS_ERR(parent))
-                return PTR_ERR(parent);
-
-        child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2);
-        if (!IS_ERR(child)) {
-                struct md_object *next = mdt_object_child(parent);
-
-                result = mdo_create(info->mti_ctxt, next, info->mti_rr.rr_name,
-                                    mdt_object_child(child), &info->mti_attr);
-                mdt_object_put(info->mti_ctxt, child);
-        } else
-                result = PTR_ERR(child);
-        mdt_object_unlock(mdt->mdt_namespace, parent, lh);
-        mdt_object_put(info->mti_ctxt, parent);
-        return result;
-}
-#endif
-
 /* partial request to create object only */
 static int mdt_md_mkobj(struct mdt_thread_info *info)
 {
         struct mdt_device      *mdt = info->mti_mdt;
         struct mdt_object      *o;
-        struct mdt_body        *repbody = info->mti_reint_rep.mrr_body;
+        struct mdt_body        *repbody;
         int rc;
-
         ENTRY;
 
+        repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+
         o = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid1);
         if (!IS_ERR(o)) {
                 struct md_object *next = mdt_object_child(o);
@@ -152,7 +122,6 @@ static int mdt_md_mkobj(struct mdt_thread_info *info)
 
 static int mdt_reint_setattr(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
         struct ptlrpc_request *req = mdt_info_req(info);
@@ -234,9 +203,6 @@ out_unlock:
         }
         mdt_object_put(info->mti_ctxt, mo);
         return (rc);
-#endif
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 
@@ -271,8 +237,6 @@ static int mdt_reint_create(struct mdt_thread_info *info)
 
 static int mdt_reint_unlink(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
-        struct lu_attr *attr = &info->mti_attr;
         struct mdt_reint_record *rr = &info->mti_rr;
         struct ptlrpc_request *req = mdt_info_req(info);
         struct mdt_object *mp;
@@ -321,46 +285,11 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
         if (IS_ERR(mc))
                 GOTO(out_unlock_parent, rc = PTR_ERR(mc));
 
-        if (lu_object_assert_not_exists(info->mti_ctxt, &mc->mot_obj.mo_lu))
-                GOTO(out_unlock_child, rc = -ENOENT);
-
         /* NB: Be aware of Bug 2029 */
         
         /*step 3: deal with orphan */
 
-        /* If this is potentially the last reference to this inode, get the
-         * OBD EA data first so the client can destroy OST objects.  We
-         * only do the object removal later if no open files/links remain. */
-
         repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-        rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mc), attr);
-        if (rc != 0)
-                GOTO(out_unlock_child, rc);
-
-        if (S_ISREG(attr->la_mode) && attr->la_nlink == 1) {
-                /* && if opencount == 0*/
-                /* see mds_reint */
-                void * lmm = req_capsule_server_get(&info->mti_pill,
-                                     &RMF_MDT_MD);
-                int len = req_capsule_get_size(&info->mti_pill,
-                                               &RMF_MDT_MD,
-                                               RCL_SERVER);
-                mdt_pack_attr2body(repbody, attr);
-                repbody->fid1 = *mdt_object_fid(mc);
-                repbody->valid |= OBD_MD_FLID;
-
-                rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(mc),
-                                  lmm, len, "lov");
-                if (rc < 0)
-                        GOTO(out_unlock_child, rc);
-
-                if (S_ISDIR(attr->la_mode))
-                        repbody->valid |= OBD_MD_FLDIREA;
-                else
-                        repbody->valid |= OBD_MD_FLEASIZE;
-                repbody->eadatasize = rc;
-                rc = 0;
-        }
 
         if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
                 GOTO(out_unlock_child, rc = -EROFS);
@@ -371,6 +300,10 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
 
         /*step 5: orphan handling & recovery issue */
         if (rc == 0) {
+        /* If this is potentially the last reference to this inode, get the
+         * OBD EA data first so the client can destroy OST objects.  We
+         * only do the object removal later if no open files/links remain. */
+
                 /* FIXME & TODO:
                  * 1. orphan handling here
                  * 2. Please deal with logcookies here */ 
@@ -383,15 +316,10 @@ out_unlock_parent:
         mdt_object_unlock(info->mti_mdt->mdt_namespace, mp, lhp);
         mdt_object_put(info->mti_ctxt, mp);
         return rc;
-#endif
-
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 static int mdt_reint_link(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_reint_record *rr = &info->mti_rr;
         struct ptlrpc_request *req = mdt_info_req(info);
         struct mdt_object *ms;
@@ -431,11 +359,6 @@ static int mdt_reint_link(struct mdt_thread_info *info)
         if (IS_ERR(mt))
                 GOTO(out_unlock_source, rc = PTR_ERR(mt));
 
-        /* step 3: do some checking :TODO*/
-        /* if isorphan(ms)
-         *      return -ENOENT
-         */
-
         if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
                 GOTO(out_unlock_target, rc = -EROFS);
 
@@ -443,6 +366,7 @@ static int mdt_reint_link(struct mdt_thread_info *info)
         rc = mdo_link(info->mti_ctxt, mdt_object_child(mt),
                       mdt_object_child(ms), rr->rr_name);
         GOTO(out_unlock_target, rc);
+
 out_unlock_target:
         mdt_object_unlock(info->mti_mdt->mdt_namespace, mt, lht);
         mdt_object_put(info->mti_ctxt, mt);
@@ -450,13 +374,8 @@ out_unlock_source:
         mdt_object_unlock(info->mti_mdt->mdt_namespace, ms, lhs);
         mdt_object_put(info->mti_ctxt, ms);
         return rc;
-#endif
-
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
-#ifdef MDT_CODE
 /* partial operation for rename */
 static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
 {
@@ -472,7 +391,7 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
 
         ENTRY;
 
-        DEBUG_REQ(D_INODE, req, "rename_tgr "DFID3" to "DFID3" %s",
+        DEBUG_REQ(D_INODE, req, "rename_tgt "DFID3" to "DFID3" %s",
                   PFID3(rr->rr_fid2),
                   PFID3(rr->rr_fid1), rr->rr_tgt);
 
@@ -490,6 +409,9 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
                         rr->rr_tgt, &tgt_fid);
         if (rc && rc != -ENOENT)
                 GOTO(out_unlock_tgtdir, rc);
+
+        if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
+                GOTO(out_unlock_tgt, rc = -EROFS);
         
         if (rc == 0) {
                 lh_tgt = &info->mti_lh[MDT_LH_CHILD];
@@ -502,9 +424,6 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
                         GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
         }
         
-        if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
-                GOTO(out_unlock_tgt, rc = -EROFS);
-
         /* step 3: rename_tgt or name_insert */
         if (mtgt)
                 rc = mdo_rename_tgt(info->mti_ctxt, mdt_object_child(mtgtdir),
@@ -513,8 +432,8 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
         else
                 rc = mdo_name_insert(info->mti_ctxt, mdt_object_child(mtgtdir),
                                      rr->rr_tgt, rr->rr_fid2);
-                                     
         GOTO(out_unlock_tgt, rc);
+
 out_unlock_tgt:
         if (mtgt) {
                 mdt_object_unlock(ns, mtgt, lh_tgt);
@@ -526,12 +445,10 @@ out_unlock_tgtdir:
 out:
         return rc;
 }
-#endif
 
 
 static int mdt_reint_rename(struct mdt_thread_info *info)
 {
-#ifdef MDT_CODE
         struct mdt_reint_record *rr = &info->mti_rr;
         struct req_capsule *pill = &info->mti_pill;
         struct ptlrpc_request *req = mdt_info_req(info);
@@ -550,7 +467,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info)
 
         ENTRY;
 
-        DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3" %s",
+        DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3"/%s",
                   PFID3(rr->rr_fid1), rr->rr_tgt,
                   PFID3(rr->rr_fid2), rr->rr_name);
 
@@ -579,7 +496,6 @@ static int mdt_reint_rename(struct mdt_thread_info *info)
                                        MDS_INODELOCK_UPDATE);
         if (IS_ERR(mtgtdir))
                 GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
-
         
         /*step 3: find & lock the old object*/
         rc = mdo_lookup(info->mti_ctxt, mdt_object_child(msrcdir),
@@ -601,8 +517,8 @@ static int mdt_reint_rename(struct mdt_thread_info *info)
         if (rc && rc != -ENOENT)
                 GOTO(out_unlock_old, rc);
 
-        /* NB: the new_fid may be zero at this moment*/
         if (rc == 0) { 
+                /* the new_fid should have been filled at this moment*/
                 lh_new.mlh_mode = LCK_EX;
                 mnew = mdt_object_find_lock(info->mti_ctxt, info->mti_mdt,
                                             &new_fid, &lh_new, 
@@ -611,9 +527,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info)
                         GOTO(out_unlock_old, rc = PTR_ERR(mnew));
         }
 
-        /* step 5:TODO orphan handling on new object*/
-        /* if isorphan(mnew) {...}
-         */
+        /* step 5: dome some checking*/
         if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
                 GOTO(out_unlock_new, rc = -EROFS);
 
@@ -622,7 +536,13 @@ static int mdt_reint_rename(struct mdt_thread_info *info)
                         mdt_object_child(mtgtdir), &old_fid,
                         rr->rr_name, mnew ? mdt_object_child(mnew): NULL,
                         rr->rr_tgt);
-        GOTO(out_unlock_new, rc);
+        if (rc)
+                GOTO(out_unlock_new, rc);
+
+        /* step 7: TODO:check old object */
+        /* if (mold is orphan)
+         */
+
 out_unlock_new:
         if (mnew) {
                 mdt_object_unlock(ns, mnew, &lh_new);
@@ -639,11 +559,6 @@ out_unlock_source:
         mdt_object_put(info->mti_ctxt, msrcdir);
 out:
         return rc;
-#endif
-
-
-        ENTRY;
-        RETURN(-EOPNOTSUPP);
 }
 
 
index c925cfa..f17339e 100644 (file)
@@ -1,8 +1,8 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- *  linux/mdt/mdt_reint.c
- *  Lustre Metadata Target (mdt) reintegration routines
+ *  linux/mdt/mdt_xattr.c
+ *  Lustre Metadata Target (mdt) extended attributes management.
  *
  *  Copyright (C) 2002-2006 Cluster File Systems, Inc.
  *   Author: Peter Braam <braam@clusterfs.com>
 /* return EADATA length to the caller. negative value means error */
 static int mdt_getxattr_pack_reply(struct mdt_thread_info * info)
 {
-        char *xattr_name;
-        int rc = -EOPNOTSUPP;
-        int rc2;
         struct req_capsule *pill = &info->mti_pill ;
         struct ptlrpc_request *req = mdt_info_req(info);
+        char *xattr_name;
+        int rc;
 
         /* Imagine how many bytes we need */
         if (info->mti_body->valid & OBD_MD_FLXATTR) {
@@ -71,23 +70,22 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info)
         }
 
         if (rc < 0) {
-                if (rc != -ENODATA && rc != -EOPNOTSUPP)
+                if (rc != -ENODATA && rc != -EOPNOTSUPP) {
                         CWARN("get EA size error: %d\n", rc);
-                /* return empty to client */
-                req_capsule_extend(&info->mti_pill, &RQF_MDS_SETXATTR);
+                        return rc;
+                }
+                rc = 0;
         } else {
                 rc =  min_t(int, info->mti_body->eadatasize, rc);
-                req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
         }
+        req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) {
                 CERROR("failed MDS_GETXATTR_PACK test\n");
                 return -ENOMEM;
         }
 
-        rc2 = req_capsule_pack(pill);
-        if (rc2)
-                return rc2;
+        rc = req_capsule_pack(pill);
         return rc;
 }
 
@@ -117,12 +115,11 @@ int mdt_getxattr(struct mdt_thread_info *info)
         rc = mdt_getxattr_pack_reply(info);
         if (rc < 0)
                 RETURN(rc);
-        buf = req_capsule_server_get(&info->mti_pill,
-                                     &RMF_EADATA);
-        buflen = req_capsule_get_size(&info->mti_pill,
-                                      &RMF_EADATA, RCL_SERVER);
-        rep_body = req_capsule_server_get(&info->mti_pill,
-                                          &RMF_MDT_BODY);
+        buf = req_capsule_server_get(&info->mti_pill, &RMF_EADATA);
+        rep_body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+        buflen = req_capsule_get_size(&info->mti_pill, &RMF_EADATA, RCL_SERVER);
+        if (buflen == 0)
+                GOTO(no_xattr, rc = 0);
 
         if (info->mti_body->valid & OBD_MD_FLXATTR) {
                 char *xattr_name = req_capsule_client_get(&info->mti_pill, 
@@ -145,6 +142,7 @@ int mdt_getxattr(struct mdt_thread_info *info)
                 LBUG();
 
         if (rc >= 0) {
+no_xattr:
                 rep_body->eadatasize = rc;
                 rc = 0;
         }
@@ -163,19 +161,12 @@ int mdt_setxattr(struct mdt_thread_info *info)
         struct mdt_lock_handle *lh;
         ENTRY;
 
-        lh = &info->mti_lh[MDT_LH_PARENT];
-        lh->mlh_mode = LCK_EX;
 
-/*        if (req->rq_reqmsg->bufcount < 2)
- *                RETURN(-EFAULT);
- */
         DEBUG_REQ(D_INODE, req, "setxattr "DFID3"\n",
                   PFID3(&info->mti_body->fid1));
 
 /*        MDS_CHECK_RESENT(req, mds_reconstruct_generic(req)); */
 
-        lockpart = MDS_INODELOCK_UPDATE;
-
         /* various sanity check for xattr name */
         xattr_name = req_capsule_client_get(&info->mti_pill, &RMF_NAME);
         if (!xattr_name) {
@@ -197,14 +188,20 @@ int mdt_setxattr(struct mdt_thread_info *info)
                 GOTO(out, rc = -EOPNOTSUPP);
         }
 
+        lockpart = MDS_INODELOCK_UPDATE;
         if (!strcmp(xattr_name, XATTR_NAME_ACL_ACCESS))
                 lockpart |= MDS_INODELOCK_LOOKUP;
 
+        lh = &info->mti_lh[MDT_LH_PARENT];
+        lh->mlh_mode = LCK_EX;
         rc = mdt_object_lock(info->mti_mdt->mdt_namespace, info->mti_object, 
                                  lh, lockpart);
         if (rc != 0)
                 GOTO(out, rc);
 
+        if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
+                GOTO(out_unlock, rc = -EROFS);
+
         if (info->mti_body->valid & OBD_MD_FLXATTR) {
                 char * xattr; 
                 if (!req_capsule_field_present(&info->mti_pill, &RMF_EADATA)) {