diff mbox series

[v3,2/3] common/rc: Add a new _require_scratch_extsize helper function

Message ID 4412cece5c3f2175fa076a3b29fe6d0bb4c43a6e.1732126365.git.nirjhar@linux.ibm.com (mailing list archive)
State Not Applicable, archived
Headers show
Series Addition of new tests for extsize hints | expand

Commit Message

Nirjhar Roy Nov. 21, 2024, 5:09 a.m. UTC
_require_scratch_extsize helper function will be used in the
the next patch to make the test run only on filesystems with
extsize support.

Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
---
 common/rc | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Comments

Ritesh Harjani (IBM) Nov. 21, 2024, 7:53 a.m. UTC | #1
Nirjhar Roy <nirjhar@linux.ibm.com> writes:

> _require_scratch_extsize helper function will be used in the
> the next patch to make the test run only on filesystems with
> extsize support.
>
> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> ---
>  common/rc | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>
> diff --git a/common/rc b/common/rc
> index cccc98f5..995979e9 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
>  	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
>  }
>  
> +# This test requires extsize support on the  filesystem
> +_require_scratch_extsize()
> +{
> +	_require_scratch

_require_xfs_io_command "extsize"

^^^ Don't we need this too?

> +	_scratch_mkfs > /dev/null
> +	_scratch_mount
> +	local filename=$SCRATCH_MNT/$RANDOM
> +	local blksz=$(_get_block_size $SCRATCH_MNT)
> +	local extsz=$(( blksz*2 ))
> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
> +		-c "extsize")
> +	_scratch_unmount
> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
> +		_notrun "this test requires extsize support on the filesystem"

Why grep when we can simply just check the return value of previous xfs_io command?

> +}
> +
> +

^^ Extra newline.

>  # Write a byte into a range of a file
>  _pwrite_byte() {
>  	local pattern="$1"
> -- 
> 2.43.5
Nirjhar Roy Nov. 21, 2024, 6:33 p.m. UTC | #2
On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>
>> _require_scratch_extsize helper function will be used in the
>> the next patch to make the test run only on filesystems with
>> extsize support.
>>
>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>> ---
>>   common/rc | 17 +++++++++++++++++
>>   1 file changed, 17 insertions(+)
>>
>> diff --git a/common/rc b/common/rc
>> index cccc98f5..995979e9 100644
>> --- a/common/rc
>> +++ b/common/rc
>> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
>>   	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
>>   }
>>   
>> +# This test requires extsize support on the  filesystem
>> +_require_scratch_extsize()
>> +{
>> +	_require_scratch
> _require_xfs_io_command "extsize"
>
> ^^^ Don't we need this too?
Yes, good point. I will add this in the next revision.
>
>> +	_scratch_mkfs > /dev/null
>> +	_scratch_mount
>> +	local filename=$SCRATCH_MNT/$RANDOM
>> +	local blksz=$(_get_block_size $SCRATCH_MNT)
>> +	local extsz=$(( blksz*2 ))
>> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
>> +		-c "extsize")
>> +	_scratch_unmount
>> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
>> +		_notrun "this test requires extsize support on the filesystem"
> Why grep when we can simply just check the return value of previous xfs_io command?
No, I don't think we can rely on the return value of xfs_io. For ex, 
let's look at the following set of commands which are ran on an ext4 system:

root@AMARPC: /mnt1/test$ xfs_io -V
xfs_io version 5.13.0
root@AMARPC: /mnt1/test$ touch new
root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
foreign file active, extsize command is for XFS filesystems only
root@AMARPC: /mnt1/test$ echo "$?"
0
This incorrect return value might have been fixed in some later versions 
of xfs_io but there are still versions where we can't solely rely on the 
return value.
>
>> +}
>> +
>> +
> ^^ Extra newline.

Noted. I will fix this.

--NR

>
>>   # Write a byte into a range of a file
>>   _pwrite_byte() {
>>   	local pattern="$1"
>> -- 
>> 2.43.5
Ritesh Harjani (IBM) Nov. 21, 2024, 6:52 p.m. UTC | #3
Nirjhar Roy <nirjhar@linux.ibm.com> writes:

> On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
>> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>>
>>> _require_scratch_extsize helper function will be used in the
>>> the next patch to make the test run only on filesystems with
>>> extsize support.
>>>
>>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>>> ---
>>>   common/rc | 17 +++++++++++++++++
>>>   1 file changed, 17 insertions(+)
>>>
>>> diff --git a/common/rc b/common/rc
>>> index cccc98f5..995979e9 100644
>>> --- a/common/rc
>>> +++ b/common/rc
>>> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
>>>   	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
>>>   }
>>>   
>>> +# This test requires extsize support on the  filesystem
>>> +_require_scratch_extsize()
>>> +{
>>> +	_require_scratch
>> _require_xfs_io_command "extsize"
>>
>> ^^^ Don't we need this too?
> Yes, good point. I will add this in the next revision.
>>
>>> +	_scratch_mkfs > /dev/null
>>> +	_scratch_mount
>>> +	local filename=$SCRATCH_MNT/$RANDOM
>>> +	local blksz=$(_get_block_size $SCRATCH_MNT)
>>> +	local extsz=$(( blksz*2 ))
>>> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
>>> +		-c "extsize")
>>> +	_scratch_unmount
>>> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
>>> +		_notrun "this test requires extsize support on the filesystem"
>> Why grep when we can simply just check the return value of previous xfs_io command?
> No, I don't think we can rely on the return value of xfs_io. For ex, 
> let's look at the following set of commands which are ran on an ext4 system:
>
> root@AMARPC: /mnt1/test$ xfs_io -V
> xfs_io version 5.13.0
> root@AMARPC: /mnt1/test$ touch new
> root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
> foreign file active, extsize command is for XFS filesystems only
> root@AMARPC: /mnt1/test$ echo "$?"
> 0
> This incorrect return value might have been fixed in some later versions 
> of xfs_io but there are still versions where we can't solely rely on the 
> return value.

Ok. That's bad, we then have to rely on grep.
Sure, thanks for checking and confirming that.

-ritesh
Darrick J. Wong Nov. 22, 2024, 4:04 p.m. UTC | #4
On Fri, Nov 22, 2024 at 12:22:41AM +0530, Ritesh Harjani wrote:
> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
> 
> > On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
> >> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
> >>
> >>> _require_scratch_extsize helper function will be used in the
> >>> the next patch to make the test run only on filesystems with
> >>> extsize support.
> >>>
> >>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> >>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> >>> ---
> >>>   common/rc | 17 +++++++++++++++++
> >>>   1 file changed, 17 insertions(+)
> >>>
> >>> diff --git a/common/rc b/common/rc
> >>> index cccc98f5..995979e9 100644
> >>> --- a/common/rc
> >>> +++ b/common/rc
> >>> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
> >>>   	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
> >>>   }
> >>>   
> >>> +# This test requires extsize support on the  filesystem
> >>> +_require_scratch_extsize()
> >>> +{
> >>> +	_require_scratch
> >> _require_xfs_io_command "extsize"
> >>
> >> ^^^ Don't we need this too?
> > Yes, good point. I will add this in the next revision.
> >>
> >>> +	_scratch_mkfs > /dev/null
> >>> +	_scratch_mount
> >>> +	local filename=$SCRATCH_MNT/$RANDOM
> >>> +	local blksz=$(_get_block_size $SCRATCH_MNT)
> >>> +	local extsz=$(( blksz*2 ))
> >>> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
> >>> +		-c "extsize")
> >>> +	_scratch_unmount
> >>> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
> >>> +		_notrun "this test requires extsize support on the filesystem"
> >> Why grep when we can simply just check the return value of previous xfs_io command?
> > No, I don't think we can rely on the return value of xfs_io. For ex, 
> > let's look at the following set of commands which are ran on an ext4 system:
> >
> > root@AMARPC: /mnt1/test$ xfs_io -V
> > xfs_io version 5.13.0
> > root@AMARPC: /mnt1/test$ touch new
> > root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
> > foreign file active, extsize command is for XFS filesystems only
> > root@AMARPC: /mnt1/test$ echo "$?"
> > 0
> > This incorrect return value might have been fixed in some later versions 
> > of xfs_io but there are still versions where we can't solely rely on the 
> > return value.
> 
> Ok. That's bad, we then have to rely on grep.
> Sure, thanks for checking and confirming that.

You all should add CMD_FOREIGN_OK to the extsize command in xfs_io,
assuming that you've not already done that in your dev workspace.

--D

> -ritesh
>
Nirjhar Roy Nov. 22, 2024, 6:07 p.m. UTC | #5
On 11/22/24 21:34, Darrick J. Wong wrote:
> On Fri, Nov 22, 2024 at 12:22:41AM +0530, Ritesh Harjani wrote:
>> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>>
>>> On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
>>>> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>>>>
>>>>> _require_scratch_extsize helper function will be used in the
>>>>> the next patch to make the test run only on filesystems with
>>>>> extsize support.
>>>>>
>>>>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>>>>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>>>>> ---
>>>>>    common/rc | 17 +++++++++++++++++
>>>>>    1 file changed, 17 insertions(+)
>>>>>
>>>>> diff --git a/common/rc b/common/rc
>>>>> index cccc98f5..995979e9 100644
>>>>> --- a/common/rc
>>>>> +++ b/common/rc
>>>>> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
>>>>>    	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
>>>>>    }
>>>>>    
>>>>> +# This test requires extsize support on the  filesystem
>>>>> +_require_scratch_extsize()
>>>>> +{
>>>>> +	_require_scratch
>>>> _require_xfs_io_command "extsize"
>>>>
>>>> ^^^ Don't we need this too?
>>> Yes, good point. I will add this in the next revision.
>>>>> +	_scratch_mkfs > /dev/null
>>>>> +	_scratch_mount
>>>>> +	local filename=$SCRATCH_MNT/$RANDOM
>>>>> +	local blksz=$(_get_block_size $SCRATCH_MNT)
>>>>> +	local extsz=$(( blksz*2 ))
>>>>> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
>>>>> +		-c "extsize")
>>>>> +	_scratch_unmount
>>>>> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
>>>>> +		_notrun "this test requires extsize support on the filesystem"
>>>> Why grep when we can simply just check the return value of previous xfs_io command?
>>> No, I don't think we can rely on the return value of xfs_io. For ex,
>>> let's look at the following set of commands which are ran on an ext4 system:
>>>
>>> root@AMARPC: /mnt1/test$ xfs_io -V
>>> xfs_io version 5.13.0
>>> root@AMARPC: /mnt1/test$ touch new
>>> root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
>>> foreign file active, extsize command is for XFS filesystems only
>>> root@AMARPC: /mnt1/test$ echo "$?"
>>> 0
>>> This incorrect return value might have been fixed in some later versions
>>> of xfs_io but there are still versions where we can't solely rely on the
>>> return value.
>> Ok. That's bad, we then have to rely on grep.
>> Sure, thanks for checking and confirming that.
> You all should add CMD_FOREIGN_OK to the extsize command in xfs_io,
> assuming that you've not already done that in your dev workspace.
>
> --D

Yes, I have tested with that as well. I have applied the following patch 
to xfsprogs and tested with the modified xfs_io.

diff --git a/io/open.c b/io/open.c
index 15850b55..6407b7e8 100644
--- a/io/open.c
+++ b/io/open.c
@@ -980,7 +980,7 @@ open_init(void)
         extsize_cmd.args = _("[-D | -R] [extsize]");
         extsize_cmd.argmin = 0;
         extsize_cmd.argmax = -1;
-       extsize_cmd.flags = CMD_NOMAP_OK;
+       extsize_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
         extsize_cmd.oneline =
                 _("get/set preferred extent size (in bytes) for the 
open file");
         extsize_cmd.help = extsize_help;

The return values are similar.

root@AMARPC: /mnt1/scratch$ touch new
root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c 
"extsize 8k" new
root@AMARPC: /mnt1/scratch$ echo "$?"
0
root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c 
"extsize" new
[0] new

This is the reason I am not relying on the return value, instead I am 
checking if only the extsize gets changed, we will assume that the 
extsize support is there, else the test will _notrun.

Also,

root@AMARPC: /mnt1/scratch$ strace -f /mnt1/scratch$ 
/home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize 16k" new

...

...

ioctl(3, FS_IOC_FSGETXATTR, {fsx_xflags=0, fsx_extsize=0, 
fsx_nextents=0, fsx_projid=0, fsx_cowextsize=0}) = 0
ioctl(3, FS_IOC_FSSETXATTR, {fsx_xflags=FS_XFLAG_EXTSIZE, 
fsx_extsize=16384, fsx_projid=0, fsx_cowextsize=0}) = 0
exit_group(0)

Looking at the existing code for ext4_fileattr_set(), We validate the 
flags but I think we silently don't validate(and ignore) the xflags. 
Like, we have

int err = -EOPNOTSUPP;
if (flags & ~EXT4_FL_USER_VISIBLE)
         goto out;

BUT we do NOT have something like

int err = -EOPNOTSUPP;
if (fa->fsx_flags & ~EXT4_VALID_XFLAGS) // where EXT4_VALID_XFLAGS 
should be an || of all the supported xflags in ext4.
         goto out;

I am not sure what other filesystems do, but if we check whether the 
extsize got changed, then we can correctly determine extsize support.

Does that make sense?

--NR



>
>> -ritesh
>>
Darrick J. Wong Nov. 22, 2024, 6:44 p.m. UTC | #6
On Fri, Nov 22, 2024 at 11:37:17PM +0530, Nirjhar Roy wrote:
> 
> On 11/22/24 21:34, Darrick J. Wong wrote:
> > On Fri, Nov 22, 2024 at 12:22:41AM +0530, Ritesh Harjani wrote:
> > > Nirjhar Roy <nirjhar@linux.ibm.com> writes:
> > > 
> > > > On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
> > > > > Nirjhar Roy <nirjhar@linux.ibm.com> writes:
> > > > > 
> > > > > > _require_scratch_extsize helper function will be used in the
> > > > > > the next patch to make the test run only on filesystems with
> > > > > > extsize support.
> > > > > > 
> > > > > > Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
> > > > > > Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
> > > > > > ---
> > > > > >    common/rc | 17 +++++++++++++++++
> > > > > >    1 file changed, 17 insertions(+)
> > > > > > 
> > > > > > diff --git a/common/rc b/common/rc
> > > > > > index cccc98f5..995979e9 100644
> > > > > > --- a/common/rc
> > > > > > +++ b/common/rc
> > > > > > @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
> > > > > >    	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
> > > > > >    }
> > > > > > +# This test requires extsize support on the  filesystem
> > > > > > +_require_scratch_extsize()
> > > > > > +{
> > > > > > +	_require_scratch
> > > > > _require_xfs_io_command "extsize"
> > > > > 
> > > > > ^^^ Don't we need this too?
> > > > Yes, good point. I will add this in the next revision.
> > > > > > +	_scratch_mkfs > /dev/null
> > > > > > +	_scratch_mount
> > > > > > +	local filename=$SCRATCH_MNT/$RANDOM
> > > > > > +	local blksz=$(_get_block_size $SCRATCH_MNT)
> > > > > > +	local extsz=$(( blksz*2 ))
> > > > > > +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
> > > > > > +		-c "extsize")
> > > > > > +	_scratch_unmount
> > > > > > +	grep -q "\[$extsz\] $filename" <(echo $res) || \
> > > > > > +		_notrun "this test requires extsize support on the filesystem"
> > > > > Why grep when we can simply just check the return value of previous xfs_io command?
> > > > No, I don't think we can rely on the return value of xfs_io. For ex,
> > > > let's look at the following set of commands which are ran on an ext4 system:
> > > > 
> > > > root@AMARPC: /mnt1/test$ xfs_io -V
> > > > xfs_io version 5.13.0
> > > > root@AMARPC: /mnt1/test$ touch new
> > > > root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
> > > > foreign file active, extsize command is for XFS filesystems only
> > > > root@AMARPC: /mnt1/test$ echo "$?"
> > > > 0
> > > > This incorrect return value might have been fixed in some later versions
> > > > of xfs_io but there are still versions where we can't solely rely on the
> > > > return value.
> > > Ok. That's bad, we then have to rely on grep.
> > > Sure, thanks for checking and confirming that.
> > You all should add CMD_FOREIGN_OK to the extsize command in xfs_io,
> > assuming that you've not already done that in your dev workspace.
> > 
> > --D
> 
> Yes, I have tested with that as well. I have applied the following patch to
> xfsprogs and tested with the modified xfs_io.
> 
> diff --git a/io/open.c b/io/open.c
> index 15850b55..6407b7e8 100644
> --- a/io/open.c
> +++ b/io/open.c
> @@ -980,7 +980,7 @@ open_init(void)
>         extsize_cmd.args = _("[-D | -R] [extsize]");
>         extsize_cmd.argmin = 0;
>         extsize_cmd.argmax = -1;
> -       extsize_cmd.flags = CMD_NOMAP_OK;
> +       extsize_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
>         extsize_cmd.oneline =
>                 _("get/set preferred extent size (in bytes) for the open
> file");
>         extsize_cmd.help = extsize_help;
> 
> The return values are similar.
> 
> root@AMARPC: /mnt1/scratch$ touch new
> root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize
> 8k" new
> root@AMARPC: /mnt1/scratch$ echo "$?"
> 0
> root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize"
> new
> [0] new
> 
> This is the reason I am not relying on the return value, instead I am
> checking if only the extsize gets changed, we will assume that the extsize
> support is there, else the test will _notrun.
> 
> Also,
> 
> root@AMARPC: /mnt1/scratch$ strace -f /mnt1/scratch$
> /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize 16k" new
> 
> ...
> 
> ...
> 
> ioctl(3, FS_IOC_FSGETXATTR, {fsx_xflags=0, fsx_extsize=0, fsx_nextents=0,
> fsx_projid=0, fsx_cowextsize=0}) = 0
> ioctl(3, FS_IOC_FSSETXATTR, {fsx_xflags=FS_XFLAG_EXTSIZE, fsx_extsize=16384,
> fsx_projid=0, fsx_cowextsize=0}) = 0
> exit_group(0)
> 
> Looking at the existing code for ext4_fileattr_set(), We validate the flags
> but I think we silently don't validate(and ignore) the xflags. Like, we have
> 
> int err = -EOPNOTSUPP;
> if (flags & ~EXT4_FL_USER_VISIBLE)
>         goto out;
> 
> BUT we do NOT have something like
> 
> int err = -EOPNOTSUPP;
> if (fa->fsx_flags & ~EXT4_VALID_XFLAGS) // where EXT4_VALID_XFLAGS should be
> an || of all the supported xflags in ext4.
>         goto out;
> 
> I am not sure what other filesystems do, but if we check whether the extsize
> got changed, then we can correctly determine extsize support.
> 
> Does that make sense?

You don't have to check fsx_flags if you don't use fileattr_fill_xflags.
ext4 doesn't use that.

--D

> --NR
> 
> 
> 
> > 
> > > -ritesh
> > > 
> -- 
> ---
> Nirjhar Roy
> Linux Kernel Developer
> IBM, Bangalore
>
Nirjhar Roy Nov. 22, 2024, 7:06 p.m. UTC | #7
On 11/23/24 00:14, Darrick J. Wong wrote:
> On Fri, Nov 22, 2024 at 11:37:17PM +0530, Nirjhar Roy wrote:
>> On 11/22/24 21:34, Darrick J. Wong wrote:
>>> On Fri, Nov 22, 2024 at 12:22:41AM +0530, Ritesh Harjani wrote:
>>>> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>>>>
>>>>> On 11/21/24 13:23, Ritesh Harjani (IBM) wrote:
>>>>>> Nirjhar Roy <nirjhar@linux.ibm.com> writes:
>>>>>>
>>>>>>> _require_scratch_extsize helper function will be used in the
>>>>>>> the next patch to make the test run only on filesystems with
>>>>>>> extsize support.
>>>>>>>
>>>>>>> Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
>>>>>>> Signed-off-by: Nirjhar Roy <nirjhar@linux.ibm.com>
>>>>>>> ---
>>>>>>>     common/rc | 17 +++++++++++++++++
>>>>>>>     1 file changed, 17 insertions(+)
>>>>>>>
>>>>>>> diff --git a/common/rc b/common/rc
>>>>>>> index cccc98f5..995979e9 100644
>>>>>>> --- a/common/rc
>>>>>>> +++ b/common/rc
>>>>>>> @@ -48,6 +48,23 @@ _test_fsxattr_xflag()
>>>>>>>     	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
>>>>>>>     }
>>>>>>> +# This test requires extsize support on the  filesystem
>>>>>>> +_require_scratch_extsize()
>>>>>>> +{
>>>>>>> +	_require_scratch
>>>>>> _require_xfs_io_command "extsize"
>>>>>>
>>>>>> ^^^ Don't we need this too?
>>>>> Yes, good point. I will add this in the next revision.
>>>>>>> +	_scratch_mkfs > /dev/null
>>>>>>> +	_scratch_mount
>>>>>>> +	local filename=$SCRATCH_MNT/$RANDOM
>>>>>>> +	local blksz=$(_get_block_size $SCRATCH_MNT)
>>>>>>> +	local extsz=$(( blksz*2 ))
>>>>>>> +	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
>>>>>>> +		-c "extsize")
>>>>>>> +	_scratch_unmount
>>>>>>> +	grep -q "\[$extsz\] $filename" <(echo $res) || \
>>>>>>> +		_notrun "this test requires extsize support on the filesystem"
>>>>>> Why grep when we can simply just check the return value of previous xfs_io command?
>>>>> No, I don't think we can rely on the return value of xfs_io. For ex,
>>>>> let's look at the following set of commands which are ran on an ext4 system:
>>>>>
>>>>> root@AMARPC: /mnt1/test$ xfs_io -V
>>>>> xfs_io version 5.13.0
>>>>> root@AMARPC: /mnt1/test$ touch new
>>>>> root@AMARPC: /mnt1/test$ xfs_io -c "extsize 8k"  new
>>>>> foreign file active, extsize command is for XFS filesystems only
>>>>> root@AMARPC: /mnt1/test$ echo "$?"
>>>>> 0
>>>>> This incorrect return value might have been fixed in some later versions
>>>>> of xfs_io but there are still versions where we can't solely rely on the
>>>>> return value.
>>>> Ok. That's bad, we then have to rely on grep.
>>>> Sure, thanks for checking and confirming that.
>>> You all should add CMD_FOREIGN_OK to the extsize command in xfs_io,
>>> assuming that you've not already done that in your dev workspace.
>>>
>>> --D
>> Yes, I have tested with that as well. I have applied the following patch to
>> xfsprogs and tested with the modified xfs_io.
>>
>> diff --git a/io/open.c b/io/open.c
>> index 15850b55..6407b7e8 100644
>> --- a/io/open.c
>> +++ b/io/open.c
>> @@ -980,7 +980,7 @@ open_init(void)
>>          extsize_cmd.args = _("[-D | -R] [extsize]");
>>          extsize_cmd.argmin = 0;
>>          extsize_cmd.argmax = -1;
>> -       extsize_cmd.flags = CMD_NOMAP_OK;
>> +       extsize_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
>>          extsize_cmd.oneline =
>>                  _("get/set preferred extent size (in bytes) for the open
>> file");
>>          extsize_cmd.help = extsize_help;
>>
>> The return values are similar.
>>
>> root@AMARPC: /mnt1/scratch$ touch new
>> root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize
>> 8k" new
>> root@AMARPC: /mnt1/scratch$ echo "$?"
>> 0
>> root@AMARPC: /mnt1/scratch$ /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize"
>> new
>> [0] new
>>
>> This is the reason I am not relying on the return value, instead I am
>> checking if only the extsize gets changed, we will assume that the extsize
>> support is there, else the test will _notrun.
>>
>> Also,
>>
>> root@AMARPC: /mnt1/scratch$ strace -f /mnt1/scratch$
>> /home/ubuntu/xfsprogs-dev/io/xfs_io -c "extsize 16k" new
>>
>> ...
>>
>> ...
>>
>> ioctl(3, FS_IOC_FSGETXATTR, {fsx_xflags=0, fsx_extsize=0, fsx_nextents=0,
>> fsx_projid=0, fsx_cowextsize=0}) = 0
>> ioctl(3, FS_IOC_FSSETXATTR, {fsx_xflags=FS_XFLAG_EXTSIZE, fsx_extsize=16384,
>> fsx_projid=0, fsx_cowextsize=0}) = 0
>> exit_group(0)
>>
>> Looking at the existing code for ext4_fileattr_set(), We validate the flags
>> but I think we silently don't validate(and ignore) the xflags. Like, we have
>>
>> int err = -EOPNOTSUPP;
>> if (flags & ~EXT4_FL_USER_VISIBLE)
>>          goto out;
>>
>> BUT we do NOT have something like
>>
>> int err = -EOPNOTSUPP;
>> if (fa->fsx_flags & ~EXT4_VALID_XFLAGS) // where EXT4_VALID_XFLAGS should be
>> an || of all the supported xflags in ext4.
>>          goto out;
>>
>> I am not sure what other filesystems do, but if we check whether the extsize
>> got changed, then we can correctly determine extsize support.
>>
>> Does that make sense?
> You don't have to check fsx_flags if you don't use fileattr_fill_xflags.
> ext4 doesn't use that.
>
> --D
Okay got it. Thank you. How does the overall logic of the 
_require_scratch_extsize() look?
>
>> --NR
>>
>>
>>
>>>> -ritesh
>>>>
>> -- 
>> ---
>> Nirjhar Roy
>> Linux Kernel Developer
>> IBM, Bangalore
>>
diff mbox series

Patch

diff --git a/common/rc b/common/rc
index cccc98f5..995979e9 100644
--- a/common/rc
+++ b/common/rc
@@ -48,6 +48,23 @@  _test_fsxattr_xflag()
 	grep -q "fsxattr.xflags.*\[.*$2.*\]" <($XFS_IO_PROG -c "stat -v" "$1")
 }
 
+# This test requires extsize support on the  filesystem
+_require_scratch_extsize()
+{
+	_require_scratch
+	_scratch_mkfs > /dev/null
+	_scratch_mount
+	local filename=$SCRATCH_MNT/$RANDOM
+	local blksz=$(_get_block_size $SCRATCH_MNT)
+	local extsz=$(( blksz*2 ))
+	local res=$($XFS_IO_PROG -c "open -f $filename" -c "extsize $extsz" \
+		-c "extsize")
+	_scratch_unmount
+	grep -q "\[$extsz\] $filename" <(echo $res) || \
+		_notrun "this test requires extsize support on the filesystem"
+}
+
+
 # Write a byte into a range of a file
 _pwrite_byte() {
 	local pattern="$1"