X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_xattr.c;h=a7c69cfa8d5c4e8dfd8e1fd1cdde48dc3b08a7cd;hp=8364fab80a2703c4e55ac7dfa4bc13cbf602f5ba;hb=b046468f58a1f40e85cb59ed9abf75fd2fd5ea5a;hpb=b425c1f4ab1aa9c914acf2d6b500817259a240e9 diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 8364fab..a7c69cf 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -27,7 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -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; } @@ -229,7 +236,7 @@ int mdt_getxattr(struct mdt_thread_info *info) __u32 remote = exp_connect_rmtclient(info->mti_exp); __u32 perm; int easize, rc; - obd_valid valid; + u64 valid; ENTRY; LASSERT(info->mti_object != NULL); @@ -378,7 +385,8 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, __u32 perm; ENTRY; - CDEBUG(D_INODE, "setxattr for "DFID"\n", PFID(rr->rr_fid1)); + CDEBUG(D_INODE, "setxattr for "DFID": %s %s\n", PFID(rr->rr_fid1), + valid & OBD_MD_FLXATTR ? "set" : "remove", xattr_name); if (info->mti_dlm_req) ldlm_request_cancel(req, info->mti_dlm_req, 0, LATF_SKIP); @@ -386,9 +394,6 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, if (OBD_FAIL_CHECK(OBD_FAIL_MDS_SETXATTR)) RETURN(err_serious(-ENOMEM)); - CDEBUG(D_INODE, "%s xattr %s\n", - valid & OBD_MD_FLXATTR ? "set" : "remove", xattr_name); - rc = mdt_init_ucred_reint(info); if (rc != 0) RETURN(rc); @@ -486,43 +491,38 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, attr->la_valid = LA_CTIME; child = mdt_object_child(obj); if (valid & OBD_MD_FLXATTR) { - char *xattr = rr->rr_eadata; - - if (xattr_len > 0) { - int flags = 0; - - if (valid & OBD_MD_FLRMTLSETFACL) { - if (unlikely(!remote)) - GOTO(out_unlock, rc = -EINVAL); - - xattr_len = mdt_rmtlsetfacl(info, child, - xattr_name, - (ext_acl_xattr_header *)xattr, - &new_xattr); - if (xattr_len < 0) - GOTO(out_unlock, rc = xattr_len); - - xattr = (char *)new_xattr; - } - - if (attr->la_flags & XATTR_REPLACE) - flags |= LU_XATTR_REPLACE; - - if (attr->la_flags & XATTR_CREATE) - flags |= LU_XATTR_CREATE; - - mdt_fail_write(env, info->mti_mdt->mdt_bottom, - OBD_FAIL_MDS_SETXATTR_WRITE); - - buf->lb_buf = xattr; - buf->lb_len = xattr_len; - rc = mo_xattr_set(env, child, buf, xattr_name, flags); - /* update ctime after xattr changed */ - if (rc == 0) { - ma->ma_attr_flags |= MDS_PERM_BYPASS; - mo_attr_set(env, child, ma); - } - } + void *xattr = rr->rr_eadata; + int flags = 0; + + if (valid & OBD_MD_FLRMTLSETFACL) { + if (unlikely(!remote)) + GOTO(out_unlock, rc = -EINVAL); + + xattr_len = mdt_rmtlsetfacl(info, child, xattr_name, + xattr, &new_xattr); + if (xattr_len < 0) + GOTO(out_unlock, rc = xattr_len); + + xattr = new_xattr; + } + + if (attr->la_flags & XATTR_REPLACE) + flags |= LU_XATTR_REPLACE; + + if (attr->la_flags & XATTR_CREATE) + flags |= LU_XATTR_CREATE; + + mdt_fail_write(env, info->mti_mdt->mdt_bottom, + OBD_FAIL_MDS_SETXATTR_WRITE); + + buf->lb_buf = xattr; + buf->lb_len = xattr_len; + rc = mo_xattr_set(env, child, buf, xattr_name, flags); + /* update ctime after xattr changed */ + if (rc == 0) { + ma->ma_attr_flags |= MDS_PERM_BYPASS; + mo_attr_set(env, child, ma); + } } else if (valid & OBD_MD_FLXATTRRM) { rc = mo_xattr_del(env, child, xattr_name); /* update ctime after xattr changed */