Whamcloud - gitweb
LU-6158 mdt: always shrink_capsule in getxattr_all 24/13524/9
authorSergey Cheremencev <sergey.cheremencev@seagate.com>
Fri, 23 Jan 2015 13:52:01 +0000 (17:52 +0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 29 Aug 2015 01:03:13 +0000 (01:03 +0000)
When mdt_getxattr_one returns error, capsule should be
shrunk to zero before exit in mdt_getxattr_all.

Change-Id: I060fd74177b5d7647581bda9cdb83937ab6a74a8
Signed-off-by: Sergey Cheremencev <sergey.cheremencev@seagate.com>
Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@seagate.com>
Xyratex-bug-id: MRP-2340
Reviewed-on: http://review.whamcloud.com/13524
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdt/mdt_xattr.c

index 7d7e15d..a7c69cf 100644 (file)
@@ -182,10 +182,11 @@ static int mdt_getxattr_all(struct mdt_thread_info *info,
        eadatahead = buf->lb_buf;
 
        /* Fill out EADATA first */
-       eadatasize = mo_xattr_list(env, next, buf);
-       if (eadatasize < 0)
-               GOTO(out, rc = eadatasize);
+       rc = mo_xattr_list(env, next, buf);
+       if (rc < 0)
+               GOTO(out_shrink, rc);
 
+       eadatasize = rc;
        eadatatail = eadatahead + eadatasize;
 
        v = req_capsule_server_get(info->mti_pill, &RMF_EAVALS);
@@ -197,13 +198,19 @@ static int mdt_getxattr_all(struct mdt_thread_info *info,
                buf->lb_len = reqbody->mbo_eadatasize - eavallen;
                rc = mdt_getxattr_one(info, b, next, buf, med, uc);
                if (rc < 0)
-                       GOTO(out, rc);
+                       GOTO(out_shrink, rc);
 
                sizes[eavallens] = rc;
                eavallens++;
                eavallen += rc;
        }
 
+out_shrink:
+       if (rc < 0) {
+               eadatasize = 0;
+               eavallens = 0;
+               eavallen = 0;
+       }
        repbody->mbo_aclsize = eavallen;
        repbody->mbo_max_mdsize = eavallens;
 
@@ -212,8 +219,8 @@ static int mdt_getxattr_all(struct mdt_thread_info *info,
                           eavallens * sizeof(__u32), RCL_SERVER);
        req_capsule_shrink(info->mti_pill, &RMF_EADATA, eadatasize, RCL_SERVER);
 
-       GOTO(out, rc = eadatasize);
-out:
+       if (rc >= 0)
+               RETURN(eadatasize);
        return rc;
 }