Whamcloud - gitweb
- add new layouts for readpage, unlink_last, rename_last, close_last
authortappro <tappro>
Thu, 13 Jul 2006 00:05:36 +0000 (00:05 +0000)
committertappro <tappro>
Thu, 13 Jul 2006 00:05:36 +0000 (00:05 +0000)
- move handling the dying object in mdt_handle_last_unlink().

lustre/include/lustre_req_layout.h
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c
lustre/ptlrpc/layout.c

index 05bac3e..9f27a59 100644 (file)
@@ -96,8 +96,10 @@ extern const struct req_format RQF_MDS_GETXATTR;
 extern const struct req_format RQF_MDS_SETXATTR;
 extern const struct req_format RQF_MDS_GETATTR;
 extern const struct req_format RQF_MDS_CLOSE;
+extern const struct req_format RQF_MDS_CLOSE_LAST;
 extern const struct req_format RQF_MDS_CONNECT;
 extern const struct req_format RQF_MDS_DISCONNECT;
+extern const struct req_format RQF_MDS_READPAGE;
 
 /*
  * This is format of direct (non-intent) MDS_GETATTR_NAME request.
@@ -107,8 +109,10 @@ extern const struct req_format RQF_MDS_REINT;
 extern const struct req_format RQF_MDS_REINT_CREATE;
 extern const struct req_format RQF_MDS_REINT_OPEN;
 extern const struct req_format RQF_MDS_REINT_UNLINK;
+extern const struct req_format RQF_MDS_REINT_UNLINK_LAST;
 extern const struct req_format RQF_MDS_REINT_LINK;
 extern const struct req_format RQF_MDS_REINT_RENAME;
+extern const struct req_format RQF_MDS_REINT_RENAME_LAST;
 extern const struct req_format RQF_MDS_REINT_SETATTR;
 extern const struct req_format RQF_LDLM_ENQUEUE;
 extern const struct req_format RQF_LDLM_INTENT;
index 3838868..6a9677e 100644 (file)
 
 #include "mdt_internal.h"
 
+/* if object is dying, pack the lov/llog data */
+int mdt_handle_last_unlink(struct mdt_thread_info *info,
+                           struct mdt_object *mo, const struct req_format *fmt)
+{
+        int rc = 0;
+        ENTRY;
+        /* only for reg files and if that object will be deleted */
+        if (lu_object_is_dying(&mo->mot_header)) {
+                rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mo),
+                                 &info->mti_attr);
+                if (rc == 0 && S_ISREG(info->mti_attr.la_mode)) {
+                        struct mdt_body    *body;
+                        struct lov_mds_md  *lmm;
+
+                        /* reply should contains more data,
+                         * so we need to extend it */
+                        req_capsule_extend(&info->mti_pill, fmt);
+
+                        body = req_capsule_server_get(&info->mti_pill,
+                                                      &RMF_MDT_BODY);
+                        lmm = req_capsule_server_get(&info->mti_pill,
+                                                     &RMF_MDT_MD);
+
+                        mdt_pack_attr2body(body, &info->mti_attr, 
+                                           mdt_object_fid(mo));
+
+/*TODO: lmm data & llog cookie
+                        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))
+                                        body->valid |= OBD_MD_FLDIREA;
+                                else
+                                        body->valid |= OBD_MD_FLEASIZE;
+                                body->eadatasize = rc;
+                                rc = 0;
+                        }
+*/
+                }
+        }
+        RETURN(rc);
+}
+
 
 /* unpacking */
 static int mdt_setattr_unpack(struct mdt_thread_info *info)
index b502032..895f7ed 100644 (file)
@@ -343,10 +343,7 @@ int mdt_mfd_close(const struct lu_context *ctxt,
 int mdt_close(struct mdt_thread_info *info)
 {
         struct mdt_export_data *med;
-        struct mdt_body        *repbody;
         struct mdt_file_data   *mfd;
-        struct mdt_object      *o;
-        struct lov_mds_md      *lmm;
         int rc;
         ENTRY;
 
@@ -368,32 +365,9 @@ int mdt_close(struct mdt_thread_info *info)
         /* mdt_handle2mfd increase reference count, we must drop it here */
         mdt_mfd_put(mfd);
 
-        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, 
-                                          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_handle_last_unlink(info, mfd->mfd_object,
+                                    &RQF_MDS_CLOSE_LAST);
+
         rc = mdt_mfd_close(info->mti_ctxt, mfd, 1);
 
         RETURN(rc);
index 948f61c..c2f2af2 100644 (file)
@@ -293,8 +293,12 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
         /* cmm will take care if child is local or remote */
         rc = mdo_unlink(info->mti_ctxt, mdt_object_child(mp),
                         mdt_object_child(mc), rr->rr_name);
+        
+        if (rc)
+                GOTO(out_unlock_child, rc);
+        
+        rc = mdt_handle_last_unlink(info, mc, &RQF_MDS_REINT_UNLINK_LAST);
 
-        GOTO(out_unlock_child, rc);
 out_unlock_child:
         mdt_object_unlock_put(info, mc, lhc);
 out_unlock_parent:
index 0371c66..9b95b3c 100644 (file)
@@ -123,7 +123,7 @@ static const struct req_msg_field *mds_reint_rename_client[] = {
         &RMF_SYMTGT
 };
 
-static const struct req_msg_field *mds_reint_rename_or_unlink_server[] = {
+static const struct req_msg_field *mds_last_unlink_server[] = {
         &RMF_MDT_BODY,
         &RMF_MDT_MD,
         &RMF_LOGCOOKIES
@@ -221,12 +221,6 @@ static const struct req_msg_field *mds_getattr_server[] = {
 #endif
 };
 
-static const struct req_msg_field *mds_close_server[] = {
-        &RMF_MDT_BODY,
-        &RMF_MDT_MD,
-        &RMF_LOGCOOKIES
-};
-
 static const struct req_format *req_formats[] = {
         &RQF_MDS_CONNECT,
         &RQF_MDS_DISCONNECT,
@@ -252,7 +246,12 @@ static const struct req_format *req_formats[] = {
         &RQF_MDS_GETXATTR,
         &RQF_MDS_SETXATTR,
         &RQF_MDS_SYNC,
-        &RQF_MDS_CLOSE
+        &RQF_MDS_CLOSE,
+        &RQF_MDS_READPAGE,
+        &RQF_MDS_REINT_UNLINK_LAST,
+        &RQF_MDS_CLOSE_LAST,
+        &RQF_MDS_REINT_RENAME_LAST
+
 };
 
 struct req_msg_field {
@@ -485,7 +484,7 @@ EXPORT_SYMBOL(RQF_MDS_REINT_OPEN);
 
 const struct req_format RQF_MDS_REINT_UNLINK =
         DEFINE_REQ_FMT0("MDS_REINT_UNLINK", mds_reint_unlink_client,
-                        mds_reint_rename_or_unlink_server);
+                        mdt_body_only);
 EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK);
 
 const struct req_format RQF_MDS_REINT_LINK =
@@ -495,7 +494,7 @@ EXPORT_SYMBOL(RQF_MDS_REINT_LINK);
 
 const struct req_format RQF_MDS_REINT_RENAME =
         DEFINE_REQ_FMT0("MDS_REINT_RENAME", mds_reint_rename_client,
-                        mds_reint_rename_or_unlink_server);
+                        mdt_body_only);
 EXPORT_SYMBOL(RQF_MDS_REINT_RENAME);
 
 const struct req_format RQF_MDS_REINT_SETATTR =
@@ -544,9 +543,29 @@ EXPORT_SYMBOL(RQF_LDLM_INTENT_UNLINK);
 
 const struct req_format RQF_MDS_CLOSE =
         DEFINE_REQ_FMT0("MDS_CLOSE",
-                        mdt_body_only, mds_close_server);
+                        mdt_body_only, mdt_body_only);
 EXPORT_SYMBOL(RQF_MDS_CLOSE);
 
+const struct req_format RQF_MDS_READPAGE =
+        DEFINE_REQ_FMT0("MDS_READPAGE",
+                        mdt_body_only, mdt_body_only);
+EXPORT_SYMBOL(RQF_MDS_READPAGE);
+
+/* formats for requests which delete last object */
+const struct req_format RQF_MDS_REINT_UNLINK_LAST =
+        DEFINE_REQ_FMT0("MDS_REINT_UNLINK_LAST", mds_reint_unlink_client,
+                        mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_REINT_UNLINK_LAST);
+
+const struct req_format RQF_MDS_CLOSE_LAST =
+        DEFINE_REQ_FMT0("MDS_CLOSE_LAST", mdt_body_only, mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_CLOSE_LAST);
+
+const struct req_format RQF_MDS_REINT_RENAME_LAST =
+        DEFINE_REQ_FMT0("MDS_REINT_RENAME_LAST", mds_reint_rename_client,
+                        mds_last_unlink_server);
+EXPORT_SYMBOL(RQF_MDS_REINT_RENAME_LAST);
+
 #if !defined(__REQ_LAYOUT_USER__)
 
 int req_layout_init(void)