int xattr_flags = 0;
if (!value)
- xattr_flags |= CEPH_XATTR_REMOVE;
+ xattr_flags |= CEPH_XATTR_REMOVE | CEPH_XATTR_REMOVE2;
if (flags & XATTR_CREATE)
xattr_flags |= CEPH_XATTR_CREATE;
if (flags & XATTR_REPLACE)
mode_t new_mode = in->mode;
if (value) {
int ret = posix_acl_equiv_mode(value, size, &new_mode);
+ ldout(cct, 3) << __func__ << "(" << in->ino << ", \"" << name << "\") = " << ret << dendl;
if (ret < 0)
return ret;
if (ret == 0) {
ret = -CEPHFS_EOPNOTSUPP;
}
+ if ((!strcmp(name, ACL_EA_ACCESS) ||
+ !strcmp(name, ACL_EA_DEFAULT)) &&
+ ret == -CEPHFS_ENODATA)
+ ret = 0;
+
return ret;
}
vinodeno_t vino = _get_vino(in);
- ldout(cct, 3) << __func__ << " " << vino << " " << name << " size " << size << dendl;
+ ldout(cct, 3) << __func__ << " " << vino << " " << name << " size " << size << " value " << !!value << dendl;
tout(cct) << __func__ << std::endl;
tout(cct) << vino.ino.val << std::endl;
tout(cct) << name << std::endl;
*/
#define CEPH_XATTR_CREATE (1 << 0)
#define CEPH_XATTR_REPLACE (1 << 1)
+#define CEPH_XATTR_REMOVE2 (1 << 30)
#define CEPH_XATTR_REMOVE (1 << 31)
/*
return -CEPHFS_ENODATA;
}
+ if ((flags & CEPH_XATTR_REMOVE2) && !(xattrs && xattrs->count(mempool::mds_co::string(xattr_name)))) {
+ dout(10) << "setxattr '" << xattr_name << "' XATTR_REMOVE2 and CEPHFS_ENODATA on " << *cur << dendl;
+ return -CEPHFS_ENODATA;
+ }
+
return 0;
}
pi.inode->change_attr++;
pi.inode->xattr_version++;
- if ((flags & CEPH_XATTR_REMOVE)) {
+ if ((flags & (CEPH_XATTR_REMOVE | CEPH_XATTR_REMOVE2))) {
std::invoke(handler->removexattr, this, cur, pi.xattrs, xattr_op);
} else {
std::invoke(handler->setxattr, this, cur, pi.xattrs, xattr_op);