From: Dave Chinner <david@fromorbit.com>
To: fstests@vger.kernel.org
Subject: [PATCH 3/3] generic/275: writes may not partially succeed
Date: Thu, 14 May 2015 11:53:37 +1000 [thread overview]
Message-ID: <1431568417-6462-4-git-send-email-david@fromorbit.com> (raw)
In-Reply-To: <1431568417-6462-1-git-send-email-david@fromorbit.com>
From: Dave Chinner <dchinner@redhat.com>
When a large IO is done as a single buffer, there is no guarantee
that it will partially succeed when close to ENOSPC. The test
assumes that the kernel is going to break the write down into
smaller chunks (i.e. buffered IO breaking it down into PAGE_SIZE
allocations), but certain configurations will not do this. e.g.
extent size hints are set or DAX is being used) and hence the large
write fails completely as there is not space for the entire
allocation to be made.
Hence break the final write in the test up into multiple small
writes, thereby acheiving the same effect - ensuring that we can
write more data after removing some space....
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
tests/generic/275 | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/tests/generic/275 b/tests/generic/275
index 7382edb..f1963d8 100755
--- a/tests/generic/275
+++ b/tests/generic/275
@@ -57,6 +57,8 @@ umount $SCRATCH_DEV 2>/dev/null
_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1
_scratch_mount
+# this file will get removed to create 256k of free space after ENOSPC
+# conditions are created.
dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seqres.full 2>&1
[ $? -ne 0 ] && _fail "Error creating file"
@@ -79,14 +81,16 @@ $DF_PROG $SCRATCH_MNT >>$seqres.full 2>&1
_freespace=`$DF_PROG -k $SCRATCH_MNT | tail -n 1 | awk '{print $5}'`
[ $_freespace -gt 1024 ] && _fail "could not sufficiently fill filesystem"
-# Try a write larger than available space
-dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=1M count=1 >>$seqres.full 2>&1
+# Try to write more than available space in chunks that will allow at least one
+# full write to succeed.
+dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=128k count=8 >>$seqres.full 2>&1
echo "Bytes written until ENOSPC:" >>$seqres.full
du $SCRATCH_MNT/tmp1 >>$seqres.full
# And at least some of it should succeed.
_filesize=`ls -l $SCRATCH_MNT/tmp1 | awk '{print $5}'`
-[ $_filesize -eq 0 ] && _fail "write file err: Partial write until enospc failed; wrote 0 bytes."
+[ $_filesize -lt $((128 * 1024)) ] && \
+ _fail "Partial write until enospc failed; wrote $_filesize bytes."
echo "done"
status=0
--
2.0.0
next prev parent reply other threads:[~2015-05-14 1:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-14 1:53 [PATCH 0/3] generic: fixes for different allocation behaviours Dave Chinner
2015-05-14 1:53 ` [PATCH 1/3] generic/018: use xfs_io and larger buffers for writes Dave Chinner
2015-05-14 1:53 ` [PATCH 2/3] generic/223, xfs/203: IO is not well aligned Dave Chinner
2015-05-14 1:53 ` Dave Chinner [this message]
2015-05-19 12:23 ` [PATCH 0/3] generic: fixes for different allocation behaviours Brian Foster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1431568417-6462-4-git-send-email-david@fromorbit.com \
--to=david@fromorbit.com \
--cc=fstests@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox