From: tappro Date: Thu, 13 Jul 2006 00:05:36 +0000 (+0000) Subject: - add new layouts for readpage, unlink_last, rename_last, close_last X-Git-Tag: v1_8_0_110~486^2~1432 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=7bd587a1c71a8a673a2d2cdd5b94dd2b5fb91d38;p=fs%2Flustre-release.git - add new layouts for readpage, unlink_last, rename_last, close_last - move handling the dying object in mdt_handle_last_unlink(). --- diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 05bac3e..9f27a59c 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -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; diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 3838868..6a9677e 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -40,6 +40,50 @@ #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) diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index b502032..895f7ed 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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); diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 948f61c..c2f2af2 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -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: diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 0371c66..9b95b3c 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -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)