All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] Check pwrite parameters
@ 2017-11-29 16:33 Goldwyn Rodrigues
  2017-11-29 16:33 ` [PATCH 2/3] generic/470: Test RWF_NOWAIT Goldwyn Rodrigues
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Goldwyn Rodrigues @ 2017-11-29 16:33 UTC (permalink / raw)
  To: darrick.wong, eguan; +Cc: fstests, Goldwyn Rodrigues

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

There are some parameters added with xfs_io. Check if the pwrite
parameters are available. For some cases, xfs_io now returns "command
-%c not supported", so added "not supported" to count as error.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>

Change since v2:
 - More comments
 - opts to become local variable

---
 common/rc | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/common/rc b/common/rc
index 4c053a53..90408b7e 100644
--- a/common/rc
+++ b/common/rc
@@ -2035,6 +2035,7 @@ _require_xfs_io_command()
 	shift
 	local param="$*"
 	local param_checked=0
+	local opts=""
 
 	testfile=$TEST_DIR/$$.xfs_io
 	case $command in
@@ -2079,6 +2080,15 @@ _require_xfs_io_command()
 		echo $testio | grep -q "invalid option" && \
 			_notrun "xfs_io $command support is missing"
 		;;
+	"pwrite")
+		# -N (RWF_NOWAIT) only works with direct I/O writes
+		if [ "$param" == "-N" ]; then
+			opts+=" -d"
+		fi
+		testio=`$XFS_IO_PROG -f $opts -c "pwrite $param 0 1M" \
+			$testfile 2>&1`
+		param_checked=1
+		;;
 	"scrub"|"repair")
 		testio=`$XFS_IO_PROG -x -c "$command probe 0" $TEST_DIR 2>&1`
 		echo $testio | grep -q "Inappropriate ioctl" && \
@@ -2109,7 +2119,9 @@ _require_xfs_io_command()
 		$XFS_IO_PROG -c "help $command" | grep -q "^ $param --" || \
 			_notrun "xfs_io $command doesn't support $param"
 	else
-		echo $testio | grep -q "invalid option" && \
+		# xfs_io could result in "command %c not supported" if it was
+		# built on kernels not supporting pwritev2() calls
+		echo $testio | grep -q "\(invalid option\|not supported\)" && \
 			_notrun "xfs_io $command doesn't support $param"
 	fi
 }
-- 
2.14.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] generic/470: Test RWF_NOWAIT
  2017-11-29 16:33 [PATCH 1/3] Check pwrite parameters Goldwyn Rodrigues
@ 2017-11-29 16:33 ` Goldwyn Rodrigues
  2017-12-06 10:05   ` Eryu Guan
  2017-11-29 16:33 ` [PATCH 3/3] generic/471: Partial direct write test Goldwyn Rodrigues
  2017-12-06  9:55 ` [PATCH 1/3] Check pwrite parameters Eryu Guan
  2 siblings, 1 reply; 8+ messages in thread
From: Goldwyn Rodrigues @ 2017-11-29 16:33 UTC (permalink / raw)
  To: darrick.wong, eguan; +Cc: fstests, Goldwyn Rodrigues

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

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@suse.com>

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
+
+# 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
+
+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
+	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


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] generic/471: Partial direct write test
  2017-11-29 16:33 [PATCH 1/3] Check pwrite parameters Goldwyn Rodrigues
  2017-11-29 16:33 ` [PATCH 2/3] generic/470: Test RWF_NOWAIT Goldwyn Rodrigues
@ 2017-11-29 16:33 ` Goldwyn Rodrigues
  2017-12-06  9:55 ` [PATCH 1/3] Check pwrite parameters Eryu Guan
  2 siblings, 0 replies; 8+ messages in thread
From: Goldwyn Rodrigues @ 2017-11-29 16:33 UTC (permalink / raw)
  To: darrick.wong, eguan; +Cc: fstests, Goldwyn Rodrigues

From: Goldwyn Rodrigues <rgoldwyn@suse.com>

Getting an error midway through a direct write would return an error
and the error-code is returned in the write() call. However, partial
data is over-written during the call.

This tests simulates the ENOSPC error to check for partial direct
write consistency.

Changes since v1:
 - Check for option pwrite -O
 - Create a 200M file instead of multiple 40M files.

Changes since v2:
 - new leaner look ;)
 - use _fill_fs after reserving some space to create an almost full FS
 - _require_scratch for reseting system

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 tests/generic/471     | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generic/471.out |  9 +++++
 tests/generic/group   |  1 +
 3 files changed, 105 insertions(+)
 create mode 100755 tests/generic/471
 create mode 100644 tests/generic/471.out

diff --git a/tests/generic/471 b/tests/generic/471
new file mode 100755
index 00000000..51723548
--- /dev/null
+++ b/tests/generic/471
@@ -0,0 +1,95 @@
+#! /bin/bash
+# FS QA Test No. 471
+#
+# write() to a file opened with O_DIRECT with count > remaining
+# bytes. In case of a bug, the write returns ENOSPC wheras the
+# showing no data is written, but the file contents are updated.
+# Result should be the write should return remaining bytes
+# (to aligned bytes) instead of ENOSPC error.
+#
+#-----------------------------------------------------------------------
+# 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!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+    cd /
+    rm -rf $tmp.* $testdir1
+}
+
+# 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_xfs_io_command pwrite -O
+_require_scratch
+
+rm -f $seqres.full
+
+echo "Reformat with 320M size"
+sz_bytes=$((320 * 1024 * 1024))
+_scratch_mkfs_sized $sz_bytes >> $seqres.full 2>&1
+_scratch_mount >> $seqres.full 2>&1
+testdir=$SCRATCH_MNT/$seq
+mkdir $testdir
+
+# Reserve some space to remove later
+$XFS_IO_PROG -f -c "pwrite 0 2M" $testdir/reserve > /dev/null
+
+mkdir $testdir/fillspace
+echo "Fill the filesystem"
+_fill_fs $(( 1024 * 1024 * 1024 )) $testdir/fillspace 4096 0 > /dev/null 2>&1
+
+# Remove the reserve file to work on almost full filesystem
+rm $testdir/reserve
+sync
+
+# Create a file using buffered I/O which succeeds only partially
+$XFS_IO_PROG -f -c "pwrite -w -S 0xaa 0 4M" $testdir/partial
+
+# re-write using direct I/O with another pattern using one single buffer, once
+write_size=`$XFS_IO_PROG -d -c "pwrite -O -S 0xbb -V 1 -b 4M 0 4M" $testdir/partial | awk '/^wrote/ {split($2, bytes, "/"); print bytes[1]}'`
+if [ -z $write_size ]; then
+	write_size=0
+fi
+
+# If bug is not fixed, pwrite will return error and but still write data
+if [ $write_size -gt 0 ]; then
+	echo "pwrite wrote more than zero bytes."
+else
+	echo "pwrite wrote zero bytes"
+fi
+
+# read the partial file to check if data written is of last write
+$XFS_IO_PROG -c "pread 0 1M -v" $testdir/partial | _filter_xfs_io_unique
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/471.out b/tests/generic/471.out
new file mode 100644
index 00000000..b846eb32
--- /dev/null
+++ b/tests/generic/471.out
@@ -0,0 +1,9 @@
+QA output created by 471
+Reformat with 320M size
+Fill the filesystem
+pwrite: No space left on device
+pwrite wrote more than zero bytes.
+00000000:  bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb  ................
+*
+read 1048576/1048576 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 cf8529ea..160e0e7b 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -473,3 +473,4 @@
 468 shutdown auto quick metadata
 469 auto quick
 470 auto quick rw
+471 auto quick rw
-- 
2.14.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] Check pwrite parameters
  2017-11-29 16:33 [PATCH 1/3] Check pwrite parameters Goldwyn Rodrigues
  2017-11-29 16:33 ` [PATCH 2/3] generic/470: Test RWF_NOWAIT Goldwyn Rodrigues
  2017-11-29 16:33 ` [PATCH 3/3] generic/471: Partial direct write test Goldwyn Rodrigues
@ 2017-12-06  9:55 ` Eryu Guan
  2 siblings, 0 replies; 8+ messages in thread
From: Eryu Guan @ 2017-12-06  9:55 UTC (permalink / raw)
  To: Goldwyn Rodrigues; +Cc: darrick.wong, fstests, Goldwyn Rodrigues

On Wed, Nov 29, 2017 at 10:33:56AM -0600, Goldwyn Rodrigues wrote:
> From: Goldwyn Rodrigues <rgoldwyn@suse.com>
> 
> There are some parameters added with xfs_io. Check if the pwrite
> parameters are available. For some cases, xfs_io now returns "command
> -%c not supported", so added "not supported" to count as error.
> 
> Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
> 
> Change since v2:
>  - More comments
>  - opts to become local variable
> 
> ---
>  common/rc | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/common/rc b/common/rc
> index 4c053a53..90408b7e 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -2035,6 +2035,7 @@ _require_xfs_io_command()
>  	shift
>  	local param="$*"
>  	local param_checked=0
> +	local opts=""
>  
>  	testfile=$TEST_DIR/$$.xfs_io
>  	case $command in
> @@ -2079,6 +2080,15 @@ _require_xfs_io_command()
>  		echo $testio | grep -q "invalid option" && \
>  			_notrun "xfs_io $command support is missing"
>  		;;
> +	"pwrite")
> +		# -N (RWF_NOWAIT) only works with direct I/O writes
> +		if [ "$param" == "-N" ]; then
> +			opts+=" -d"
> +		fi
> +		testio=`$XFS_IO_PROG -f $opts -c "pwrite $param 0 1M" \
> +			$testfile 2>&1`

Do we need to specify the vector count when testing "-N" support? e.g.

$XFS_IO_PROG -f $opts -c "pwrite $param -V 1 0 1M" ...

>From xfsprogs code, it seems to me that we need to do so

io/pwrite.c::do_pwrite
do_pwrite(
	...
{
	if (!vectors)
		return pwrite(fd, ...);
	return do_pwritev(fd, ..., pritev2_flags);
}

and 'vectors' is a global variable with 0 as default value (no vector
number specified via "-V N" option).

So without "-V N", we call pwrite(2) not pwritev2(2) and RWF_NOWAIT
doesn't get tested.

Thanks,
Eryu

> +		param_checked=1
> +		;;
>  	"scrub"|"repair")
>  		testio=`$XFS_IO_PROG -x -c "$command probe 0" $TEST_DIR 2>&1`
>  		echo $testio | grep -q "Inappropriate ioctl" && \
> @@ -2109,7 +2119,9 @@ _require_xfs_io_command()
>  		$XFS_IO_PROG -c "help $command" | grep -q "^ $param --" || \
>  			_notrun "xfs_io $command doesn't support $param"
>  	else
> -		echo $testio | grep -q "invalid option" && \
> +		# xfs_io could result in "command %c not supported" if it was
> +		# built on kernels not supporting pwritev2() calls
> +		echo $testio | grep -q "\(invalid option\|not supported\)" && \
>  			_notrun "xfs_io $command doesn't support $param"
>  	fi
>  }
> -- 
> 2.14.2
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] generic/470: Test RWF_NOWAIT
  2017-11-29 16:33 ` [PATCH 2/3] generic/470: Test RWF_NOWAIT Goldwyn Rodrigues
@ 2017-12-06 10:05   ` Eryu Guan
  2017-12-06 16:35     ` Goldwyn Rodrigues
  0 siblings, 1 reply; 8+ messages in thread
From: Eryu Guan @ 2017-12-06 10:05 UTC (permalink / raw)
  To: Goldwyn Rodrigues; +Cc: darrick.wong, fstests, Goldwyn Rodrigues

On Wed, Nov 29, 2017 at 10:33:57AM -0600, Goldwyn Rodrigues wrote:
> From: Goldwyn Rodrigues <rgoldwyn@suse.com>
> 
> 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@suse.com>
> 
> 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:

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

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?

> +
> +# 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.

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
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] generic/470: Test RWF_NOWAIT
  2017-12-06 10:05   ` Eryu Guan
@ 2017-12-06 16:35     ` Goldwyn Rodrigues
  2017-12-07  4:17       ` Eryu Guan
  0 siblings, 1 reply; 8+ messages in thread
From: Goldwyn Rodrigues @ 2017-12-06 16:35 UTC (permalink / raw)
  To: Eryu Guan; +Cc: darrick.wong, fstests, Goldwyn Rodrigues



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@suse.com>
>>
>> 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@suse.com>
>>
>> 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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] generic/470: Test RWF_NOWAIT
  2017-12-06 16:35     ` Goldwyn Rodrigues
@ 2017-12-07  4:17       ` Eryu Guan
  2017-12-07 11:57         ` Goldwyn Rodrigues
  0 siblings, 1 reply; 8+ messages in thread
From: Eryu Guan @ 2017-12-07  4:17 UTC (permalink / raw)
  To: Goldwyn Rodrigues; +Cc: darrick.wong, fstests, Goldwyn Rodrigues

On Wed, Dec 06, 2017 at 10:35:06AM -0600, Goldwyn Rodrigues wrote:
> 
> 
> 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@suse.com>
> >>
> >> 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@suse.com>
> >>
> >> 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.

Linux localhost 4.15.0-0.rc0.git6.1.fc28.x86_64 #1 SMP Mon Nov 20 18:08:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

_require_xfs_io_command doesn't run "pwrite -N" with "-V 1" option, so
test there passes, it only fails with vectors specified

# rm /mnt/xfs/testfile
# xfs_io -fdc "pwrite -N 0 4k" /mnt/xfs/testfile
wrote 4096/4096 bytes at offset 0
4 KiB, 1 ops; 0.0000 sec (787.402 KiB/sec and 196.8504 ops/sec)
# rm /mnt/xfs/testfile
# xfs_io -fdc "pwrite -N -V 1 0 4k" /mnt/xfs/testfile
pwrite: Operation not supported

That's why I was asking if we should include "-V 1" in
_require_xfs_io_command in patch 1.

> 
> > 
> > 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..

No, I didn't trim any lines in between.

> 
> > 
> >> +
> >> +# 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.

There should be a reason for this 50ms estimation. IMHO, as simple as "a
conservative value for the operation to be completed" would be better
than nothing :)

Thanks,
Eryu

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] generic/470: Test RWF_NOWAIT
  2017-12-07  4:17       ` Eryu Guan
@ 2017-12-07 11:57         ` Goldwyn Rodrigues
  0 siblings, 0 replies; 8+ messages in thread
From: Goldwyn Rodrigues @ 2017-12-07 11:57 UTC (permalink / raw)
  To: Eryu Guan, Goldwyn Rodrigues; +Cc: darrick.wong, fstests



On 12/06/2017 10:17 PM, Eryu Guan wrote:
> On Wed, Dec 06, 2017 at 10:35:06AM -0600, Goldwyn Rodrigues wrote:
>>
>>
>> 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@suse.com>
>>>>
>>>> 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@suse.com>
>>>>
>>>> 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.
> 
> Linux localhost 4.15.0-0.rc0.git6.1.fc28.x86_64 #1 SMP Mon Nov 20 18:08:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
> 
> _require_xfs_io_command doesn't run "pwrite -N" with "-V 1" option, so
> test there passes, it only fails with vectors specified
> 
> # rm /mnt/xfs/testfile
> # xfs_io -fdc "pwrite -N 0 4k" /mnt/xfs/testfile
> wrote 4096/4096 bytes at offset 0
> 4 KiB, 1 ops; 0.0000 sec (787.402 KiB/sec and 196.8504 ops/sec)
> # rm /mnt/xfs/testfile
> # xfs_io -fdc "pwrite -N -V 1 0 4k" /mnt/xfs/testfile
> pwrite: Operation not supported
> 
> That's why I was asking if we should include "-V 1" in
> _require_xfs_io_command in patch 1.
> 

I am all for including your suggestion in patch 1. However, it does not
explain two things:
1. Why is the error code in strace changing from -EAGAIN to -EOPNOTSUPP?
2. Why is it happening on a kernel version greater than 4.14?

Anyways, I shall add the changes and send it across again.


>>
>>>
>>> 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..
> 
> No, I didn't trim any lines in between.
> 
>>
>>>
>>>> +
>>>> +# 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.
> 
> There should be a reason for this 50ms estimation. IMHO, as simple as "a
> conservative value for the operation to be completed" would be better
> than nothing :)
> 
> Thanks,
> Eryu
> 

-- 
Goldwyn

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2017-12-07 11:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-29 16:33 [PATCH 1/3] Check pwrite parameters Goldwyn Rodrigues
2017-11-29 16:33 ` [PATCH 2/3] generic/470: Test RWF_NOWAIT Goldwyn Rodrigues
2017-12-06 10:05   ` Eryu Guan
2017-12-06 16:35     ` Goldwyn Rodrigues
2017-12-07  4:17       ` Eryu Guan
2017-12-07 11:57         ` Goldwyn Rodrigues
2017-11-29 16:33 ` [PATCH 3/3] generic/471: Partial direct write test Goldwyn Rodrigues
2017-12-06  9:55 ` [PATCH 1/3] Check pwrite parameters Eryu Guan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.