struct ceph_pagelist *pagelist = NULL;
        int err;
 
-       if (value) {
+       if (size > 0) {
                /* copy value into pagelist */
                pagelist = kmalloc(sizeof(*pagelist), GFP_NOFS);
                if (!pagelist)
                err = ceph_pagelist_append(pagelist, value, size);
                if (err)
                        goto out;
-       } else {
+       } else if (!value) {
                flags |= CEPH_XATTR_REMOVE;
        }
 
        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);
 }