ceph: fix setting empty extended attribute
authorYan, Zheng <zyan@redhat.com>
Wed, 17 Dec 2014 13:26:47 +0000 (21:26 +0800)
committerIlya Dryomov <idryomov@redhat.com>
Wed, 17 Dec 2014 17:18:49 +0000 (20:18 +0300)
make sure 'value' is not null. otherwise __ceph_setxattr will remove
the extended attribute.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
Reviewed-by: Sage Weil <sage@redhat.com>
fs/ceph/xattr.c

index 678b0d2bbbc4d6d8eaaa4ee64a310b212aeda655..5a492caf34cbbdbede390a00ecf534fdc7826a62 100644 (file)
@@ -854,7 +854,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
        struct ceph_pagelist *pagelist = NULL;
        int err;
 
-       if (value) {
+       if (size > 0) {
                /* copy value into pagelist */
                pagelist = kmalloc(sizeof(*pagelist), GFP_NOFS);
                if (!pagelist)
@@ -864,7 +864,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name,
                err = ceph_pagelist_append(pagelist, value, size);
                if (err)
                        goto out;
-       } else {
+       } else if (!value) {
                flags |= CEPH_XATTR_REMOVE;
        }
 
@@ -1001,6 +1001,9 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
        if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN))
                return generic_setxattr(dentry, name, value, size, flags);
 
+       if (size == 0)
+               value = "";  /* empty EA, do not remove */
+
        return __ceph_setxattr(dentry, name, value, size, flags);
 }