From b046468f58a1f40e85cb59ed9abf75fd2fd5ea5a Mon Sep 17 00:00:00 2001 From: Sergey Cheremencev Date: Fri, 23 Jan 2015 17:52:01 +0400 Subject: [PATCH] LU-6158 mdt: always shrink_capsule in getxattr_all 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 Signed-off-by: Alexander Zarochentsev Xyratex-bug-id: MRP-2340 Reviewed-on: http://review.whamcloud.com/13524 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Niu Yawei Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_xattr.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 7d7e15d..a7c69cf 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -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; } -- 1.8.3.1