|
@@ -12,6 +12,9 @@
|
|
|
#define XATTR_CEPH_PREFIX "ceph."
|
|
|
#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
|
|
|
* attributes are handled directly.
|
|
@@ -359,6 +362,12 @@ static int __set_xattr(struct ceph_inode_info *ci,
|
|
|
kfree(val);
|
|
|
return err;
|
|
|
}
|
|
|
+ if (update_xattr < 0) {
|
|
|
+ if (xattr)
|
|
|
+ __remove_xattr(ci, xattr);
|
|
|
+ kfree(name);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (!xattr) {
|
|
@@ -862,6 +871,9 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
|
|
|
|
|
|
dout("setxattr value=%.*s\n", (int)size, value);
|
|
|
|
|
|
+ if (!value)
|
|
|
+ flags |= CEPH_XATTR_REMOVE;
|
|
|
+
|
|
|
/* do request */
|
|
|
req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETXATTR,
|
|
|
USE_AUTH_MDS);
|
|
@@ -965,8 +977,8 @@ retry:
|
|
|
goto retry;
|
|
|
}
|
|
|
|
|
|
- err = __set_xattr(ci, newname, name_len, newval,
|
|
|
- val_len, flags, 1, &xattr);
|
|
|
+ err = __set_xattr(ci, newname, name_len, newval, val_len,
|
|
|
+ flags, value ? 1 : -1, &xattr);
|
|
|
|
|
|
if (!err) {
|
|
|
dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
|