{
struct ll_sb_info *sbi = ll_i2sbi(inode);
struct ptlrpc_request *req;
- struct mdt_body *body;
void *lvbdata;
void *lmm;
int lmmsize;
* layout here. Please note that we can't use the LVB buffer in
* completion AST because it doesn't have a large enough buffer */
rc = ll_get_default_mdsize(sbi, &lmmsize);
- if (rc == 0)
- rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode),
- OBD_MD_FLXATTR, XATTR_NAME_LOV, lmmsize, &req);
if (rc < 0)
RETURN(rc);
- body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
- if (body == NULL)
- GOTO(out, rc = -EPROTO);
+ rc = md_getxattr(sbi->ll_md_exp, ll_inode2fid(inode), OBD_MD_FLXATTR,
+ XATTR_NAME_LOV, lmmsize, &req);
+ if (rc < 0)
+ RETURN(rc);
- lmmsize = body->mbo_eadatasize;
+ lmmsize = rc;
+ rc = 0;
if (lmmsize == 0) /* empty layout */
GOTO(out, rc = 0);
struct ll_inode_info *lli = ll_i2info(inode);
struct ll_sb_info *sbi = ll_i2sbi(inode);
struct ptlrpc_request *req = NULL;
- struct mdt_body *body;
void *xdata;
int rc;
ENTRY;
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;
{
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;
u64 obd_md_valid, const char *name, size_t buf_size,
struct ptlrpc_request **req)
{
+ struct mdt_body *body;
+ int rc;
+
LASSERT(obd_md_valid == OBD_MD_FLXATTR ||
obd_md_valid == OBD_MD_FLXATTRLS);
- return mdc_xattr_common(exp, &RQF_MDS_GETXATTR, fid, MDS_GETXATTR,
- obd_md_valid, name, NULL, 0, buf_size, 0, -1,
- req);
+ rc = mdc_xattr_common(exp, &RQF_MDS_GETXATTR, fid, MDS_GETXATTR,
+ obd_md_valid, name, NULL, 0, buf_size, 0, -1,
+ req);
+ if (rc < 0)
+ GOTO(out, rc);
+
+ body = req_capsule_server_get(&(*req)->rq_pill, &RMF_MDT_BODY);
+ if (body == NULL)
+ GOTO(out, rc = -EPROTO);
+
+ /* only detect the xattr size */
+ if (buf_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 (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 (obd_md_valid == OBD_MD_FLXATTR)
+ GOTO(out, rc = -ENODATA);
+ else
+ GOTO(out, rc = 0);
+ }
+
+ GOTO(out, rc = body->mbo_eadatasize);
+out:
+ if (rc < 0) {
+ ptlrpc_req_finished(*req);
+ *req = NULL;
+ }
+
+ return rc;
}
#ifdef CONFIG_FS_POSIX_ACL