Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -373,8 +373,9 @@ extern const char *ceph_mds_op_name(int op);
/*
 * Ceph setxattr request flags.
 */
#define CEPH_XATTR_CREATE  1
#define CEPH_XATTR_REPLACE 2
#define CEPH_XATTR_CREATE  (1 << 0)
#define CEPH_XATTR_REPLACE (1 << 1)
#define CEPH_XATTR_REMOVE  (1 << 31)

union ceph_mds_request_args {
	struct {