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 | |
| 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>
| -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 | ||
