- 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))