commit right version.
Branch b1_8
b=20020
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);
}
inode, req->rq_repmsg,
body, reply_off);
- lustre_shrink_reply(req, reply_off, body->aclsize, 0);
if (body->aclsize)
reply_off++;
}
{
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 */
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
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;
}
*/
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))
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;
}
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;
* 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 */
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
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 */
}
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);
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);
}
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,
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;
}
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)
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);