return res;
}
+int Client::_getvxattr(
+ Inode *in,
+ const UserPerm& perms,
+ const char *xattr_name,
+ ssize_t size,
+ void *value,
+ mds_rank_t rank)
+{
+ if (!xattr_name || strlen(xattr_name) <= 0 || strlen(xattr_name) > 255) {
+ return -CEPHFS_ENODATA;
+ }
+
+ MetaRequest *req = new MetaRequest(CEPH_MDS_OP_GETVXATTR);
+ filepath path;
+ in->make_nosnap_relative_path(path);
+ req->set_filepath(path);
+ req->set_inode(in);
+ req->set_string2(xattr_name);
+
+ bufferlist bl;
+ int res = make_request(req, perms, nullptr, nullptr, rank, &bl);
+ ldout(cct, 10) << __func__ << " result=" << res << dendl;
+
+ if (res < 0) {
+ return res;
+ }
+
+ std::string buf;
+ auto p = bl.cbegin();
+
+ DECODE_START(1, p);
+ decode(buf, p);
+ DECODE_FINISH(p);
+
+ ssize_t len = buf.length();
+
+ res = len; // refer to man getxattr(2) for output buffer size == 0
+
+ if (size > 0) {
+ if (len > size) {
+ res = -CEPHFS_ERANGE; // insufficient output buffer space
+ } else {
+ memcpy(value, buf.c_str(), len);
+ }
+ }
+ return res;
+}
+
int Client::_do_setattr(Inode *in, struct ceph_statx *stx, int mask,
const UserPerm& perms, InodeRef *inp)
{
const UserPerm& perms)
{
int r;
+ const VXattr *vxattr = nullptr;
- const VXattr *vxattr = _match_vxattr(in, name);
+ vxattr = _match_vxattr(in, name);
if (vxattr) {
r = -CEPHFS_ENODATA;
goto out;
}
+ if (!strncmp(name, "ceph.", 5)) {
+ r = _getvxattr(in, perms, name, size, value, MDS_RANK_NONE);
+ goto out;
+ }
+
if (acl_type == NO_ACL && !strncmp(name, "system.", 7)) {
r = -CEPHFS_EOPNOTSUPP;
goto out;
if (r == 0) {
string n(name);
r = -CEPHFS_ENODATA;
- if (in->xattrs.count(n)) {
+ if (in->xattrs.count(n)) {
r = in->xattrs[n].length();
if (r > 0 && size != 0) {
if (size >= (unsigned)r)
exists_cb: &Client::_vxattrcb_layout_exists,
flags: 0,
},
+ // FIXME
+ // Delete the following dir layout field definitions for release "S"
XATTR_LAYOUT_FIELD(dir, layout, stripe_unit),
XATTR_LAYOUT_FIELD(dir, layout, stripe_count),
XATTR_LAYOUT_FIELD(dir, layout, object_size),
},
XATTR_QUOTA_FIELD(quota, max_bytes),
XATTR_QUOTA_FIELD(quota, max_files),
+ // FIXME
+ // Delete the following dir pin field definitions for release "S"
{
name: "ceph.dir.pin",
getxattr_cb: &Client::_vxattrcb_dir_pin,
const UserPerm& perms);
int _getxattr(InodeRef &in, const char *name, void *value, size_t len,
const UserPerm& perms);
+ int _getvxattr(Inode *in, const UserPerm& perms, const char *attr_name,
+ ssize_t size, void *value, mds_rank_t rank);
int _listxattr(Inode *in, char *names, size_t len, const UserPerm& perms);
int _do_setxattr(Inode *in, const char *name, const void *value, size_t len,
int flags, const UserPerm& perms);