On 02/10/2014 11:30 PM, Yan, Zheng wrote: > Signed-off-by: Yan, Zheng <zheng.z.yan@xxxxxxxxx> You really need to explain better under what circumstances a zero-size xattr is getting removed. But apparently it's only when you're updating an xattr (not building it up from a blob from storage). Why are you doing this? Why can't an xattr exist with an empty value? Looking at generic_setxattr() in "fs/xattr.c" we see: if (size == 0) value = ""; /* empty EA, do not remove */ The code you have below looks OK, but it seems that you shouldn't be doing this. Am I missing something? -Alex > --- > fs/ceph/xattr.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c > index 28f9793..6ed0e5a 100644 > --- a/fs/ceph/xattr.c > +++ b/fs/ceph/xattr.c > @@ -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 (!val_len) { > + if (xattr) > + __remove_xattr(ci, xattr); > + kfree(name); > + return 0; > + } > } > > if (!xattr) { > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html