diff mbox series

[v2,01/15] btrfs: add sysfs interface for supported sectorsize

Message ID 20210310090833.105015-2-wqu@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: support read-write for subpage metadata | expand

Commit Message

Qu Wenruo March 10, 2021, 9:08 a.m. UTC
Add extra sysfs interface features/supported_ro_sectorsize and
features/supported_rw_sectorsize to indicate subpage support.

Currently for supported_rw_sectorsize all architectures only have their
PAGE_SIZE listed.

While for supported_ro_sectorsize, for systems with 64K page size, 4K
sectorsize is also supported.

This new sysfs interface would help mkfs.btrfs to do more accurate
warning.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Comments

Anand Jain March 15, 2021, 11:59 a.m. UTC | #1
On 10/03/2021 17:08, Qu Wenruo wrote:
> Add extra sysfs interface features/supported_ro_sectorsize and
> features/supported_rw_sectorsize to indicate subpage support.
> 
> Currently for supported_rw_sectorsize all architectures only have their
> PAGE_SIZE listed.
> 
> While for supported_ro_sectorsize, for systems with 64K page size, 4K
> sectorsize is also supported.
> 
> This new sysfs interface would help mkfs.btrfs to do more accurate
> warning.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---

Changes looks good. Nit below...
And maybe it is a good idea to wait for other comments before reroll.

>   fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
>   1 file changed, 34 insertions(+)
> 
> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
> index 6eb1c50fa98c..3ef419899472 100644
> --- a/fs/btrfs/sysfs.c
> +++ b/fs/btrfs/sysfs.c
> @@ -360,11 +360,45 @@ static ssize_t supported_rescue_options_show(struct kobject *kobj,
>   BTRFS_ATTR(static_feature, supported_rescue_options,
>   	   supported_rescue_options_show);
>   
> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
> +					    struct kobj_attribute *a,
> +					    char *buf)
> +{
> +	ssize_t ret = 0;
> +	int i = 0;

  Drop variable i, as ret can be used instead of 'i'.

> +
> +	/* For 64K page size, 4K sector size is supported */
> +	if (PAGE_SIZE == SZ_64K) {
> +		ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
> +		i++;
> +	}
> +	/* Other than above subpage, only support PAGE_SIZE as sectorsize yet */
> +	ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",

> +			 (i ? " " : ""), PAGE_SIZE);
                           ^ret

> +	return ret;
> +}
> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
> +	   supported_ro_sectorsize_show);
> +
> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
> +					    struct kobj_attribute *a,
> +					    char *buf)
> +{
> +	ssize_t ret = 0;
> +
> +	/* Only PAGE_SIZE as sectorsize is supported */
> +	ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
> +	return ret;
> +}
> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
> +	   supported_rw_sectorsize_show);

  Why not merge supported_ro_sectorsize and supported_rw_sectorsize
  and show both in two lines...
  For example:
    cat supported_sectorsizes
    ro: 4096 65536
    rw: 65536



>   static struct attribute *btrfs_supported_static_feature_attrs[] = {
>   	BTRFS_ATTR_PTR(static_feature, rmdir_subvol),
>   	BTRFS_ATTR_PTR(static_feature, supported_checksums),
>   	BTRFS_ATTR_PTR(static_feature, send_stream_version),
>   	BTRFS_ATTR_PTR(static_feature, supported_rescue_options),
> +	BTRFS_ATTR_PTR(static_feature, supported_ro_sectorsize),
> +	BTRFS_ATTR_PTR(static_feature, supported_rw_sectorsize),
>   	NULL
>   };
>   
>
Qu Wenruo March 15, 2021, 12:39 p.m. UTC | #2
On 2021/3/15 下午7:59, Anand Jain wrote:
> On 10/03/2021 17:08, Qu Wenruo wrote:
>> Add extra sysfs interface features/supported_ro_sectorsize and
>> features/supported_rw_sectorsize to indicate subpage support.
>>
>> Currently for supported_rw_sectorsize all architectures only have their
>> PAGE_SIZE listed.
>>
>> While for supported_ro_sectorsize, for systems with 64K page size, 4K
>> sectorsize is also supported.
>>
>> This new sysfs interface would help mkfs.btrfs to do more accurate
>> warning.
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>
> Changes looks good. Nit below...
> And maybe it is a good idea to wait for other comments before reroll.
>
>>   fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
>>   1 file changed, 34 insertions(+)
>>
>> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
>> index 6eb1c50fa98c..3ef419899472 100644
>> --- a/fs/btrfs/sysfs.c
>> +++ b/fs/btrfs/sysfs.c
>> @@ -360,11 +360,45 @@ static ssize_t
>> supported_rescue_options_show(struct kobject *kobj,
>>   BTRFS_ATTR(static_feature, supported_rescue_options,
>>          supported_rescue_options_show);
>> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
>> +                        struct kobj_attribute *a,
>> +                        char *buf)
>> +{
>> +    ssize_t ret = 0;
>> +    int i = 0;
>
>   Drop variable i, as ret can be used instead of 'i'.
>
>> +
>> +    /* For 64K page size, 4K sector size is supported */
>> +    if (PAGE_SIZE == SZ_64K) {
>> +        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
>> +        i++;
>> +    }
>> +    /* Other than above subpage, only support PAGE_SIZE as sectorsize
>> yet */
>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
>
>> +             (i ? " " : ""), PAGE_SIZE);
>                            ^ret
>
>> +    return ret;
>> +}
>> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
>> +       supported_ro_sectorsize_show);
>> +
>> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
>> +                        struct kobj_attribute *a,
>> +                        char *buf)
>> +{
>> +    ssize_t ret = 0;
>> +
>> +    /* Only PAGE_SIZE as sectorsize is supported */
>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
>> +    return ret;
>> +}
>> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
>> +       supported_rw_sectorsize_show);
>
>   Why not merge supported_ro_sectorsize and supported_rw_sectorsize
>   and show both in two lines...
>   For example:
>     cat supported_sectorsizes
>     ro: 4096 65536
>     rw: 65536

If merged, btrfs-progs needs to do line number check before doing string
matching.

Although I doubt the usefulness for supported_ro_sectorsize, as the
window for RO support without RW support should not be that large.
(Current RW passes most generic test cases, and the remaining failures
are very limited)

Thus I can merged them into supported_sectorsize, and only report
sectorsize we can do RW as supported.

Thanks,
Qu

>
>
>
>>   static struct attribute *btrfs_supported_static_feature_attrs[] = {
>>       BTRFS_ATTR_PTR(static_feature, rmdir_subvol),
>>       BTRFS_ATTR_PTR(static_feature, supported_checksums),
>>       BTRFS_ATTR_PTR(static_feature, send_stream_version),
>>       BTRFS_ATTR_PTR(static_feature, supported_rescue_options),
>> +    BTRFS_ATTR_PTR(static_feature, supported_ro_sectorsize),
>> +    BTRFS_ATTR_PTR(static_feature, supported_rw_sectorsize),
>>       NULL
>>   };
>>
>
David Sterba March 15, 2021, 6:44 p.m. UTC | #3
On Mon, Mar 15, 2021 at 08:39:31PM +0800, Qu Wenruo wrote:
> 
> 
> On 2021/3/15 下午7:59, Anand Jain wrote:
> > On 10/03/2021 17:08, Qu Wenruo wrote:
> >> Add extra sysfs interface features/supported_ro_sectorsize and
> >> features/supported_rw_sectorsize to indicate subpage support.
> >>
> >> Currently for supported_rw_sectorsize all architectures only have their
> >> PAGE_SIZE listed.
> >>
> >> While for supported_ro_sectorsize, for systems with 64K page size, 4K
> >> sectorsize is also supported.
> >>
> >> This new sysfs interface would help mkfs.btrfs to do more accurate
> >> warning.
> >>
> >> Signed-off-by: Qu Wenruo <wqu@suse.com>
> >> ---
> >
> > Changes looks good. Nit below...
> > And maybe it is a good idea to wait for other comments before reroll.
> >
> >>   fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
> >>   1 file changed, 34 insertions(+)
> >>
> >> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
> >> index 6eb1c50fa98c..3ef419899472 100644
> >> --- a/fs/btrfs/sysfs.c
> >> +++ b/fs/btrfs/sysfs.c
> >> @@ -360,11 +360,45 @@ static ssize_t
> >> supported_rescue_options_show(struct kobject *kobj,
> >>   BTRFS_ATTR(static_feature, supported_rescue_options,
> >>          supported_rescue_options_show);
> >> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
> >> +                        struct kobj_attribute *a,
> >> +                        char *buf)
> >> +{
> >> +    ssize_t ret = 0;
> >> +    int i = 0;
> >
> >   Drop variable i, as ret can be used instead of 'i'.
> >
> >> +
> >> +    /* For 64K page size, 4K sector size is supported */
> >> +    if (PAGE_SIZE == SZ_64K) {
> >> +        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
> >> +        i++;
> >> +    }
> >> +    /* Other than above subpage, only support PAGE_SIZE as sectorsize
> >> yet */
> >> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
> >
> >> +             (i ? " " : ""), PAGE_SIZE);
> >                            ^ret
> >
> >> +    return ret;
> >> +}
> >> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
> >> +       supported_ro_sectorsize_show);
> >> +
> >> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
> >> +                        struct kobj_attribute *a,
> >> +                        char *buf)
> >> +{
> >> +    ssize_t ret = 0;
> >> +
> >> +    /* Only PAGE_SIZE as sectorsize is supported */
> >> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
> >> +    return ret;
> >> +}
> >> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
> >> +       supported_rw_sectorsize_show);
> >
> >   Why not merge supported_ro_sectorsize and supported_rw_sectorsize
> >   and show both in two lines...
> >   For example:
> >     cat supported_sectorsizes
> >     ro: 4096 65536
> >     rw: 65536
> 
> If merged, btrfs-progs needs to do line number check before doing string
> matching.

The sysfs files should do one value per file.

> Although I doubt the usefulness for supported_ro_sectorsize, as the
> window for RO support without RW support should not be that large.
> (Current RW passes most generic test cases, and the remaining failures
> are very limited)
> 
> Thus I can merged them into supported_sectorsize, and only report
> sectorsize we can do RW as supported.

In that case one file with the list of supported values is a better
option. The main point is to have full RW support, until then it's
interesting only for developers and they know what to expect.
Qu Wenruo March 16, 2021, 12:05 a.m. UTC | #4
On 2021/3/16 上午2:44, David Sterba wrote:
> On Mon, Mar 15, 2021 at 08:39:31PM +0800, Qu Wenruo wrote:
>>
>>
>> On 2021/3/15 下午7:59, Anand Jain wrote:
>>> On 10/03/2021 17:08, Qu Wenruo wrote:
>>>> Add extra sysfs interface features/supported_ro_sectorsize and
>>>> features/supported_rw_sectorsize to indicate subpage support.
>>>>
>>>> Currently for supported_rw_sectorsize all architectures only have their
>>>> PAGE_SIZE listed.
>>>>
>>>> While for supported_ro_sectorsize, for systems with 64K page size, 4K
>>>> sectorsize is also supported.
>>>>
>>>> This new sysfs interface would help mkfs.btrfs to do more accurate
>>>> warning.
>>>>
>>>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>>>> ---
>>>
>>> Changes looks good. Nit below...
>>> And maybe it is a good idea to wait for other comments before reroll.
>>>
>>>>    fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
>>>>    1 file changed, 34 insertions(+)
>>>>
>>>> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
>>>> index 6eb1c50fa98c..3ef419899472 100644
>>>> --- a/fs/btrfs/sysfs.c
>>>> +++ b/fs/btrfs/sysfs.c
>>>> @@ -360,11 +360,45 @@ static ssize_t
>>>> supported_rescue_options_show(struct kobject *kobj,
>>>>    BTRFS_ATTR(static_feature, supported_rescue_options,
>>>>           supported_rescue_options_show);
>>>> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
>>>> +                        struct kobj_attribute *a,
>>>> +                        char *buf)
>>>> +{
>>>> +    ssize_t ret = 0;
>>>> +    int i = 0;
>>>
>>>    Drop variable i, as ret can be used instead of 'i'.
>>>
>>>> +
>>>> +    /* For 64K page size, 4K sector size is supported */
>>>> +    if (PAGE_SIZE == SZ_64K) {
>>>> +        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
>>>> +        i++;
>>>> +    }
>>>> +    /* Other than above subpage, only support PAGE_SIZE as sectorsize
>>>> yet */
>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
>>>
>>>> +             (i ? " " : ""), PAGE_SIZE);
>>>                             ^ret
>>>
>>>> +    return ret;
>>>> +}
>>>> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
>>>> +       supported_ro_sectorsize_show);
>>>> +
>>>> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
>>>> +                        struct kobj_attribute *a,
>>>> +                        char *buf)
>>>> +{
>>>> +    ssize_t ret = 0;
>>>> +
>>>> +    /* Only PAGE_SIZE as sectorsize is supported */
>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
>>>> +    return ret;
>>>> +}
>>>> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
>>>> +       supported_rw_sectorsize_show);
>>>
>>>    Why not merge supported_ro_sectorsize and supported_rw_sectorsize
>>>    and show both in two lines...
>>>    For example:
>>>      cat supported_sectorsizes
>>>      ro: 4096 65536
>>>      rw: 65536
>>
>> If merged, btrfs-progs needs to do line number check before doing string
>> matching.
>
> The sysfs files should do one value per file.
>
>> Although I doubt the usefulness for supported_ro_sectorsize, as the
>> window for RO support without RW support should not be that large.
>> (Current RW passes most generic test cases, and the remaining failures
>> are very limited)
>>
>> Thus I can merged them into supported_sectorsize, and only report
>> sectorsize we can do RW as supported.
>
> In that case one file with the list of supported values is a better
> option. The main point is to have full RW support, until then it's
> interesting only for developers and they know what to expect.
>

Indeed only full RW support makes sense.

BTW, any comment on the file name? If no problem I would just use
"supported_sectorsize" in next update.

Although I hope the sysfs interface can be merged separately early, so
that I can add the proper support in btrfs-progs.

Thanks,
Qu
Anand Jain March 16, 2021, 12:10 a.m. UTC | #5
On 16/03/2021 08:05, Qu Wenruo wrote:
> 
> 
> On 2021/3/16 上午2:44, David Sterba wrote:
>> On Mon, Mar 15, 2021 at 08:39:31PM +0800, Qu Wenruo wrote:
>>>
>>>
>>> On 2021/3/15 下午7:59, Anand Jain wrote:
>>>> On 10/03/2021 17:08, Qu Wenruo wrote:
>>>>> Add extra sysfs interface features/supported_ro_sectorsize and
>>>>> features/supported_rw_sectorsize to indicate subpage support.
>>>>>
>>>>> Currently for supported_rw_sectorsize all architectures only have 
>>>>> their
>>>>> PAGE_SIZE listed.
>>>>>
>>>>> While for supported_ro_sectorsize, for systems with 64K page size, 4K
>>>>> sectorsize is also supported.
>>>>>
>>>>> This new sysfs interface would help mkfs.btrfs to do more accurate
>>>>> warning.
>>>>>
>>>>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>>>>> ---
>>>>
>>>> Changes looks good. Nit below...
>>>> And maybe it is a good idea to wait for other comments before reroll.
>>>>
>>>>>    fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
>>>>>    1 file changed, 34 insertions(+)
>>>>>
>>>>> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
>>>>> index 6eb1c50fa98c..3ef419899472 100644
>>>>> --- a/fs/btrfs/sysfs.c
>>>>> +++ b/fs/btrfs/sysfs.c
>>>>> @@ -360,11 +360,45 @@ static ssize_t
>>>>> supported_rescue_options_show(struct kobject *kobj,
>>>>>    BTRFS_ATTR(static_feature, supported_rescue_options,
>>>>>           supported_rescue_options_show);
>>>>> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
>>>>> +                        struct kobj_attribute *a,
>>>>> +                        char *buf)
>>>>> +{
>>>>> +    ssize_t ret = 0;
>>>>> +    int i = 0;
>>>>
>>>>    Drop variable i, as ret can be used instead of 'i'.
>>>>
>>>>> +
>>>>> +    /* For 64K page size, 4K sector size is supported */
>>>>> +    if (PAGE_SIZE == SZ_64K) {
>>>>> +        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
>>>>> +        i++;
>>>>> +    }
>>>>> +    /* Other than above subpage, only support PAGE_SIZE as sectorsize
>>>>> yet */
>>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
>>>>
>>>>> +             (i ? " " : ""), PAGE_SIZE);
>>>>                             ^ret
>>>>
>>>>> +    return ret;
>>>>> +}
>>>>> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
>>>>> +       supported_ro_sectorsize_show);
>>>>> +
>>>>> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
>>>>> +                        struct kobj_attribute *a,
>>>>> +                        char *buf)
>>>>> +{
>>>>> +    ssize_t ret = 0;
>>>>> +
>>>>> +    /* Only PAGE_SIZE as sectorsize is supported */
>>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
>>>>> +    return ret;
>>>>> +}
>>>>> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
>>>>> +       supported_rw_sectorsize_show);
>>>>
>>>>    Why not merge supported_ro_sectorsize and supported_rw_sectorsize
>>>>    and show both in two lines...
>>>>    For example:
>>>>      cat supported_sectorsizes
>>>>      ro: 4096 65536
>>>>      rw: 65536
>>>
>>> If merged, btrfs-progs needs to do line number check before doing string
>>> matching.
>>
>> The sysfs files should do one value per file.
>>
>>> Although I doubt the usefulness for supported_ro_sectorsize, as the
>>> window for RO support without RW support should not be that large.
>>> (Current RW passes most generic test cases, and the remaining failures
>>> are very limited)
>>>
>>> Thus I can merged them into supported_sectorsize, and only report
>>> sectorsize we can do RW as supported.
>>
>> In that case one file with the list of supported values is a better
>> option. The main point is to have full RW support, until then it's
>> interesting only for developers and they know what to expect.
>>
> 
> Indeed only full RW support makes sense.
> 
  Makes sense to me.

> BTW, any comment on the file name? If no problem I would just use
> "supported_sectorsize" in next update.

  supported_sectorsizes (plural) is better IMO.

Thanks, Anand

> Although I hope the sysfs interface can be merged separately early, so
> that I can add the proper support in btrfs-progs.
> 
> Thanks,
> Qu
David Sterba March 16, 2021, 10:25 a.m. UTC | #6
On Tue, Mar 16, 2021 at 08:10:13AM +0800, Anand Jain wrote:
> 
> 
> On 16/03/2021 08:05, Qu Wenruo wrote:
> > 
> > 
> > On 2021/3/16 上午2:44, David Sterba wrote:
> >> On Mon, Mar 15, 2021 at 08:39:31PM +0800, Qu Wenruo wrote:
> >>>
> >>>
> >>> On 2021/3/15 下午7:59, Anand Jain wrote:
> >>>> On 10/03/2021 17:08, Qu Wenruo wrote:
> >>>>> Add extra sysfs interface features/supported_ro_sectorsize and
> >>>>> features/supported_rw_sectorsize to indicate subpage support.
> >>>>>
> >>>>> Currently for supported_rw_sectorsize all architectures only have 
> >>>>> their
> >>>>> PAGE_SIZE listed.
> >>>>>
> >>>>> While for supported_ro_sectorsize, for systems with 64K page size, 4K
> >>>>> sectorsize is also supported.
> >>>>>
> >>>>> This new sysfs interface would help mkfs.btrfs to do more accurate
> >>>>> warning.
> >>>>>
> >>>>> Signed-off-by: Qu Wenruo <wqu@suse.com>
> >>>>> ---
> >>>>
> >>>> Changes looks good. Nit below...
> >>>> And maybe it is a good idea to wait for other comments before reroll.
> >>>>
> >>>>>    fs/btrfs/sysfs.c | 34 ++++++++++++++++++++++++++++++++++
> >>>>>    1 file changed, 34 insertions(+)
> >>>>>
> >>>>> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
> >>>>> index 6eb1c50fa98c..3ef419899472 100644
> >>>>> --- a/fs/btrfs/sysfs.c
> >>>>> +++ b/fs/btrfs/sysfs.c
> >>>>> @@ -360,11 +360,45 @@ static ssize_t
> >>>>> supported_rescue_options_show(struct kobject *kobj,
> >>>>>    BTRFS_ATTR(static_feature, supported_rescue_options,
> >>>>>           supported_rescue_options_show);
> >>>>> +static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
> >>>>> +                        struct kobj_attribute *a,
> >>>>> +                        char *buf)
> >>>>> +{
> >>>>> +    ssize_t ret = 0;
> >>>>> +    int i = 0;
> >>>>
> >>>>    Drop variable i, as ret can be used instead of 'i'.
> >>>>
> >>>>> +
> >>>>> +    /* For 64K page size, 4K sector size is supported */
> >>>>> +    if (PAGE_SIZE == SZ_64K) {
> >>>>> +        ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
> >>>>> +        i++;
> >>>>> +    }
> >>>>> +    /* Other than above subpage, only support PAGE_SIZE as sectorsize
> >>>>> yet */
> >>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
> >>>>
> >>>>> +             (i ? " " : ""), PAGE_SIZE);
> >>>>                             ^ret
> >>>>
> >>>>> +    return ret;
> >>>>> +}
> >>>>> +BTRFS_ATTR(static_feature, supported_ro_sectorsize,
> >>>>> +       supported_ro_sectorsize_show);
> >>>>> +
> >>>>> +static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
> >>>>> +                        struct kobj_attribute *a,
> >>>>> +                        char *buf)
> >>>>> +{
> >>>>> +    ssize_t ret = 0;
> >>>>> +
> >>>>> +    /* Only PAGE_SIZE as sectorsize is supported */
> >>>>> +    ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
> >>>>> +    return ret;
> >>>>> +}
> >>>>> +BTRFS_ATTR(static_feature, supported_rw_sectorsize,
> >>>>> +       supported_rw_sectorsize_show);
> >>>>
> >>>>    Why not merge supported_ro_sectorsize and supported_rw_sectorsize
> >>>>    and show both in two lines...
> >>>>    For example:
> >>>>      cat supported_sectorsizes
> >>>>      ro: 4096 65536
> >>>>      rw: 65536
> >>>
> >>> If merged, btrfs-progs needs to do line number check before doing string
> >>> matching.
> >>
> >> The sysfs files should do one value per file.
> >>
> >>> Although I doubt the usefulness for supported_ro_sectorsize, as the
> >>> window for RO support without RW support should not be that large.
> >>> (Current RW passes most generic test cases, and the remaining failures
> >>> are very limited)
> >>>
> >>> Thus I can merged them into supported_sectorsize, and only report
> >>> sectorsize we can do RW as supported.
> >>
> >> In that case one file with the list of supported values is a better
> >> option. The main point is to have full RW support, until then it's
> >> interesting only for developers and they know what to expect.
> >>
> > 
> > Indeed only full RW support makes sense.
> > 
>   Makes sense to me.
> 
> > BTW, any comment on the file name? If no problem I would just use
> > "supported_sectorsize" in next update.
> 
>   supported_sectorsizes (plural) is better IMO.

Yeah pluar is consistent with what we have now, eg. supported_checksums
David Sterba March 16, 2021, 10:27 a.m. UTC | #7
On Tue, Mar 16, 2021 at 08:05:31AM +0800, Qu Wenruo wrote:
> > In that case one file with the list of supported values is a better
> > option. The main point is to have full RW support, until then it's
> > interesting only for developers and they know what to expect.
> >
> 
> Indeed only full RW support makes sense.
> 
> BTW, any comment on the file name? If no problem I would just use
> "supported_sectorsize" in next update.
> 
> Although I hope the sysfs interface can be merged separately early, so
> that I can add the proper support in btrfs-progs.

Yeah, exporting the information via sysfs is the easy stuff so you can
postpone it as you need.
diff mbox series

Patch

diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index 6eb1c50fa98c..3ef419899472 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -360,11 +360,45 @@  static ssize_t supported_rescue_options_show(struct kobject *kobj,
 BTRFS_ATTR(static_feature, supported_rescue_options,
 	   supported_rescue_options_show);
 
+static ssize_t supported_ro_sectorsize_show(struct kobject *kobj,
+					    struct kobj_attribute *a,
+					    char *buf)
+{
+	ssize_t ret = 0;
+	int i = 0;
+
+	/* For 64K page size, 4K sector size is supported */
+	if (PAGE_SIZE == SZ_64K) {
+		ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%u", SZ_4K);
+		i++;
+	}
+	/* Other than above subpage, only support PAGE_SIZE as sectorsize yet */
+	ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%lu\n",
+			 (i ? " " : ""), PAGE_SIZE);
+	return ret;
+}
+BTRFS_ATTR(static_feature, supported_ro_sectorsize,
+	   supported_ro_sectorsize_show);
+
+static ssize_t supported_rw_sectorsize_show(struct kobject *kobj,
+					    struct kobj_attribute *a,
+					    char *buf)
+{
+	ssize_t ret = 0;
+
+	/* Only PAGE_SIZE as sectorsize is supported */
+	ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%lu\n", PAGE_SIZE);
+	return ret;
+}
+BTRFS_ATTR(static_feature, supported_rw_sectorsize,
+	   supported_rw_sectorsize_show);
 static struct attribute *btrfs_supported_static_feature_attrs[] = {
 	BTRFS_ATTR_PTR(static_feature, rmdir_subvol),
 	BTRFS_ATTR_PTR(static_feature, supported_checksums),
 	BTRFS_ATTR_PTR(static_feature, send_stream_version),
 	BTRFS_ATTR_PTR(static_feature, supported_rescue_options),
+	BTRFS_ATTR_PTR(static_feature, supported_ro_sectorsize),
+	BTRFS_ATTR_PTR(static_feature, supported_rw_sectorsize),
 	NULL
 };