X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_xattr.c;h=9b1fe8eb8297b4162b398264bbc54f10626a685a;hb=39beec2289c74015f79fac872b09b1a6e3aadbad;hp=e9c7f864e98e8af90cd64681d87592992de0dc6d;hpb=bd0e522523b9381da8f8ee973572d3a365961e4d;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index e9c7f86..9b1fe8e 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -34,6 +34,13 @@ #endif #define DEBUG_SUBSYSTEM S_MDS +/* prerequisite for linux/xattr.h */ +#include +/* prerequisite for linux/xattr.h */ +#include +/* XATTR_{REPLACE,CREATE} */ +#include + #include "mdt_internal.h" @@ -103,9 +110,11 @@ int mdt_getxattr(struct mdt_thread_info *info) LASSERT(lu_object_assert_exists(info->mti_ctxt, &info->mti_object->mot_obj.mo_lu)); - if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) { - RETURN(rc = -ENOMEM); - } + CDEBUG(D_INODE, "getxattr "DFID3"\n", + PFID3(&info->mti_body->fid1)); + + if (MDT_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) + RETURN(-ENOMEM); next = mdt_object_child(info->mti_object); @@ -125,7 +134,7 @@ int mdt_getxattr(struct mdt_thread_info *info) CDEBUG(D_INODE, "getxattr %s\n", xattr_name); rc = mo_xattr_get(info->mti_ctxt, next, - buf, buflen, xattr_name); + buf, buflen, xattr_name); if (rc < 0 && rc != -ENODATA && rc != -EOPNOTSUPP && rc != -ERANGE) @@ -155,29 +164,30 @@ int mdt_setxattr(struct mdt_thread_info *info) const char user_string[] = "user."; const char trust_string[] = "trusted."; struct mdt_lock_handle *lh; - __u64 valid = info->mti_body->valid; + struct req_capsule *pill = &info->mti_pill; + struct mdt_object *obj = info->mti_object; + const struct mdt_body *body = info->mti_body; + const struct lu_context *ctx = info->mti_ctxt; + struct md_object *child = mdt_object_child(obj); + __u64 valid = body->valid; char *xattr_name; int xattr_len; __u64 lockpart; int rc; ENTRY; + CDEBUG(D_INODE, "setxattr "DFID3"\n", PFID3(&body->fid1)); - DEBUG_REQ(D_INODE, req, "setxattr "DFID3"\n", - PFID3(&info->mti_body->fid1)); - if (MDT_FAIL_CHECK(OBD_FAIL_MDS_SETXATTR)) { - RETURN(rc = -ENOMEM); - } + if (MDT_FAIL_CHECK(OBD_FAIL_MDS_SETXATTR)) + RETURN(-ENOMEM); /* various sanity check for xattr name */ - xattr_name = req_capsule_client_get(&info->mti_pill, &RMF_NAME); - if (!xattr_name) { + xattr_name = req_capsule_client_get(pill, &RMF_NAME); + if (!xattr_name) GOTO(out, rc = -EFAULT); - } CDEBUG(D_INODE, "%s xattr %s\n", - info->mti_body->valid & OBD_MD_FLXATTR ? "set" : "remove", - xattr_name); + body->valid & OBD_MD_FLXATTR ? "set" : "remove", xattr_name); if (strncmp(xattr_name, trust_string, sizeof(trust_string) - 1) == 0) { if (strcmp(xattr_name + 8, XATTR_NAME_LOV) == 0) @@ -195,41 +205,40 @@ int mdt_setxattr(struct mdt_thread_info *info) lh = &info->mti_lh[MDT_LH_PARENT]; lh->mlh_mode = LCK_EX; - rc = mdt_object_lock(info, info->mti_object, lh, lockpart); + rc = mdt_object_lock(info, obj, lh, lockpart); if (rc != 0) GOTO(out, rc); - if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY) - GOTO(out_unlock, rc = -EROFS); - if ((valid & OBD_MD_FLXATTR) == OBD_MD_FLXATTR) { char * xattr; - if (!req_capsule_field_present(&info->mti_pill, &RMF_EADATA)) { + if (!req_capsule_field_present(pill, &RMF_EADATA)) { CERROR("no xattr data supplied\n"); GOTO(out_unlock, rc = -EFAULT); } - xattr_len = req_capsule_get_size(&info->mti_pill, - &RMF_EADATA, RCL_CLIENT); + xattr_len = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT); if (xattr_len) { - xattr = req_capsule_client_get(&info->mti_pill, - &RMF_EADATA); + int flags = 0; + xattr = req_capsule_client_get(pill, &RMF_EADATA); + + if (body->flags & XATTR_REPLACE) + flags |= LU_XATTR_REPLACE; - rc = mo_xattr_set(info->mti_ctxt, - mdt_object_child(info->mti_object), - xattr, xattr_len, xattr_name); + if (body->flags & XATTR_CREATE) + flags |= LU_XATTR_CREATE; + + rc = mo_xattr_set(ctx, child, xattr, + xattr_len, xattr_name, flags); } } else if ((valid & OBD_MD_FLXATTRRM) == OBD_MD_FLXATTRRM) { - rc = mo_xattr_del(info->mti_ctxt, - mdt_object_child(info->mti_object), - xattr_name); + rc = mo_xattr_del(ctx, child, xattr_name); } else { - CERROR("valid bits: "LPX64"\n", info->mti_body->valid); + CERROR("valid bits: "LPX64"\n", body->valid); rc = -EINVAL; } EXIT; out_unlock: - mdt_object_unlock(info, info->mti_object, lh); + mdt_object_unlock(info, obj, lh, rc); out: return rc; }