xfs
[Top] [All Lists]

[PATCH] xfstests: test fallocate, write, ftruncate combinations.

To: xfs@xxxxxxxxxxx
Subject: [PATCH] xfstests: test fallocate, write, ftruncate combinations.
From: haldar@xxxxxxxxxx
Date: Fri, 20 May 2011 11:22:51 -0700
Cc: sandeen@xxxxxxxxxx, haldar@xxxxxxxxxx
Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta; t=1305915804; bh=KL/Au4mNTyJ+yENihaa3H/u+6Po=; h=From:To:Cc:Subject:Date:Message-Id; b=EyrUEnQfkUhjVpNYh+jF+MfEr82UZZg5WHdKI9JvH//f6k25X05RBeS9UvbL8b/ro OJgBw8uF1SdWo26lHG8Iw==
Domainkey-signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns; h=from:to:cc:subject:date:message-id:x-mailer; b=cWr8J0u+V0PQMhLX2OiakaDopDXZVcQB4D2ZQ1Rz9i4nI3wFZFU7G3WRexO8AJanE dED8ThMCck3zq2VIHMMMg==
From: Vivek Haldar <haldar@xxxxxxxxxx>

Scenarios covered:
1. Fallocate X bytes
2. Write Y bytes
3. Truncate to Z bytes
for various values of X, Y and Z, and check both file size and
number of filesystem blocks used by the file after each of
1, 2 and 3.

Signed-off-by: Vivek Haldar <haldar@xxxxxxxxxx>
---
 254     |  254 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 254.out |   48 ++++++++++++
 group   |    1 +
 3 files changed, 303 insertions(+), 0 deletions(-)
 create mode 100644 254
 create mode 100644 254.out

diff --git a/254 b/254
new file mode 100644
index 0000000..bb11b2e
--- /dev/null
+++ b/254
@@ -0,0 +1,254 @@
+#! /bin/bash
+# FS QA Test No. 254
+#
+# Test fallocate, write, ftruncate combinations.
+#
+# Scenarios covered:
+# 1. Fallocate X bytes
+# 2. Write Y bytes
+# 3. Truncate to Z bytes
+# for various values of X, Y and Z, and check both file size and
+# number of filesystem blocks used by the file after each of
+# 1, 2 and 3.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2011 Google, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+# creator
+owner=haldar@xxxxxxxxxx
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1        # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# fallocate, write and truncate with various options and checks.
+_test()
+{
+  falloc_size=${1}         # bytes
+  falloc_keep_size=${2}    # boolean
+  expected_size_after_falloc=${3}
+  expected_blocks_after_falloc=${4}
+  write_size=${5}
+  expected_size_after_write=${6}
+  expected_blocks_after_write=${7}
+  trunc_size=${8}
+  expected_size_after_trunc=${9}
+  expected_blocks_after_trunc=${10}
+  dont_delete_test_file=${11}  # boolean
+
+  echo "falloc/write/truncate test: \
+    falloc_size=${falloc_size} \
+    falloc_keep_size=${falloc_keep_size} \
+    expected_size_after_falloc=${expected_size_after_falloc} \
+    expected_blocks_after_falloc=${expected_blocks_after_falloc} \
+    write_size=${write_size} \
+    expected_size_after_write=${expected_size_after_write} \
+    expected_blocks_after_write=${expected_blocks_after_write} \
+    trunc_size=${trunc_size} \
+    expected_size_after_trunc=${expected_size_after_trunc} \
+    expected_blocks_after_trunc=${expected_blocks_after_trunc} \
+    dont_delete_test_file=${dont_delete_test_file}"
+    
+  if [ $dont_delete_test_file ] ; then
+    echo "Re-using test file."
+  else
+    rm -f $test_file
+  fi
+
+  # falloc
+  keep_size_flag=''
+  if $falloc_keep_size ; then
+    keep_size_flag='-k'
+  fi
+  if [ $falloc_size -gt 0 ]; then
+    ${XFS_IO_PROG} -F -f -d \
+      -c "falloc $keep_size_flag 0 $falloc_size" \
+      $test_file | _filter_xfs_io_unique
+  else
+    touch $test_file
+  fi
+
+  # check sizes after falloc
+  size_after_falloc=`stat --format="%s" $test_file`
+  blocks_after_falloc=`du --block-size=4096 -s $test_file | cut -f 1`
+
+  if [ $expected_size_after_falloc -ne $size_after_falloc ]; then
+    status=1
+    echo "Expected size after falloc to be $expected_size_after_falloc \
+      but it was actually $size_after_falloc."
+    exit ${status}
+  fi
+
+  if [ $expected_blocks_after_falloc -ne $blocks_after_falloc ]; then
+    status=1
+    echo "Expected blocks after falloc to be $expected_blocks_after_falloc \
+      but it was actually $blocks_after_falloc."
+    exit ${status}
+  fi
+
+  # write
+  if [ $write_size -gt 0 ]; then
+    ${XFS_IO_PROG} -F -f -d \
+      -c "pwrite 0 $write_size" \
+      $test_file | _filter_xfs_io_unique
+  fi
+
+  # check sizes after write
+  size_after_write=`stat --format="%s" $test_file`
+  blocks_after_write=`du --block-size=4096 -s $test_file | cut -f 1`
+
+  if [ $expected_size_after_write -ne $size_after_write ]; then
+    status=1
+    echo "Expected size after write to be $expected_size_after_write \
+      but it was actually $size_after_write."
+    exit ${status}
+  fi
+
+  if [ $expected_blocks_after_write -ne $blocks_after_write ]; then
+    status=1
+    echo "Expected blocks after write to be $expected_blocks_after_write \
+      but it was actually $blocks_after_write."
+    exit ${status}
+  fi
+
+  # trunc
+  if [ $trunc_size -gt 0 ]; then
+    ${XFS_IO_PROG} -F -f -d \
+      -c "truncate $trunc_size" \
+      $test_file | _filter_xfs_io_unique
+  fi
+
+  # check sizes after trunc
+  size_after_trunc=`stat --format="%s" $test_file`
+  blocks_after_trunc=`du --block-size=4096 -s $test_file | cut -f 1`
+
+  if [ $expected_size_after_trunc -ne $size_after_trunc ]; then
+    status=1
+    echo "Expected size after truncate to be $expected_size_after_trunc \
+      but it was actually $size_after_trunc."
+    exit ${status}
+  fi
+
+  if [ $expected_blocks_after_trunc -ne $blocks_after_trunc ]; then
+    status=1
+    echo "Expected blocks after trunc to be $expected_blocks_after_trunc \
+      but it was actually $blocks_after_trunc."
+    exit ${status}
+  fi
+}
+
+# Check that a file has the given bit pattern.
+_test_file_contents()
+{
+  file_name=${1}
+  offset=${2}
+  len=${3}
+  expected_pattern=${4}
+  expected_count=${5}
+
+  count=`${XFS_IO_PROG} -F -f -d -c \
+    "pread -v $offset $len" $file_name \
+    | grep -w -c $expected_pattern`
+
+  if [ $expected_count -ne $count ]; then
+    status=1
+    echo "Expected count $expected_count for $file_name at \
+      offset $offset for $len bytes for pattern $expected_pattern \
+      but count was $count."
+    exit ${status}
+  fi
+}
+
+# Get standard environment, filters and checks.
+. ./common.rc
+. ./common.filter
+
+# Prerequisites for the test run.
+_supported_fs generic
+_supported_os Linux
+_require_xfs_io_falloc
+
+# Remove any leftover files from last run.
+rm -f ${TEST_DIR}/test*
+
+test_file=${TEST_DIR}/test
+
+# Generic test cleanup function.
+_cleanup()
+{
+  cd /
+  rm -f $tmp.*
+  rm -f $test_file
+}
+
+# Begin test cases.
+
+# KEEP_SIZE
+_test 10240 true  0 3  0    0    3  0   0   3
+_test 8192  true  0 2  0    0    2  0   0   2
+_test 4096  true  0 1  0    0    1  0   0   1
+
+# !KEEP_SIZE
+_test 10240 false 10240  3  0    10240    3  0   10240   3
+_test 8192  false 8192   2  0    8192     2  0   8192    2
+_test 4096  false 4096   1  0    4096     1  0   4096    1
+_test_file_contents $test_file 1024 512 "00" 32   # check null.
+
+_test 10240 true 0 3  4096    4096    3  0   4096   3
+_test 10240 true 0 3  8192    8192    3  0   8192   3
+_test 10240 true 0 3  10240    10240    3  0   10240   3
+
+_test 16384 true 0 4  16384    16384    4  0   16384   4
+
+# just truncate tests, without falloc.
+_test 0 false 0 0   8192 8192 2    8192 8192 2
+_test 0 false 0 0   8192 8192 2    4096 4096 1
+_test 0 false 0 0   8192 8192 2    16384 16384 2
+_test_file_contents $test_file 8192 512 "00" 32   # check null.
+_test_file_contents $test_file 4096 512 "cd" 32   # check non-null.
+
+# write beyond fallocate size and then truncate to the written size.
+_test 8192 true 0 2    16384 16384 4    16384 16384 4
+_test_file_contents $test_file 8192 512 "cd" 32   # check non-null.
+
+# fallocate, write, truncate below the written size, and then truncate up. Then
+# try to read the previously written data to see whether it returns zero or the
+# stale data.
+_test 8192 true 0 2      16384 16384 4    12288 12288 3
+_test 0    true 12288 3  0     12288 3    16384 16384 3   true
+_test_file_contents $test_file 1024 512 "cd" 32    # check non-null.
+_test_file_contents $test_file 12288 512 "00" 32   # check null.
+
+# fallocate, write with the fallocate size, write after the fallocate size, and
+# then truncate to a size smaller than the fallocate size.
+_test 8192 true 0 2      8192 8192 2      0 8192 2
+_test 0    true 8192 2   12288 12288 3    4096 4096 1   true
+
+
+# The following reproduce an existing bug.
+# See http://patchwork.ozlabs.org/patch/96080/
+_test 10240 true 0 3  4096 4096 3  8192 8192 2
+_test 10240 true 0 3  0    0    3  8192 8192 2
+_test 16384 true 0 4  0        0        4  16384   16384   4
+
+
+status=0
+exit ${status}
diff --git a/254.out b/254.out
new file mode 100644
index 0000000..fe70f0e
--- /dev/null
+++ b/254.out
@@ -0,0 +1,48 @@
+QA output created by 254
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=0     expected_size_after_write=0     expected_blocks_after_write=3  
   trunc_size=0     expected_size_after_trunc=0     
expected_blocks_after_trunc=3     dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=8192     falloc_keep_size=true     
expected_size_after_falloc=0     expected_blocks_after_falloc=2     
write_size=0     expected_size_after_write=0     expected_blocks_after_write=2  
   trunc_size=0     expected_size_after_trunc=0     
expected_blocks_after_trunc=2     dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=4096     falloc_keep_size=true     
expected_size_after_falloc=0     expected_blocks_after_falloc=1     
write_size=0     expected_size_after_write=0     expected_blocks_after_write=1  
   trunc_size=0     expected_size_after_trunc=0     
expected_blocks_after_trunc=1     dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=false   
  expected_size_after_falloc=10240     expected_blocks_after_falloc=3     
write_size=0     expected_size_after_write=10240     
expected_blocks_after_write=3     trunc_size=0     
expected_size_after_trunc=10240     expected_blocks_after_trunc=3     
dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=8192     falloc_keep_size=false    
 expected_size_after_falloc=8192     expected_blocks_after_falloc=2     
write_size=0     expected_size_after_write=8192     
expected_blocks_after_write=2     trunc_size=0     
expected_size_after_trunc=8192     expected_blocks_after_trunc=2     
dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=4096     falloc_keep_size=false    
 expected_size_after_falloc=4096     expected_blocks_after_falloc=1     
write_size=0     expected_size_after_write=4096     
expected_blocks_after_write=1     trunc_size=0     
expected_size_after_trunc=4096     expected_blocks_after_trunc=1     
dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=4096     expected_size_after_write=4096     
expected_blocks_after_write=3     trunc_size=0     
expected_size_after_trunc=4096     expected_blocks_after_trunc=3     
dont_delete_test_file=
+wrote 4096/4096 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=8192     expected_size_after_write=8192     
expected_blocks_after_write=3     trunc_size=0     
expected_size_after_trunc=8192     expected_blocks_after_trunc=3     
dont_delete_test_file=
+wrote 8192/8192 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=10240     expected_size_after_write=10240     
expected_blocks_after_write=3     trunc_size=0     
expected_size_after_trunc=10240     expected_blocks_after_trunc=3     
dont_delete_test_file=
+wrote 10240/10240 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=16384     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=4     
write_size=16384     expected_size_after_write=16384     
expected_blocks_after_write=4     trunc_size=0     
expected_size_after_trunc=16384     expected_blocks_after_trunc=4     
dont_delete_test_file=
+wrote 16384/16384 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=0     falloc_keep_size=false     
expected_size_after_falloc=0     expected_blocks_after_falloc=0     
write_size=8192     expected_size_after_write=8192     
expected_blocks_after_write=2     trunc_size=8192     
expected_size_after_trunc=8192     expected_blocks_after_trunc=2     
dont_delete_test_file=
+wrote 8192/8192 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=0     falloc_keep_size=false     
expected_size_after_falloc=0     expected_blocks_after_falloc=0     
write_size=8192     expected_size_after_write=8192     
expected_blocks_after_write=2     trunc_size=4096     
expected_size_after_trunc=4096     expected_blocks_after_trunc=1     
dont_delete_test_file=
+wrote 8192/8192 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=0     falloc_keep_size=false     
expected_size_after_falloc=0     expected_blocks_after_falloc=0     
write_size=8192     expected_size_after_write=8192     
expected_blocks_after_write=2     trunc_size=16384     
expected_size_after_trunc=16384     expected_blocks_after_trunc=2     
dont_delete_test_file=
+wrote 8192/8192 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=8192     falloc_keep_size=true     
expected_size_after_falloc=0     expected_blocks_after_falloc=2     
write_size=16384     expected_size_after_write=16384     
expected_blocks_after_write=4     trunc_size=16384     
expected_size_after_trunc=16384     expected_blocks_after_trunc=4     
dont_delete_test_file=
+wrote 16384/16384 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=8192     falloc_keep_size=true     
expected_size_after_falloc=0     expected_blocks_after_falloc=2     
write_size=16384     expected_size_after_write=16384     
expected_blocks_after_write=4     trunc_size=12288     
expected_size_after_trunc=12288     expected_blocks_after_trunc=3     
dont_delete_test_file=
+wrote 16384/16384 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=0     falloc_keep_size=true     
expected_size_after_falloc=12288     expected_blocks_after_falloc=3     
write_size=0     expected_size_after_write=12288     
expected_blocks_after_write=3     trunc_size=16384     
expected_size_after_trunc=16384     expected_blocks_after_trunc=3     
dont_delete_test_file=true
+Re-using test file.
+falloc/write/truncate test:     falloc_size=8192     falloc_keep_size=true     
expected_size_after_falloc=0     expected_blocks_after_falloc=2     
write_size=8192     expected_size_after_write=8192     
expected_blocks_after_write=2     trunc_size=0     
expected_size_after_trunc=8192     expected_blocks_after_trunc=2     
dont_delete_test_file=
+wrote 8192/8192 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=0     falloc_keep_size=true     
expected_size_after_falloc=8192     expected_blocks_after_falloc=2     
write_size=12288     expected_size_after_write=12288     
expected_blocks_after_write=3     trunc_size=4096     
expected_size_after_trunc=4096     expected_blocks_after_trunc=1     
dont_delete_test_file=true
+Re-using test file.
+wrote 12288/12288 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=4096     expected_size_after_write=4096     
expected_blocks_after_write=3     trunc_size=8192     
expected_size_after_trunc=8192     expected_blocks_after_trunc=2     
dont_delete_test_file=
+wrote 4096/4096 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+falloc/write/truncate test:     falloc_size=10240     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=3     
write_size=0     expected_size_after_write=0     expected_blocks_after_write=3  
   trunc_size=8192     expected_size_after_trunc=8192     
expected_blocks_after_trunc=2     dont_delete_test_file=
+falloc/write/truncate test:     falloc_size=16384     falloc_keep_size=true    
 expected_size_after_falloc=0     expected_blocks_after_falloc=4     
write_size=0     expected_size_after_write=0     expected_blocks_after_write=4  
   trunc_size=16384     expected_size_after_trunc=16384     
expected_blocks_after_trunc=4     dont_delete_test_file=
diff --git a/group b/group
index 9f88e75..a5e278d 100644
--- a/group
+++ b/group
@@ -367,3 +367,4 @@ deprecated
 251 ioctl trim
 252 auto quick prealloc
 253 auto quick
+254 auto quick prealloc
-- 
1.7.3.1

<Prev in Thread] Current Thread [Next in Thread>