Whamcloud - gitweb
rework on mdt_handle_last_unlink():
authorhuanghua <huanghua>
Thu, 27 Jul 2006 09:58:50 +0000 (09:58 +0000)
committerhuanghua <huanghua>
Thu, 27 Jul 2006 09:58:50 +0000 (09:58 +0000)
(1) extend reply message if necessary;
(2) getattr & getxattr if necessary;

lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/mdt/mdt_lib.c
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c

index f384b60..6434a83 100644 (file)
@@ -336,6 +336,9 @@ skip_packing:
                 repbody->max_cookiesize = info->mti_mdt->mdt_max_cookiesize;
                 repbody->max_mdsize = info->mti_mdt->mdt_max_mdsize;
                 repbody->valid |= OBD_MD_FLMODEASIZE;
+                CDEBUG(D_INODE, "I am going to change the MAX_MD_SIZE to : %d:%d\n",
+                        repbody->max_cookiesize,
+                        repbody->max_mdsize);
         }
 
         if (rc != 0)
@@ -401,7 +404,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
         ENTRY;
 
         LASSERT(info->mti_object != NULL);
-        CDEBUG(D_INFO, "getattr with lock for "DFID3"/%s, ldlm_rep = %p\n",
+        CDEBUG(D_INODE, "getattr with lock for "DFID3"/%s, ldlm_rep = %p\n",
                         PFID3(mdt_object_fid(parent)), name, ldlm_rep);
 
         name = req_capsule_client_get(&info->mti_pill, &RMF_NAME);
@@ -413,7 +416,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
                 /* only open the child. parent is on another node. */
                 intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
                 child = parent;
-                CDEBUG(D_INFO, "partial getattr_name child_fid = "DFID3
+                CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID3
                                ", ldlm_rep=%p\n",
                                PFID3(mdt_object_fid(child)), ldlm_rep);
 
@@ -693,7 +696,7 @@ static long mdt_reint_opcode(struct mdt_thread_info *info,
 static int mdt_reint(struct mdt_thread_info *info)
 {
         long opc;
-        int  rc;
+        int  rc = 0;
 
         static const struct req_format *reint_fmts[REINT_MAX] = {
                 [REINT_SETATTR] = &RQF_MDS_REINT_SETATTR,
@@ -710,7 +713,8 @@ static int mdt_reint(struct mdt_thread_info *info)
         if (opc >= 0) {
                 OBD_FAIL_RETURN(OBD_FAIL_MDS_REINT_NET, 0);
 
-                rc = req_capsule_pack(&info->mti_pill);
+                if (opc != REINT_UNLINK)
+                        rc = req_capsule_pack(&info->mti_pill);
                 if (rc == 0)
                         rc = mdt_reint_internal(info, opc);
         } else
@@ -1123,12 +1127,13 @@ int mdt_update_last_transno(struct mdt_thread_info *info, int rc)
         if (rc == 0) {
                 last_transno = info->mti_transno;
         } else {
+                if (info->mti_transno != 0)
+                        CERROR("replay %s transno "LPU64" failed: rc %d\n",
+                               libcfs_nid2str(exp->exp_connection->c_peer.nid),
+                               info->mti_transno, rc);
                 last_transno = 0;
-                CERROR("replay %s transno "LPU64" failed: rc %d\n",
-                       libcfs_nid2str(exp->exp_connection->c_peer.nid),
-                       info->mti_transno, rc);
         }
-        CDEBUG(D_INFO, "last_transno = %llu, last_committed = %llu\n",
+        CDEBUG(D_INODE, "last_transno = %llu, last_committed = %llu\n",
                last_transno, last_committed);
 
         req->rq_repmsg->transno = req->rq_transno = last_transno;
@@ -2390,7 +2395,7 @@ static int mdt_object_init(const struct lu_context *ctxt, struct lu_object *o)
         int                rc = 0;
         ENTRY;
 
-        CDEBUG(D_INFO, "object init, fid = "DFID3"\n",
+        CDEBUG(D_INODE, "object init, fid = "DFID3"\n",
                        PFID3(&o->lo_header->loh_fid));
 
         under = &d->mdt_child->md_lu_dev;
@@ -2409,7 +2414,7 @@ static void mdt_object_free(const struct lu_context *ctxt, struct lu_object *o)
         ENTRY;
 
         h = o->lo_header;
-        CDEBUG(D_INFO, "object free, fid = "DFID3"\n", PFID3(&h->loh_fid));
+        CDEBUG(D_INODE, "object free, fid = "DFID3"\n", PFID3(&h->loh_fid));
 
         lu_object_fini(o);
         lu_object_header_fini(h);
@@ -2811,7 +2816,7 @@ DEF_MDT_HNDL_F(HABEO_CORPUS,              GETXATTR,     mdt_getxattr),
 DEF_MDT_HNDL_F(0           |HABEO_REFERO, STATFS,       mdt_statfs),
 DEF_MDT_HNDL_F(0                        |MUTABOR,
                                           REINT,        mdt_reint),
-DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, CLOSE,        mdt_close),
+DEF_MDT_HNDL_F(HABEO_CORPUS,              CLOSE,        mdt_close),
 DEF_MDT_HNDL_0(0,                         DONE_WRITING, mdt_done_writing),
 DEF_MDT_HNDL_F(0           |HABEO_REFERO, PIN,          mdt_pin),
 DEF_MDT_HNDL_0(0,                         SYNC,         mdt_sync),
index 48ff5be..d813088 100644 (file)
@@ -360,7 +360,7 @@ int mdt_close(struct mdt_thread_info *info);
 
 int mdt_done_writing(struct mdt_thread_info *info);
 int mdt_handle_last_unlink(struct mdt_thread_info *, struct mdt_object *,
-                           const struct req_format *);
+                           int need_get_attr, const struct req_format *);
 
 
 /* debug issues helper starts here*/
index 456d356..0b6ae6c 100644 (file)
 
 #include "mdt_internal.h"
 
+static void mdt_dump_lmm(int level, struct lov_mds_md *lmm)
+{
+        struct lov_ost_data_v1 *lod;
+        int i;
+
+        CDEBUG_EX(level, "objid "LPX64", magic 0x%08X, pattern %#X\n",
+               le64_to_cpu(lmm->lmm_object_id), le32_to_cpu(lmm->lmm_magic),
+               le32_to_cpu(lmm->lmm_pattern));
+        CDEBUG_EX(level,"stripe_size %u, stripe_count %u\n",
+               le32_to_cpu(lmm->lmm_stripe_size),
+               le32_to_cpu(lmm->lmm_stripe_count));
+        for (i = 0, lod = lmm->lmm_objects;
+             i < le32_to_cpu(lmm->lmm_stripe_count); i++, lod++)
+                CDEBUG_EX(level, "stripe %u idx %u subobj "LPX64"/"LPX64"\n",
+                       i, le32_to_cpu(lod->l_ost_idx),
+                       le64_to_cpu(lod->l_object_gr),
+                       le64_to_cpu(lod->l_object_id));
+}
+
 /* if object is dying, pack the lov/llog data,
  * parameter info->mti_attr should be valid at this point! */
-int mdt_handle_last_unlink(struct mdt_thread_info *info,
-                           struct mdt_object *mo, const struct req_format *fmt)
+int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
+                           int need_get_attr, const struct req_format *fmt)
 {
-        struct mdt_body *body;
-        struct lu_attr  *la = &info->mti_attr.ma_attr;
+        struct mdt_body *repbody;
+        struct md_attr  *ma = &info->mti_attr;
+        struct lu_attr  *la = &ma->ma_attr;
         int              rc = 0;
         ENTRY;
 
-        body = req_capsule_server_get(&info->mti_pill,
-                                      &RMF_MDT_BODY);
-        mdt_pack_attr2body(body, la, mdt_object_fid(mo));
-
         /* if last unlinked object reference so client should destroy ost
          * objects*/
         if (S_ISREG(la->la_mode) &&
             la->la_nlink == 0 && mo->mot_header.loh_ref == 1) {
-                struct lov_mds_md  *lmm;
 
+                CDEBUG(D_INODE, "Last reference is released on "DFID3
+                                "need_get_attr = %d for it?\n",
+                                PFID3(mdt_object_fid(mo)),
+                                need_get_attr);
                 /* reply should contains more data,
                  * * so we need to extend it */
                 req_capsule_extend(&info->mti_pill, fmt);
-
-                lmm = req_capsule_server_get(&info->mti_pill,
-                                &RMF_MDT_MD);
-
-
-                /*TODO: lmm data & llog cookie
-                 * rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(o),
-                 * lmm, info->mti_mdt->mdt_max_mdsize,
-                 * MDS_LOV_MD_NAME);
-                 * 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;
-                 * }
-                 */
-        }
+                
+                req_capsule_pack(&info->mti_pill);
+                if (need_get_attr) {
+                        ma->ma_lmm = req_capsule_server_get(&info->mti_pill,
+                                                            &RMF_MDT_MD);
+                        ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill,
+                                                               &RMF_MDT_MD,
+                                                               RCL_SERVER);
+                        rc = mo_attr_get(info->mti_ctxt, 
+                                         mdt_object_child(mo), la);
+                        if (rc == 0) {
+                                ma->ma_valid |= MA_INODE;
+                                rc = mo_xattr_get(info->mti_ctxt,
+                                                  mdt_object_child(mo),
+                                                  ma->ma_lmm,
+                                                  ma->ma_lmm_size,
+                                                  XATTR_NAME_LOV);
+                                if (rc >= 0) {
+                                        ma->ma_lmm_size = rc;
+                                        rc = 0;
+                                        ma->ma_valid |= MA_LOV;
+                                        mdt_dump_lmm(D_ERROR, ma->ma_lmm);
+                                }
+                        }
+                }
+
+                repbody = req_capsule_server_get(&info->mti_pill, 
+                                                 &RMF_MDT_BODY);
+                if (ma->ma_valid & MA_INODE)
+                        mdt_pack_attr2body(repbody, la, mdt_object_fid(mo));
+                if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+                        repbody->eadatasize = ma->ma_lmm_size;
+                        repbody->valid |= OBD_MD_FLEASIZE;
+                }
+        } else 
+                req_capsule_pack(&info->mti_pill);
 
         RETURN(rc);
 }
index 760002f..e17af2c 100644 (file)
@@ -363,7 +363,7 @@ int mdt_close(struct mdt_thread_info *info)
         if (mfd == NULL) {
                 spin_unlock(&med->med_open_lock);
                 CDEBUG(D_INODE, "no handle for file close: fid = "DFID3
-                       ": cookie = "LPX64, PFID3(&info->mti_body->fid1),
+                       ": cookie = "LPX64"\n", PFID3(&info->mti_body->fid1),
                        info->mti_body->handle.cookie);
                 rc = -ESTALE;
         } else {
@@ -371,7 +371,7 @@ int mdt_close(struct mdt_thread_info *info)
                 list_del_init(&mfd->mfd_list);
                 spin_unlock(&med->med_open_lock);
 
-                rc = mdt_handle_last_unlink(info, mfd->mfd_object,
+                rc = mdt_handle_last_unlink(info, mfd->mfd_object, 1,
                                             &RQF_MDS_CLOSE_LAST);
 
                 mdt_mfd_close(info->mti_ctxt, mfd);
index aebfc88..808a951 100644 (file)
@@ -227,7 +227,6 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
         struct mdt_object       *mc;
         struct mdt_lock_handle  *lhp;
         struct mdt_lock_handle  *lhc;
-        struct mdt_body         *repbody;
         struct lu_fid           *child_fid = &info->mti_tmp_fid1;
         int                      rc;
 
@@ -252,8 +251,6 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
                 GOTO(out_unlock_parent, rc);
         }
 
-        repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
-
         /*step 2: find & lock the child */
         lhc = &info->mti_lh[MDT_LH_CHILD];
         lhc->mlh_mode = LCK_EX;
@@ -277,7 +274,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info)
         if (rc)
                 GOTO(out_unlock_child, rc);
 
-        rc = mdt_handle_last_unlink(info, mc, &RQF_MDS_REINT_UNLINK_LAST);
+        rc = mdt_handle_last_unlink(info, mc, 0, &RQF_MDS_REINT_UNLINK_LAST);
         GOTO(out_unlock_child, rc);
 
 out_unlock_child: