Whamcloud - gitweb
looks i was land old version of patch :(
authorshadow <shadow>
Fri, 24 Jul 2009 14:00:10 +0000 (14:00 +0000)
committershadow <shadow>
Fri, 24 Jul 2009 14:00:10 +0000 (14:00 +0000)
commit right version.

Branch b1_8
b=20020

lustre/mds/handler.c
lustre/mds/mds_internal.h
lustre/mds/mds_open.c
lustre/mds/mds_reint.c
lustre/ptlrpc/pack_generic.c

index d9d06a5..2407e33 100644 (file)
@@ -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
index a0fd132..9a5fc5e 100644 (file)
@@ -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 */
index 737e8f4..7475396 100644 (file)
@@ -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);
         }
index aed103b..102676f 100644 (file)
@@ -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,
index bfff38d..08f71bc 100644 (file)
@@ -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);