From ca4247868ae15bdd587611d37685d2717950d26b Mon Sep 17 00:00:00 2001 From: huanghua Date: Thu, 27 Jul 2006 09:58:50 +0000 Subject: [PATCH] rework on mdt_handle_last_unlink(): (1) extend reply message if necessary; (2) getattr & getxattr if necessary; --- lustre/mdt/mdt_handler.c | 27 ++++++++------ lustre/mdt/mdt_internal.h | 2 +- lustre/mdt/mdt_lib.c | 92 ++++++++++++++++++++++++++++++++--------------- lustre/mdt/mdt_open.c | 4 +-- lustre/mdt/mdt_reint.c | 5 +-- 5 files changed, 84 insertions(+), 46 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index f384b60..6434a83 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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), diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 48ff5be..d813088 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -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*/ diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 456d356..0b6ae6c 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -40,48 +40,84 @@ #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); } diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 760002f..e17af2c 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index aebfc88..808a951 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -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: -- 1.8.3.1