xfs/014: try a few times to create speculative preallocations
[xfstests-dev.git] / tests / xfs / 014
index a605b359a8cfd28451bf4ab97a6dc53d1449275a..1f0ebac3447ce5facb49053f6ffcaba04e9df729 100755 (executable)
@@ -33,27 +33,36 @@ _cleanup()
 # failure.
 _spec_prealloc_file()
 {
-       file=$1
-
-       rm -f $file
-
-       # a few file extending open-write-close cycles should be enough to
-       # trigger the fs to retain preallocation. write 256k in 32k intervals to
-       # be sure
-       for i in $(seq 0 32768 262144); do
-               $XFS_IO_PROG -f -c "pwrite $i 32k" $file >> $seqres.full
+       local file=$1
+       local prealloc_size=0
+       local i=0
+
+       # Now that we have background garbage collection processes that can be
+       # triggered by low space/quota conditions, it's possible that we won't
+       # succeed in creating a speculative preallocation on the first try.
+       for ((tries = 0; tries < 5 && prealloc_size == 0; tries++)); do
+               rm -f $file
+
+               # a few file extending open-write-close cycles should be enough
+               # to trigger the fs to retain preallocation. write 256k in 32k
+               # intervals to be sure
+               for i in $(seq 0 32768 262144); do
+                       $XFS_IO_PROG -f -c "pwrite $i 32k" $file >> $seqres.full
+               done
+
+               # write a 4k aligned amount of data to keep the calculations
+               # simple
+               $XFS_IO_PROG -c "pwrite 0 128m" $file >> $seqres.full
+
+               size=`_get_filesize $file`
+               blocks=`stat -c "%b" $file`
+               blocksize=`stat -c "%B" $file`
+
+               prealloc_size=$((blocks * blocksize - size))
        done
 
-       # write a 4k aligned amount of data to keep the calculations simple
-       $XFS_IO_PROG -c "pwrite 0 128m" $file >> $seqres.full
-
-       size=`_get_filesize $file`
-       blocks=`stat -c "%b" $file`
-       blocksize=`stat -c "%B" $file`
-
-       prealloc_size=$((blocks * blocksize - size))
        if [ $prealloc_size -eq 0 ]; then
-               echo "Warning: No speculative preallocation for $file." \
+               echo "Warning: No speculative preallocation for $file after $tries iterations." \
                        "Check use of the allocsize= mount option."
        fi