From: shadow Date: Fri, 24 Jul 2009 14:00:10 +0000 (+0000) Subject: looks i was land old version of patch :( X-Git-Tag: v1_8_2_01~1^2~217 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=7ae1a3a5579eed443747a54127d3706a01b84394;p=fs%2Flustre-release.git looks i was land old version of patch :( commit right version. Branch b1_8 b=20020 --- diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index d9d06a5..2407e33 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -697,9 +697,9 @@ int mds_pack_posix_acl(struct inode *inode, struct lustre_msg *repmsg, rc = inode->i_op->getxattr(&de, MDS_XATTR_NAME_ACL_ACCESS, lustre_msg_buf(repmsg, repoff, buflen), buflen); - if (rc >= 0) + if (rc >= 0) { repbody->aclsize = rc; - else if (rc != -ENODATA) { + } else if (rc != -ENODATA) { CERROR("buflen %d, get acl: %d\n", buflen, rc); RETURN(rc); } @@ -808,7 +808,6 @@ static int mds_getattr_internal(struct obd_device *obd, struct dentry *dentry, inode, req->rq_repmsg, body, reply_off); - lustre_shrink_reply(req, reply_off, body->aclsize, 0); if (body->aclsize) reply_off++; } @@ -822,8 +821,9 @@ static int mds_getattr_pack_msg(struct ptlrpc_request *req, struct inode *inode, { struct mds_obd *mds = mds_req2mds(req); struct mds_body *body; - int rc, bufcount = 2; - int size[4] = { sizeof(struct ptlrpc_body), sizeof(*body) }; + int rc, bufcount = REPLY_REC_OFF + 1; + int size[4] = { sizeof(struct ptlrpc_body), + sizeof(*body) }; ENTRY; LASSERT(offset == REQ_REC_OFF); /* non-intent */ @@ -832,61 +832,26 @@ static int mds_getattr_pack_msg(struct ptlrpc_request *req, struct inode *inode, LASSERT(body != NULL); /* checked by caller */ LASSERT(lustre_req_swabbed(req, offset)); /* swabbed by caller */ - if ((S_ISREG(inode->i_mode) && (body->valid & OBD_MD_FLEASIZE)) || - (S_ISDIR(inode->i_mode) && (body->valid & OBD_MD_FLDIREA))) { - LOCK_INODE_MUTEX(inode); - rc = fsfilt_get_md(req->rq_export->exp_obd, inode, NULL, 0, - "lov"); - UNLOCK_INODE_MUTEX(inode); - CDEBUG(D_INODE, "got %d bytes MD data for inode %lu\n", - rc, inode->i_ino); - if ((rc == 0) && (lustre_msg_get_opc(req->rq_reqmsg) == MDS_GETATTR) && - ((S_ISDIR(inode->i_mode) && (body->valid & OBD_MD_FLDIREA)))) - rc = sizeof(struct lov_mds_md_v3); - if (rc < 0) { - if (rc != -ENODATA) { - CERROR("error getting inode %lu MD: rc = %d\n", - inode->i_ino, rc); - RETURN(rc); - } - size[bufcount] = 0; - } else if (rc > mds->mds_max_mdsize) { - size[bufcount] = 0; - CERROR("MD size %d larger than maximum possible %u\n", - rc, mds->mds_max_mdsize); - } else { - size[bufcount] = rc; - } - bufcount++; + if (body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) { + /* this will be shrinked to actual size before size */ + if (S_ISREG(inode->i_mode) || (S_ISDIR(inode->i_mode))) + size[bufcount ++] = mds->mds_max_mdsize; + else + /* we not want LSM for specfial files */ + body->valid &= ~(OBD_MD_FLEASIZE | OBD_MD_FLDIREA); } else if (S_ISLNK(inode->i_mode) && (body->valid & OBD_MD_LINKNAME)) { if (i_size_read(inode) > body->eadatasize) CERROR("symlink size: %Lu, reply space: %d\n", i_size_read(inode) + 1, body->eadatasize); - size[bufcount] = min_t(int, i_size_read(inode) + 1, - body->eadatasize); - bufcount++; + size[bufcount ++] = min_t(int, i_size_read(inode) + 1, + body->eadatasize); CDEBUG(D_INODE, "symlink size: %Lu, reply space: %d\n", i_size_read(inode) + 1, body->eadatasize); } - #ifdef CONFIG_FS_POSIX_ACL if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) && (body->valid & OBD_MD_FLACL)) { - struct dentry de = { .d_inode = inode }; - - size[bufcount] = 0; - if (inode->i_op && inode->i_op->getxattr) { - rc = inode->i_op->getxattr(&de, MDS_XATTR_NAME_ACL_ACCESS, - NULL, 0); - if (rc < 0) { - if (rc != -ENODATA) { - CERROR("got acl size: %d\n", rc); - RETURN(rc); - } - } else - size[bufcount] = rc; - } - bufcount++; + size[bufcount ++] = LUSTRE_POSIX_ACL_MAX_SIZE; } #endif @@ -1138,7 +1103,7 @@ out_ucred: mds_exit_ucred(&uc, mds); cleanup_exit: - mds_body_shrink_reply(req, offset, REPLY_REC_OFF); + mds_shrink_body_reply(req, offset, REPLY_REC_OFF); return rc; } @@ -1650,7 +1615,7 @@ int mds_handle(struct ptlrpc_request *req) */ rc = mds_getattr_lock(req, REQ_REC_OFF, MDS_INODELOCK_UPDATE, &lockh); - mds_body_shrink_reply(req, REQ_REC_OFF, REPLY_REC_OFF); + mds_shrink_body_reply(req, REQ_REC_OFF, REPLY_REC_OFF); /* this non-intent call (from an ioctl) is special */ req->rq_status = rc; if (rc == 0 && lustre_handle_is_used(&lockh)) @@ -1748,7 +1713,7 @@ int mds_handle(struct ptlrpc_request *req) break; rc = mds_reint(req, REQ_REC_OFF, NULL); - mds_intent_shrink_reply(req, opc, REPLY_REC_OFF); + mds_shrink_intent_reply(req, opc, REPLY_REC_OFF); fail = OBD_FAIL_MDS_REINT_NET_REP; break; } @@ -1757,7 +1722,7 @@ int mds_handle(struct ptlrpc_request *req) DEBUG_REQ(D_INODE, req, "close"); OBD_FAIL_RETURN(OBD_FAIL_MDS_CLOSE_NET, 0); rc = mds_close(req, REQ_REC_OFF); - mds_body_shrink_reply(req, REQ_REC_OFF, REPLY_REC_OFF); + mds_shrink_body_reply(req, REQ_REC_OFF, REPLY_REC_OFF); fail = OBD_FAIL_MDS_CLOSE_NET_REP; break; @@ -2479,7 +2444,7 @@ static int mds_intent_policy(struct ldlm_namespace *ns, * packet is following */ rep->lock_policy_res2 = mds_reint(req, DLM_INTENT_REC_OFF, &lockh); - mds_intent_shrink_reply(req, REINT_OPEN, DLM_REPLY_REC_OFF); + mds_shrink_intent_reply(req, REINT_OPEN, DLM_REPLY_REC_OFF); #if 0 /* We abort the lock if the lookup was negative and * we did not make it to the OPEN portion */ @@ -2526,7 +2491,7 @@ static int mds_intent_policy(struct ldlm_namespace *ns, rep->lock_policy_res2 = mds_getattr_lock(req,DLM_INTENT_REC_OFF, getattr_part, &lockh); - mds_body_shrink_reply(req, DLM_INTENT_REC_OFF, DLM_REPLY_REC_OFF); + mds_shrink_body_reply(req,DLM_INTENT_REC_OFF, DLM_REPLY_REC_OFF); /* FIXME: LDLM can set req->rq_status. MDS sets policy_res{1,2} with disposition and status. - replay: returns 0 & req->status is old status diff --git a/lustre/mds/mds_internal.h b/lustre/mds/mds_internal.h index a0fd132..9a5fc5e 100644 --- a/lustre/mds/mds_internal.h +++ b/lustre/mds/mds_internal.h @@ -198,10 +198,10 @@ struct dentry *mds_lookup(struct obd_device *obd, struct dentry *dparent, int fid_namelen); -void mds_body_shrink_reply(struct ptlrpc_request *req, - int req_mdoff, int reply_mdoff); -void mds_intent_shrink_reply(struct ptlrpc_request *req, - int opc, int reply_mdoff); +void mds_shrink_body_reply(struct ptlrpc_request *req, int req_mdoff, + int reply_mdoff); +void mds_shrink_intent_reply(struct ptlrpc_request *req, + int opc, int reply_mdoff); int mds_get_cookie_size(struct obd_device *obd, struct lov_mds_md *lmm); int mds_version_get_check(struct ptlrpc_request *, struct inode *, int); /* mds/mds_lib.c */ diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c index 737e8f4..7475396 100644 --- a/lustre/mds/mds_open.c +++ b/lustre/mds/mds_open.c @@ -834,10 +834,6 @@ static int mds_finish_open(struct ptlrpc_request *req, struct dentry *dchild, } UNLOCK_INODE_MUTEX(dchild->d_inode); - if (rec && !(rec->ur_flags & MDS_OPEN_JOIN_FILE)) - lustre_shrink_reply(req, DLM_REPLY_REC_OFF + 1, - body->eadatasize, 0); - if (req->rq_export->exp_connect_flags & OBD_CONNECT_ACL && rec && !(rec->ur_flags & MDS_OPEN_JOIN_FILE)) { int acl_off = DLM_REPLY_REC_OFF + (body->eadatasize ? 2 : 1); @@ -845,7 +841,6 @@ static int mds_finish_open(struct ptlrpc_request *req, struct dentry *dchild, rc = mds_pack_acl(&req->rq_export->exp_mds_data, dchild->d_inode, req->rq_repmsg, body, acl_off); - lustre_shrink_reply(req, acl_off, body->aclsize, 0); if (rc) RETURN(rc); } diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index aed103b..102676f 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -1791,87 +1791,73 @@ int mds_get_cookie_size(struct obd_device *obd, struct lov_mds_md *lmm) return real_csize; } -void mds_body_shrink_reply(struct ptlrpc_request *req, - int req_mdoff, int reply_mdoff) +static void mds_shrink_reply(struct ptlrpc_request *req, + int reply_mdoff, int have_md, int have_acl) { struct obd_device *obd = req->rq_export->exp_obd; - struct mds_body *rq_body; struct mds_body *reply_body; - int cookie_size = 0, md_size = -1; - - rq_body = lustre_msg_buf(req->rq_reqmsg, req_mdoff, - sizeof(*rq_body)); - - LASSERT(rq_body); + int cookie_size = 0, md_size = 0; + ENTRY; /* LSM and cookie is always placed after mds_body */ reply_body = lustre_msg_buf(req->rq_repmsg, reply_mdoff, sizeof(*reply_body)); reply_mdoff++; - if (rq_body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) { - md_size = 0; - if (reply_body && - reply_body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) + if (reply_body && (have_md || have_acl)) { + if (reply_body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) { md_size = reply_body->eadatasize; - lustre_shrink_reply(req, reply_mdoff, md_size, 1); - } - - if (rq_body->valid & OBD_MD_LINKNAME) { - md_size = rq_body->eadatasize; - lustre_shrink_reply(req, reply_mdoff, md_size, 1); - } - - - if (reply_body != NULL) { - if (reply_body->valid & OBD_MD_FLCOOKIE) { - LASSERT(reply_body->valid & OBD_MD_FLEASIZE); - cookie_size = mds_get_cookie_size(obd, lustre_msg_buf( - req->rq_repmsg, reply_mdoff, 0)); - } else if (reply_body->valid & OBD_MD_FLACL) { - cookie_size = reply_body->aclsize; - } - } - lustre_shrink_reply(req, reply_mdoff + (md_size > 0), cookie_size, 1); - - CDEBUG(D_INFO, "Shrink to md_size %d cookie_size %d \n", md_size, - cookie_size); -} - -void mds_intent_shrink_reply(struct ptlrpc_request *req, - int opc, int reply_mdoff) -{ - struct obd_device *obd = req->rq_export->exp_obd; - struct mds_body *reply_body; - int cookie_size = 0, md_size = 0; - - if (opc == REINT_UNLINK || opc == REINT_RENAME || - opc == REINT_OPEN) { - - /* LSM and cookie is always placed after mds_body */ - reply_body = lustre_msg_buf(req->rq_repmsg, reply_mdoff, - sizeof(*reply_body)); - reply_mdoff++; - - if (reply_body && - reply_body->valid & (OBD_MD_FLEASIZE | OBD_MD_FLDIREA)) + } else if (reply_body->valid & OBD_MD_LINKNAME) md_size = reply_body->eadatasize; - lustre_shrink_reply(req, reply_mdoff, md_size, 1); - - if (reply_body && reply_body->valid & OBD_MD_FLCOOKIE) { + if (reply_body->valid & OBD_MD_FLCOOKIE) { LASSERT(reply_body->valid & OBD_MD_FLEASIZE); cookie_size = mds_get_cookie_size(obd, lustre_msg_buf( req->rq_repmsg, reply_mdoff, 0)); + } else if (reply_body->valid & OBD_MD_FLACL) { + cookie_size = reply_body->aclsize; } + } + CDEBUG(D_INFO, "Shrink %d/%d to md_size %d cookie_size %d \n", + have_md, have_acl, md_size, cookie_size); + if (likely(have_md)) + lustre_shrink_reply(req, reply_mdoff, md_size, 1); + + if (likely(have_acl)) lustre_shrink_reply(req, reply_mdoff + (md_size > 0), cookie_size, 1); +} + +void mds_shrink_body_reply(struct ptlrpc_request *req, + int req_mdoff, + int reply_mdoff) +{ + struct mds_body *rq_body; + const long have_acl = OBD_MD_FLCOOKIE | OBD_MD_FLACL; + const long have_md = OBD_MD_FLEASIZE | OBD_MD_FLDIREA; + ENTRY; + + /* LSM and cookie is always placed after mds_body */ + rq_body = lustre_msg_buf(req->rq_reqmsg, req_mdoff, + sizeof(*rq_body)); + LASSERT(rq_body); + + /* this check is need for avoid hit asset in case + * OBD_MDS_FLFLAGS */ + mds_shrink_reply(req, reply_mdoff, + rq_body->valid & have_md, + rq_body->valid & have_acl); +} + +void mds_shrink_intent_reply(struct ptlrpc_request *req, + int opc, int reply_mdoff) +{ + if (opc == REINT_UNLINK || opc == REINT_RENAME || + opc == REINT_OPEN) + mds_shrink_reply(req, reply_mdoff, 1, 1); - CDEBUG(D_INFO, "Shrink to md_size %d cookie_size %d \n", md_size, - cookie_size); - } } static int mds_reint_unlink(struct mds_update_record *rec, int offset, diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index bfff38d..08f71bc 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -150,8 +150,10 @@ static inline int lustre_msg_size_v2(int count, __u32 *lengths) int i; size = lustre_msg_hdr_size_v2(count); - for (i = 0; i < count; i++) + for (i = 0; i < count; i++) { size += size_round(lengths[i]); + CDEBUG(D_INFO, "size %d - len %d\n", size, lengths[i]); + } return size; } @@ -613,7 +615,8 @@ void lustre_shrink_reply_v1(struct ptlrpc_request *req, int segment, LASSERT(req->rq_reply_state); LASSERT(msg); LASSERT(segment >= 0); - LASSERT(msg->lm_bufcount >= segment); + LASSERTF(msg->lm_bufcount > segment, "message have %d - requested %d\n", + msg->lm_bufcount,segment); LASSERT(msg->lm_buflens[segment] >= newlen); if (msg->lm_buflens[segment] == newlen) @@ -650,9 +653,10 @@ void lustre_shrink_reply_v2(struct ptlrpc_request *req, int segment, char *tail = NULL, *newpos; int tail_len = 0, n; + CDEBUG(D_INFO, "shrink req %p seg %d - len %d\n", req, segment, newlen); LASSERT(req->rq_reply_state); LASSERT(msg); - LASSERTF(msg->lm_bufcount >= segment, "message have %d - requested %d\n", + LASSERTF(msg->lm_bufcount > segment, "message have %d - requested %d\n", msg->lm_bufcount,segment); LASSERT(msg->lm_buflens[segment] >= newlen);