diff mbox

[2/5] ceph: remove zero-size xattr

Message ID 1392096612-11481-2-git-send-email-zheng.z.yan@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Yan, Zheng Feb. 11, 2014, 5:30 a.m. UTC
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
---
 fs/ceph/xattr.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Alex Elder Feb. 11, 2014, 2:47 p.m. UTC | #1
On 02/10/2014 11:30 PM, Yan, Zheng wrote:
> Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>

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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yan, Zheng Feb. 11, 2014, 3:10 p.m. UTC | #2
On Tue, Feb 11, 2014 at 10:47 PM, Alex Elder <elder@ieee.org> wrote:
> On 02/10/2014 11:30 PM, Yan, Zheng wrote:
>> Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
>
> 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?

That is how other FS behave, at least for ext* and btrfs.

Regards
Yan, Zheng

>
> 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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Alex Elder Feb. 11, 2014, 5:25 p.m. UTC | #3
On 02/11/2014 09:10 AM, Yan, Zheng wrote:
> On Tue, Feb 11, 2014 at 10:47 PM, Alex Elder <elder@ieee.org> wrote:
>> On 02/10/2014 11:30 PM, Yan, Zheng wrote:
>>> Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
>>
>> 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?
> 
> That is how other FS behave, at least for ext* and btrfs.

I haven't tested this, I'm just glancing through code.
But it looks to me like a zero-length value is OK, but
a null value pointer means it should be deleted.  Note
in btrfs_setxattr(), for example, the same bit of code
I referenced before:

        if (size == 0)
                value = "";  /* empty EA, do not remove */

And ext4 seems to delete for a null value, but handle
an xattr whose value *length* is zero.  Same with XFS.

So again, I haven't verified through testing, but my
reading of the code (though rusty) still seems to show
that an attribute can have an empty (zero-size) value.

					-Alex

> Regards
> Yan, Zheng
> 
>>
>> 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@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

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