if ((xattr_type == XATTR_ACL_ACCESS_T ||
xattr_type == XATTR_ACL_DEFAULT_T) &&
-#ifdef HAVE_INODE_OWNER_OR_CAPABLE
!inode_owner_or_capable(inode))
-#else
- !is_owner_or_cap(inode))
-#endif
return -EPERM;
/* b10667: ignore lustre special xattr for now */
{
struct ll_sb_info *sbi = ll_i2sbi(inode);
struct ptlrpc_request *req = NULL;
- struct mdt_body *body;
int xattr_type, rc;
void *xdata;
struct ll_inode_info *lli = ll_i2info(inode);
if (rc < 0)
GOTO(out_xattr, rc);
- body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
- LASSERT(body);
-
/* only detect the xattr size */
- if (size == 0) {
- /* LU-11109: Older MDTs do not distinguish
- * between nonexistent xattrs and zero length
- * values in this case. Newer MDTs will return
- * -ENODATA or set OBD_MD_FLXATTR. */
- GOTO(out, rc = body->mbo_eadatasize);
- }
+ if (size == 0)
+ GOTO(out, rc);
- if (size < body->mbo_eadatasize) {
- CERROR("server bug: replied size %u > %u\n",
- body->mbo_eadatasize, (int)size);
+ if (size < rc)
GOTO(out, rc = -ERANGE);
- }
-
- if (body->mbo_eadatasize == 0) {
- /* LU-11109: Newer MDTs set OBD_MD_FLXATTR on
- * success so that we can distinguish between
- * zero length value and nonexistent xattr.
- *
- * If OBD_MD_FLXATTR is not set then we keep
- * the old behavior and return -ENODATA for
- * getxattr() when mbo_eadatasize is 0. But
- * -ENODATA only makes sense for getxattr()
- * and not for listxattr(). */
- if (body->mbo_valid & OBD_MD_FLXATTR)
- GOTO(out, rc = 0);
- else if (valid == OBD_MD_FLXATTR)
- GOTO(out, rc = -ENODATA);
- else
- GOTO(out, rc = 0);
- }
/* do not need swab xattr data */
xdata = req_capsule_server_sized_get(&req->rq_pill, &RMF_EADATA,
- body->mbo_eadatasize);
+ rc);
if (!xdata)
- GOTO(out, rc = -EFAULT);
+ GOTO(out, rc = -EPROTO);
- memcpy(buffer, xdata, body->mbo_eadatasize);
- rc = body->mbo_eadatasize;
+ memcpy(buffer, xdata, rc);
}
EXIT;
out_xattr:
if (rc == -EOPNOTSUPP && xattr_type == XATTR_USER_T) {
LCONSOLE_INFO("%s: disabling user_xattr feature because "
- "it is not supported on the server: rc = %d\n",
- ll_get_fsname(inode->i_sb, NULL, 0), rc);
+ "it is not supported on the server: rc = %d\n",
+ ll_i2sbi(inode)->ll_fsname, rc);
sbi->ll_flags &= ~LL_SBI_USER_XATTR;
}
out:
.cl_buf.lb_len = buf_size,
};
__u16 refcheck;
+ __u32 magic;
if (obj == NULL)
RETURN(-ENODATA);
* otherwise it would confuse tar --xattr by
* recognizing layout gen as stripe offset when the
* file is restored. See LU-2809. */
- if (((struct lov_mds_md *)buf)->lmm_magic == LOV_MAGIC_COMP_V1)
+ magic = ((struct lov_mds_md *)buf)->lmm_magic;
+ if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_FOREIGN)
goto out_env;
((struct lov_mds_md *)buf)->lmm_layout_gen = 0;