Re: [PATCH 2/3] generic/470: Test RWF_NOWAIT

[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]




On 12/06/2017 04:05 AM, Eryu Guan wrote:
> On Wed, Nov 29, 2017 at 10:33:57AM -0600, Goldwyn Rodrigues wrote:
>> From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx>
>>
>> Tests the RWF_NOWAIT flag so the I/O returns immediately with -EAGAIN
>> on a new file since it requires block allocation.
>>
>> It creates a file, syncs it, and overwrites the file with RWF_NOWAIT.
>> This should succeed.
>>
>> Finally, read the contents to make sure the overwrite is successful.
>>
>> Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx>
>>
>> Changes since v1:
>>  - Fix testdir name
>>  - use of $XFS_IO_PROG instead of xfs_io
>>  - check pwrite accepts -N
>>
>> Changes since v2:
>>  - corrected test description and improved documentation
>>  - new leaner look ;)
>>  - rw group
>> ---
>>  tests/generic/470     | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
>>  tests/generic/470.out | 13 +++++++++
>>  tests/generic/group   |  1 +
>>  3 files changed, 88 insertions(+)
>>  create mode 100755 tests/generic/470
>>  create mode 100644 tests/generic/470.out
>>
>> diff --git a/tests/generic/470 b/tests/generic/470
>> new file mode 100755
>> index 00000000..5580718b
>> --- /dev/null
>> +++ b/tests/generic/470
>> @@ -0,0 +1,74 @@
>> +#! /bin/bash
>> +# FS QA Test No. 470
>> +#
>> +# write a file with RWF_NOWAIT and it would fail because there are no
>> +# blocks allocated. Create a file with direct I/O and re-write it
>> +# using RWF_NOWAIT. I/O should finish within 50 microsecods since
>> +# block allocations are already performed.
>> +#
>> +#-----------------------------------------------------------------------
>> +# Copyright (c) 2017, SUSE Linux Products.  All Rights Reserved.
>> +#
>> +# This program is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU General Public License as
>> +# published by the Free Software Foundation.
>> +#
>> +# This program is distributed in the hope that it would be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +# GNU General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU General Public License
>> +# along with this program; if not, write the Free Software Foundation,
>> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
>> +#-----------------------------------------------------------------------
>> +
>> +seq=`basename $0`
>> +seqres=$RESULT_DIR/$seq
>> +echo "QA output created by $seq"
>> +
>> +here=`pwd`
>> +tmp=/tmp/$$
>> +status=1    # failure is the default!
>> +
>> +# get standard environment, filters and checks
>> +. ./common/rc
>> +. ./common/populate
>> +. ./common/filter
>> +. ./common/attr
>> +
>> +# real QA test starts here
>> +_supported_os Linux
>> +_require_odirect
>> +_require_test
>> +_require_xfs_io_command pwrite -N
>> +
>> +# Remove reminiscence of previously run tests
>> +testdir=$TEST_DIR/$seq
>> +if [ -e $testdir ]; then
>> +	rm -Rf $testdir
>> +fi
>> +
>> +mkdir $testdir
>> +
>> +# Create a file with pwrite nowait (will fail with EAGAIN)
>> +$XFS_IO_PROG -f -d -c "pwrite -N -V 1 -b 1M 0 1M" $testdir/f1
> 
> It's weird that I got "Operation not supported" message here and test
> failed as
> 
> @@ -1,5 +1,5 @@
>  QA output created by 470
> -pwrite: Resource temporarily unavailable
> +pwrite: Operation not supported
>  wrote 8388608/8388608 bytes at offset 0
>  XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  RWF_NOWAIT time is within limits.
> 
> I was using latest for-next branch of upstream xfsprogs, and a
> pre-v4.15-rc1 kernel shipped by Fedora rawhide. A simple test showed:

What is the output of uname -a
It should be compatible with 4.13 onward. OTOH, _require_xfs_io_command
will catch that.

> 
> rm -f /mnt/xfs/testfile
> xfs_io -fdc "pwrite -N -V 1 -b 4k 0 4k" /mnt/xfs/testfile
> pwrite: Operation not supported

For kernels which do not support RWF_NOWAIT, it will return EOPNOTSUPP.

> 
> But an strace run showed pwritev2 did -1 and set EAGAIN as errno, but
> printed "Operation not supported" as error message:
> ...
> pwritev2(3, [{iov_base="\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315\315"..., iov_len=4096}], 1, 0, RWF_NOWAIT) = -1 EAGAIN (Resource temporarily unavailable)
> dup(2)                                  = 4
> fcntl(4, F_GETFL)                       = 0x402 (flags O_RDWR|O_APPEND)
> openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
> fstat(4, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
> write(4, "pwrite: Operation not supported\n", 32pwrite: Operation not supported
> ...
> 
> Not sure what happened yet, did I miss anything?

Did you trim any lines in between? If you had another error in between
before you collect -EAGAIN, it most likely overwrote the value. Not sure
what is going on though..

> 
>> +
>> +# Write the file without nowait
>> +$XFS_IO_PROG -f -d -c "pwrite -S 0xaa -W -w -V 1 -b 1M 0 8M" $testdir/f1 | _filter_xfs_io
> 
> I think "-w" (fdatasync) can be removed? We already use "-W" (fsync) here.
> 
>> +
>> +time_taken=`$XFS_IO_PROG -d -c "pwrite -S 0xbb -N -V 1 -b 1M 2M 1M" $testdir/f1 | awk '/^1/ {print $5}'`
>> +
>> +# RWF_NOWAIT should finish within a short period of time. Anything longer
>> +# means it is waiting for something in the kernel which would be a fail.
>> +if (( $(echo "$time_taken < 0.05" | bc -l) )); then
> 
> Better to describe where does this 0.05 come from.
> 

No significance as such, but a conservative value for the operation to
be completed. If you want me to explicitly put 50 ms, I can.

> Thanks,
> Eryu
> 
>> +	echo "RWF_NOWAIT time is within limits."
>> +else
>> +	echo "RWF_NOWAIT took $time_taken seconds"
>> +fi
>> +
>> +$XFS_IO_PROG -c "pread -v 0 8M" $testdir/f1 | _filter_xfs_io_unique
>> +
>> +# success, all done
>> +status=0
>> +exit
>> diff --git a/tests/generic/470.out b/tests/generic/470.out
>> new file mode 100644
>> index 00000000..e46622cb
>> --- /dev/null
>> +++ b/tests/generic/470.out
>> @@ -0,0 +1,13 @@
>> +QA output created by 470
>> +pwrite: Resource temporarily unavailable
>> +wrote 8388608/8388608 bytes at offset 0
>> +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>> +RWF_NOWAIT time is within limits.
>> +00000000:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>> +*
>> +00200000:  bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb  ................
>> +*
>> +00300000:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>> +*
>> +read 8388608/8388608 bytes at offset 0
>> +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>> diff --git a/tests/generic/group b/tests/generic/group
>> index 6c3bb03a..cf8529ea 100644
>> --- a/tests/generic/group
>> +++ b/tests/generic/group
>> @@ -472,3 +472,4 @@
>>  467 auto quick exportfs
>>  468 shutdown auto quick metadata
>>  469 auto quick
>> +470 auto quick rw
>> -- 
>> 2.14.2
>>

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



[Index of Archives]     [Linux Filesystems Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux