|
@@ -79,7 +79,7 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
|
|
|
const char *ns_field = " pool_namespace=";
|
|
const char *ns_field = " pool_namespace=";
|
|
|
char buf[128];
|
|
char buf[128];
|
|
|
size_t len, total_len = 0;
|
|
size_t len, total_len = 0;
|
|
|
- int ret;
|
|
|
|
|
|
|
+ ssize_t ret;
|
|
|
|
|
|
|
|
pool_ns = ceph_try_get_string(ci->i_layout.pool_ns);
|
|
pool_ns = ceph_try_get_string(ci->i_layout.pool_ns);
|
|
|
|
|
|
|
@@ -103,11 +103,8 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val,
|
|
|
if (pool_ns)
|
|
if (pool_ns)
|
|
|
total_len += strlen(ns_field) + pool_ns->len;
|
|
total_len += strlen(ns_field) + pool_ns->len;
|
|
|
|
|
|
|
|
- if (!size) {
|
|
|
|
|
- ret = total_len;
|
|
|
|
|
- } else if (total_len > size) {
|
|
|
|
|
- ret = -ERANGE;
|
|
|
|
|
- } else {
|
|
|
|
|
|
|
+ ret = total_len;
|
|
|
|
|
+ if (size >= total_len) {
|
|
|
memcpy(val, buf, len);
|
|
memcpy(val, buf, len);
|
|
|
ret = len;
|
|
ret = len;
|
|
|
if (pool_name) {
|
|
if (pool_name) {
|
|
@@ -817,8 +814,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
|
|
|
if (err)
|
|
if (err)
|
|
|
return err;
|
|
return err;
|
|
|
err = -ENODATA;
|
|
err = -ENODATA;
|
|
|
- if (!(vxattr->exists_cb && !vxattr->exists_cb(ci)))
|
|
|
|
|
|
|
+ if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) {
|
|
|
err = vxattr->getxattr_cb(ci, value, size);
|
|
err = vxattr->getxattr_cb(ci, value, size);
|
|
|
|
|
+ if (size && size < err)
|
|
|
|
|
+ err = -ERANGE;
|
|
|
|
|
+ }
|
|
|
return err;
|
|
return err;
|
|
|
}
|
|
}
|
|
|
|
|
|