From b6d038e865449595cb2cbcdce500fe17c4bb3164 Mon Sep 17 00:00:00 2001 From: huanghua Date: Wed, 2 Aug 2006 08:37:19 +0000 Subject: [PATCH] reworked for mdt_getattr(): prepacking for reply message, and shrink later. --- lustre/include/lustre_req_layout.h | 1 - lustre/mdc/mdc_request.c | 10 ++- lustre/mdt/mdt_handler.c | 131 ++++++++++++------------------------- lustre/mdt/mdt_open.c | 6 ++ lustre/ptlrpc/layout.c | 18 +---- 5 files changed, 59 insertions(+), 107 deletions(-) diff --git a/lustre/include/lustre_req_layout.h b/lustre/include/lustre_req_layout.h index 892df93..3822717 100644 --- a/lustre/include/lustre_req_layout.h +++ b/lustre/include/lustre_req_layout.h @@ -95,7 +95,6 @@ extern const struct req_format RQF_MDS_SYNC; 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_READLINK; extern const struct req_format RQF_MDS_CLOSE; extern const struct req_format RQF_MDS_PIN; extern const struct req_format RQF_MDS_CONNECT; diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 46650a1..4e6566d 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -187,9 +187,15 @@ int mdc_getattr(struct obd_export *exp, struct lu_fid *fid, mdc_pack_req_body(req, MDS_REQ_REC_OFF, valid, fid, ea_size); /* currently only root inode will call us with FLACL */ - if (valid & OBD_MD_FLACL) - acl_size = LUSTRE_POSIX_ACL_MAX_SIZE; + /* FIXME:XXX:reserve enough space regardless the flag temporarily. + * server will do lustre_shrink_reply(); + * + *if (valid & OBD_MD_FLACL) + */ + acl_size = LUSTRE_POSIX_ACL_MAX_SIZE; + + rc = mdc_getattr_common(exp, ea_size, acl_size, req); if (rc != 0) { ptlrpc_req_finished (req); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 278436b..299959e 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -204,13 +204,13 @@ static inline int mdt_body_has_lov(const struct lu_attr *la, } static int mdt_getattr_internal(struct mdt_thread_info *info, - struct mdt_object *o, - int need_pack_reply) + struct mdt_object *o, int offset) { struct md_object *next = mdt_object_child(o); const struct mdt_body *reqbody = info->mti_body; struct ptlrpc_request *req = mdt_info_req(info); - struct lu_attr *la = &info->mti_attr.ma_attr; + struct md_attr *ma = &info->mti_attr; + struct lu_attr *la = &ma->ma_attr; struct req_capsule *pill = &info->mti_pill; const struct lu_context *ctxt = info->mti_ctxt; struct mdt_body *repbody; @@ -222,109 +222,50 @@ static int mdt_getattr_internal(struct mdt_thread_info *info, if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) { RETURN(-ENOMEM); } + repbody = req_capsule_server_get(pill, &RMF_MDT_BODY); + repbody->eadatasize = 0; + repbody->aclsize = 0; + + ma->ma_lmm = req_capsule_server_get(pill, &RMF_MDT_MD); + ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); rc = mo_attr_get(ctxt, next, &info->mti_attr); if (rc == -EREMOTE) { - /* FIXME: This object is located on remote node. - * What value should we return to client? - * also in mdt_md_create() and mdt_object_open() - */ - if (need_pack_reply) { - rc = req_capsule_pack(pill); - if (rc) - RETURN(rc); - } - - repbody = req_capsule_server_get(pill, &RMF_MDT_BODY); + /* This object is located on remote node.*/ repbody->fid1 = *mdt_object_fid(o); repbody->valid |= OBD_MD_FLID; - RETURN(0); - } - if (rc){ + GOTO(shrink, rc = 0); + } else if (rc){ CERROR("getattr error for "DFID3": %d\n", PFID3(mdt_object_fid(o)), rc); RETURN(rc); } - if ( !need_pack_reply) - goto skip_packing; - - /* pre-getattr: to guess how many bytes we need. */ - if (S_ISLNK(la->la_mode) && (reqbody->valid & OBD_MD_LINKNAME)) { - /*FIXME: temporary using old style, will fix it soon */ - int size[2] = {sizeof (struct mdt_body) }; - CDEBUG(D_INODE, "LNK name len = %lu, space in body = %d\n", - (unsigned long)la->la_size + 1, - reqbody->eadatasize); - rc = min_t(int, la->la_size + 1, reqbody->eadatasize); - size[1] = rc; - rc = lustre_pack_reply(req, 2, size, NULL); - if (rc) - RETURN(rc); - goto skip_packing; - } -#ifdef CONFIG_FS_POSIX_ACL - if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) && - (reqbody->valid & OBD_MD_FLACL)) { - - rc = mo_xattr_get(ctxt, next, NULL, 0, XATTR_NAME_ACL_ACCESS); - if (rc < 0) { - if (rc != -ENODATA && rc != -EOPNOTSUPP) { - CERROR("got acl size: %d\n", rc); - RETURN(rc); - } - rc = 0; - } - req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc); - } -#endif - rc = req_capsule_pack(pill); - if (rc) { - CERROR("lustre pack reply for getattr failed: rc %d\n", rc); - RETURN(rc); - } - -skip_packing: - repbody = req_capsule_server_get(pill, &RMF_MDT_BODY); - mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); + if (ma->ma_valid & MA_INODE) + mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); - /* now, to getattr*/ if (mdt_body_has_lov(la, reqbody)) { - buffer = req_capsule_server_get(pill, &RMF_MDT_MD); - length = req_capsule_get_size(pill, &RMF_MDT_MD, RCL_SERVER); - if (length > 0) { - rc = mo_xattr_get(ctxt, next, - buffer, length, XATTR_NAME_LOV); - if (rc > 0) { - if (S_ISDIR(la->la_mode)) - repbody->valid |= OBD_MD_FLDIREA; - else - repbody->valid |= OBD_MD_FLEASIZE; - repbody->eadatasize = rc; - rc = 0; - } else if (rc == -ENODATA || rc == -EOPNOTSUPP) - rc = 0; + if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) { + CDEBUG(D_INODE, "packing ea for "DFID3"\n", + PFID3(mdt_object_fid(o))); + mdt_dump_lmm(D_INFO, ma->ma_lmm); + repbody->eadatasize = ma->ma_lmm_size; + repbody->valid |= OBD_MD_FLEASIZE; } } else if (S_ISLNK(la->la_mode) && - (reqbody->valid & OBD_MD_LINKNAME) != 0) { - /*FIXME: temporary using old style, will fix it soon */ - buffer = lustre_msg_buf(req->rq_repmsg, 1, 0); - LASSERT(buffer != NULL); /* caller prepped reply */ - length = req->rq_repmsg->buflens[1]; - - rc = mo_readlink(ctxt, next, buffer, length); + reqbody->valid & OBD_MD_LINKNAME) { + rc = mo_readlink(ctxt, next, ma->ma_lmm, ma->ma_lmm_size); if (rc <= 0) { CERROR("readlink failed: %d\n", rc); rc = -EFAULT; } else { repbody->valid |= OBD_MD_LINKNAME; repbody->eadatasize = rc + 1; - ((char*)buffer)[rc] = 0; /* NULL terminate */ + ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */ CDEBUG(D_INODE, "symlink dest %s, len = %d\n", (char*)buffer, rc); rc = 0; } - RETURN(0); } if (reqbody->valid & OBD_MD_FLMODEASIZE) { @@ -337,8 +278,6 @@ skip_packing: repbody->max_cookiesize); } - if (rc != 0) - RETURN(rc); #ifdef CONFIG_FS_POSIX_ACL if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) && (reqbody->valid & OBD_MD_FLACL)) { @@ -359,6 +298,19 @@ skip_packing: } } #endif + +shrink: + /* FIXME: determine the offset of MDT_MD. but it does not work */ +/* + if (req_capsule_has_field(pill, &RMF_DLM_REP)) { + offset = 2; + } else + offset = 1; +*/ + lustre_shrink_reply(req, offset, repbody->eadatasize, 1); + if (repbody->eadatasize) + offset ++; + lustre_shrink_reply(req, offset, repbody->aclsize, 0); RETURN(rc); } @@ -421,8 +373,8 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, result = mdt_object_lock(info, child, lhc, child_bits); if (result != 0) { /* finally, we can get attr for child. */ - result = mdt_getattr_internal(info, child, - ldlm_rep ? 0 : 1); + result = mdt_getattr_internal(info, child, + ldlm_rep ? 2 : 1); if (result != 0) mdt_object_unlock(info, child, lhc, 1); } @@ -455,7 +407,8 @@ 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_internal(info, child, ldlm_rep ? 0 : 1); + result = mdt_getattr_internal(info, child, + ldlm_rep ? 2 : 1); if (result != 0) mdt_object_unlock(info, child, lhc, 1); else { @@ -2830,8 +2783,8 @@ static struct mdt_handler mdt_mds_ops[] = { DEF_MDT_HNDL_F(0, CONNECT, mdt_connect), DEF_MDT_HNDL_F(0, DISCONNECT, mdt_disconnect), DEF_MDT_HNDL_F(0 |HABEO_REFERO, GETSTATUS, mdt_getstatus), -DEF_MDT_HNDL_F(HABEO_CORPUS, GETATTR, mdt_getattr), -DEF_MDT_HNDL_F(HABEO_CORPUS, GETATTR_NAME, mdt_getattr_name), +DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR, mdt_getattr), +DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO, GETATTR_NAME, mdt_getattr_name), DEF_MDT_HNDL_F(HABEO_CORPUS|HABEO_REFERO|MUTABOR, SETXATTR, mdt_setxattr), DEF_MDT_HNDL_F(HABEO_CORPUS, GETXATTR, mdt_getxattr), diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index b3d22cc..0af5147 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -138,6 +138,8 @@ static int mdt_mfd_open(struct mdt_thread_info *info, CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64"\n", ma->ma_valid); CDEBUG(D_INODE, "after open, lmm_size = %d\n", ma->ma_lmm_size); + repbody->eadatasize = 0; + repbody->aclsize = 0; if (ma->ma_valid & MA_INODE) mdt_pack_attr2body(repbody, la, mdt_object_fid(o)); @@ -149,6 +151,10 @@ static int mdt_mfd_open(struct mdt_thread_info *info, repbody->valid |= OBD_MD_FLEASIZE; } + /*FIXME: should determine the offset dynamicly */ + lustre_shrink_reply(req, 2, repbody->eadatasize, 1); + lustre_shrink_reply(req, repbody->eadatasize ? 3 : 2, repbody->aclsize, 0); + if (flags & FMODE_WRITE) { /*mds_get_write_access*/ } else if (flags & MDS_FMODE_EXEC) { diff --git a/lustre/ptlrpc/layout.c b/lustre/ptlrpc/layout.c index 3d801cf..e8f7f5d 100644 --- a/lustre/ptlrpc/layout.c +++ b/lustre/ptlrpc/layout.c @@ -216,14 +216,7 @@ static const struct req_msg_field *mds_setxattr_client[] = { static const struct req_msg_field *mds_getattr_server[] = { &RMF_MDT_BODY, &RMF_MDT_MD, -#ifdef CONFIG_FS_POSIX_ACL &RMF_EADATA -#endif -}; - -static const struct req_msg_field *mds_readlink_server[] = { - &RMF_MDT_BODY, - &RMF_MDT_MD, }; static const struct req_format *req_formats[] = { @@ -255,7 +248,6 @@ static const struct req_format *req_formats[] = { &RQF_MDS_PIN, &RQF_MDS_READPAGE, &RQF_MDS_DONE_WRITING, - &RQF_MDS_READLINK }; struct req_msg_field { @@ -391,9 +383,9 @@ const struct req_msg_field RMF_REC_SETATTR = lustre_swab_mdt_rec_setattr); EXPORT_SYMBOL(RMF_REC_SETATTR); -/* Huang Hua changed the size from 0 to 16 to avoid ASSERT failure */ - -const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, 16, NULL); +/* FIXME: this length should be defined as a macro*/ +const struct req_msg_field RMF_EADATA = DEFINE_MSGF("eadata", 0, + 4 + 32 * 8, NULL); EXPORT_SYMBOL(RMF_EADATA); const struct req_msg_field RMF_LOGCOOKIES = @@ -458,10 +450,6 @@ const struct req_format RQF_MDS_GETATTR = DEFINE_REQ_FMT0("MDS_GETATTR", mdt_body_only, mds_getattr_server); EXPORT_SYMBOL(RQF_MDS_GETATTR); -const struct req_format RQF_MDS_READLINK = - DEFINE_REQ_FMT0("MDS_READLINK", mdt_body_only, mds_readlink_server); -EXPORT_SYMBOL(RQF_MDS_READLINK); - const struct req_format RQF_MDS_GETXATTR = DEFINE_REQ_FMT0("MDS_GETXATTR", mds_getxattr_client, mds_getxattr_server); -- 1.8.3.1