mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
generic/275: writes may not partially succeed
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> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
committed by
Dave Chinner
parent
6bd4b513af
commit
9816be53e5
+7
-3
@@ -57,6 +57,8 @@ umount $SCRATCH_DEV 2>/dev/null
|
|||||||
_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1
|
_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1
|
||||||
_scratch_mount
|
_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
|
dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seqres.full 2>&1
|
||||||
[ $? -ne 0 ] && _fail "Error creating file"
|
[ $? -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=`$DF_PROG -k $SCRATCH_MNT | tail -n 1 | awk '{print $5}'`
|
||||||
[ $_freespace -gt 1024 ] && _fail "could not sufficiently fill filesystem"
|
[ $_freespace -gt 1024 ] && _fail "could not sufficiently fill filesystem"
|
||||||
|
|
||||||
# Try a write larger than available space
|
# Try to write more than available space in chunks that will allow at least one
|
||||||
dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=1M count=1 >>$seqres.full 2>&1
|
# 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
|
echo "Bytes written until ENOSPC:" >>$seqres.full
|
||||||
du $SCRATCH_MNT/tmp1 >>$seqres.full
|
du $SCRATCH_MNT/tmp1 >>$seqres.full
|
||||||
|
|
||||||
# And at least some of it should succeed.
|
# And at least some of it should succeed.
|
||||||
_filesize=`ls -l $SCRATCH_MNT/tmp1 | awk '{print $5}'`
|
_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"
|
echo "done"
|
||||||
status=0
|
status=0
|
||||||
|
|||||||
Reference in New Issue
Block a user