generic: Test RWF_NOWAIT
authorGoldwyn Rodrigues <>
Thu, 7 Dec 2017 16:00:43 +0000 (10:00 -0600)
committerEryu Guan <>
Thu, 14 Dec 2017 04:39:57 +0000 (12:39 +0800)
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 <>
Reviewed-by: Eryu Guan <>
Signed-off-by: Eryu Guan <>
tests/generic/471 [new file with mode: 0755]
tests/generic/471.out [new file with mode: 0644]

diff --git a/tests/generic/471 b/tests/generic/471
new file mode 100755 (executable)
index 0000000..3969a49
--- /dev/null
@@ -0,0 +1,75 @@
+#! /bin/bash
+# FS QA Test No. 471
+# 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
+# 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`
+echo "QA output created by $seq"
+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_xfs_io_command pwrite -N
+# Remove reminiscence of previously run tests
+if [ -e $testdir ]; then
+       rm -Rf $testdir
+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 so we are choosing
+# a conservative value of 50 ms. 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."
+       echo "RWF_NOWAIT took $time_taken seconds"
+$XFS_IO_PROG -c "pread -v 0 8M" $testdir/f1 | _filter_xfs_io_unique
+# success, all done
diff --git a/tests/generic/471.out b/tests/generic/471.out
new file mode 100644 (file)
index 0000000..ab23272
--- /dev/null
@@ -0,0 +1,13 @@
+QA output created by 471
+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)
index 1e6072225a8fb942e4b425b1148adbb9c5506a9e..f777893e3743ebda7e44f7f76552d49757b8fda7 100644 (file)
 468 shutdown auto quick metadata
 469 auto quick
 470 auto quick dax
+471 auto quick rw