diff options
author | Yan, Zheng <zyan@redhat.com> | 2014-12-17 08:26:47 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@redhat.com> | 2014-12-17 12:18:49 -0500 |
commit | 0aeff37abada9f8c08d2b10481a43d3ae406c823 (patch) | |
tree | 14b8ff5b4ab77f20fc9bf068923079b8b169ecb5 /fs/ceph/xattr.c | |
parent | 275dd19ea4e84c34f985ba097f9cddb539f54a50 (diff) |
ceph: fix setting empty extended attribute
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>
Diffstat (limited to 'fs/ceph/xattr.c')
-rw-r--r-- | fs/ceph/xattr.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 678b0d2bbbc4..5a492caf34cb 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
@@ -854,7 +854,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name, | |||
854 | struct ceph_pagelist *pagelist = NULL; | 854 | struct ceph_pagelist *pagelist = NULL; |
855 | int err; | 855 | int err; |
856 | 856 | ||
857 | if (value) { | 857 | if (size > 0) { |
858 | /* copy value into pagelist */ | 858 | /* copy value into pagelist */ |
859 | pagelist = kmalloc(sizeof(*pagelist), GFP_NOFS); | 859 | pagelist = kmalloc(sizeof(*pagelist), GFP_NOFS); |
860 | if (!pagelist) | 860 | if (!pagelist) |
@@ -864,7 +864,7 @@ static int ceph_sync_setxattr(struct dentry *dentry, const char *name, | |||
864 | err = ceph_pagelist_append(pagelist, value, size); | 864 | err = ceph_pagelist_append(pagelist, value, size); |
865 | if (err) | 865 | if (err) |
866 | goto out; | 866 | goto out; |
867 | } else { | 867 | } else if (!value) { |
868 | flags |= CEPH_XATTR_REMOVE; | 868 | flags |= CEPH_XATTR_REMOVE; |
869 | } | 869 | } |
870 | 870 | ||
@@ -1001,6 +1001,9 @@ int ceph_setxattr(struct dentry *dentry, const char *name, | |||
1001 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) | 1001 | if (!strncmp(name, XATTR_SYSTEM_PREFIX, XATTR_SYSTEM_PREFIX_LEN)) |
1002 | return generic_setxattr(dentry, name, value, size, flags); | 1002 | return generic_setxattr(dentry, name, value, size, flags); |
1003 | 1003 | ||
1004 | if (size == 0) | ||
1005 | value = ""; /* empty EA, do not remove */ | ||
1006 | |||
1004 | return __ceph_setxattr(dentry, name, value, size, flags); | 1007 | return __ceph_setxattr(dentry, name, value, size, flags); |
1005 | } | 1008 | } |
1006 | 1009 | ||