#! /bin/bash
# FS QA Test No. 275
#
-# The posix write test. when write size is larger than disk free size,
-# should write as more as possible
+# The posix write test. When write size is larger than disk free size,
+# should write as much as possible until ENOSPC.
#
#-----------------------------------------------------------------------
# Copyright (c) 2011-2012 Fujitsu, Inc. All Rights Reserved.
here=`pwd`
tmp=/tmp/$$
-status=0 # success is the default!
+status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
- rm -f $SCRATCH_MNT/* $tmp.*
_scratch_unmount
}
_require_scratch
echo "------------------------------"
-echo "write lack test"
+echo "write until ENOSPC test"
echo "------------------------------"
rm -f $seq.full
umount $SCRATCH_DEV 2>/dev/null
-_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seq.full 2>&1
+_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seq.full 2>&1
_scratch_mount
rm -rf $SCRATCH_MNT/*
-cd $SCRATCH_MNT
-dd if=/dev/zero of=tmp1 bs=4K count=1 >/dev/null 2>&1
-if [ $? -ne 0 ]
-then
- echo "create file err"
- status=1
- exit
-fi
+dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seq.full 2>&1
+[ $? -ne 0 ] && _fail "Error creating file"
-dd if=/dev/zero of=tmp2 bs=1M >/dev/null 2>&1
-dd if=/dev/zero of=tmp3 bs=4K >/dev/null 2>&1
+# Attempt to completely fill fs
+dd if=/dev/zero of=$SCRATCH_MNT/tmp2 bs=1M >>$seq.full 2>&1
sync
+dd if=/dev/zero of=$SCRATCH_MNT/tmp3 bs=4K >>$seq.full 2>&1
+sync
+# Last effort, use O_SYNC
+dd if=/dev/zero of=$SCRATCH_MNT/tmp4 bs=4K oflag=sync >>$seq.full 2>&1
+# Save space usage info to the full file
+echo "Pre rm space:" >> $seq.full
+df $SCRATCH_MNT >>$seq.full 2>&1
-rm -f tmp1
+# Should leave approx 256k free
+rm -f $SCRATCH_MNT/tmp1
sync
+echo "Post rm space:" >> $seq.full
+df $SCRATCH_MNT >>$seq.full 2>&1
+_freespace=`df -k $SCRATCH_MNT | tail -n 1 | awk '{print $4}'`
+[ $_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 >>$seq.full 2>&1
+echo "Bytes written until ENOSPC:" >>$seq.full
+du $SCRATCH_MNT/tmp1 >>$seq.full
-dd if=/dev/zero of=tmp1 bs=8K count=1 >/dev/null 2>&1
-_filesize=`du tmp1 | awk '{print $1}'`
-if [ $_filesize -ne 4 ]
-then
- echo "write file err"
- status=1
- exit
-fi
+# 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."
echo "done"
+status=0
exit