Commit bcdfeb2e authored by Yan, Zheng's avatar Yan, Zheng Committed by Sage Weil

ceph: remove xattr when null value is given to setxattr()

For the setxattr request, introduce a new flag CEPH_XATTR_REMOVE
to distinguish null value case from the zero-length value case.
Signed-off-by: default avatarYan, Zheng <zheng.z.yan@intel.com>
parent fbc0b970
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
#define XATTR_CEPH_PREFIX "ceph." #define XATTR_CEPH_PREFIX "ceph."
#define XATTR_CEPH_PREFIX_LEN (sizeof (XATTR_CEPH_PREFIX) - 1) #define XATTR_CEPH_PREFIX_LEN (sizeof (XATTR_CEPH_PREFIX) - 1)
static int __remove_xattr(struct ceph_inode_info *ci,
struct ceph_inode_xattr *xattr);
/* /*
* List of handlers for synthetic system.* attributes. Other * List of handlers for synthetic system.* attributes. Other
* attributes are handled directly. * attributes are handled directly.
...@@ -359,6 +362,12 @@ static int __set_xattr(struct ceph_inode_info *ci, ...@@ -359,6 +362,12 @@ static int __set_xattr(struct ceph_inode_info *ci,
kfree(val); kfree(val);
return err; return err;
} }
if (update_xattr < 0) {
if (xattr)
__remove_xattr(ci, xattr);
kfree(name);
return 0;
}
} }
if (!xattr) { if (!xattr) {
...@@ -862,6 +871,9 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name, ...@@ -862,6 +871,9 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
dout("setxattr value=%.*s\n", (int)size, value); dout("setxattr value=%.*s\n", (int)size, value);
if (!value)
flags |= CEPH_XATTR_REMOVE;
/* do request */ /* do request */
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETXATTR, req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETXATTR,
USE_AUTH_MDS); USE_AUTH_MDS);
...@@ -965,8 +977,8 @@ int __ceph_setxattr(struct dentry *dentry, const char *name, ...@@ -965,8 +977,8 @@ int __ceph_setxattr(struct dentry *dentry, const char *name,
goto retry; goto retry;
} }
err = __set_xattr(ci, newname, name_len, newval, err = __set_xattr(ci, newname, name_len, newval, val_len,
val_len, flags, 1, &xattr); flags, value ? 1 : -1, &xattr);
if (!err) { if (!err) {
dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
......
...@@ -373,8 +373,9 @@ extern const char *ceph_mds_op_name(int op); ...@@ -373,8 +373,9 @@ extern const char *ceph_mds_op_name(int op);
/* /*
* Ceph setxattr request flags. * Ceph setxattr request flags.
*/ */
#define CEPH_XATTR_CREATE 1 #define CEPH_XATTR_CREATE (1 << 0)
#define CEPH_XATTR_REPLACE 2 #define CEPH_XATTR_REPLACE (1 << 1)
#define CEPH_XATTR_REMOVE (1 << 31)
union ceph_mds_request_args { union ceph_mds_request_args {
struct { struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment