Pablo Greco e6a3ae
From b897ede11c7b47cc9db8334ca44dd960d3001309 Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
Date: Fri, 30 Aug 2019 12:56:26 +0100
Pablo Greco e6a3ae
Subject: [PATCH 08/10] iotests: Filter 175's allocation information
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190830125628.23668-4-thuth@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 90211
Pablo Greco e6a3ae
O-Subject: [RHEL-8.1.0 qemu-kvm PATCH v2 3/5] iotests: Filter 175's allocation information
Pablo Greco e6a3ae
Bugzilla: 1738839
Pablo Greco e6a3ae
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: David Hildenbrand <david@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
It is possible for an empty file to take up blocks on a filesystem, for
Pablo Greco e6a3ae
example:
Pablo Greco e6a3ae
Pablo Greco e6a3ae
$ qemu-img create -f raw test.img 1G
Pablo Greco e6a3ae
Formatting 'test.img', fmt=raw size=1073741824
Pablo Greco e6a3ae
$ mkfs.ext4 -I 128 -q test.img
Pablo Greco e6a3ae
$ mkdir test-mount
Pablo Greco e6a3ae
$ sudo mount -o loop test.img test-mount
Pablo Greco e6a3ae
$ sudo touch test-mount/test-file
Pablo Greco e6a3ae
$ stat -c 'blocks=%b' test-mount/test-file
Pablo Greco e6a3ae
blocks=8
Pablo Greco e6a3ae
Pablo Greco e6a3ae
These extra blocks (one cluster) are apparently used for metadata,
Pablo Greco e6a3ae
because they are always there, on top of blocks used for data:
Pablo Greco e6a3ae
Pablo Greco e6a3ae
$ sudo dd if=/dev/zero of=test-mount/test-file bs=1M count=1
Pablo Greco e6a3ae
1+0 records in
Pablo Greco e6a3ae
1+0 records out
Pablo Greco e6a3ae
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00135339 s, 775 MB/s
Pablo Greco e6a3ae
$ stat -c 'blocks=%b' test-mount/test-file
Pablo Greco e6a3ae
blocks=2056
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Make iotest 175 take this into account.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Reported-by: Thomas Huth <thuth@redhat.com>
Pablo Greco e6a3ae
Signed-off-by: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Eric Blake <eblake@redhat.com>
Pablo Greco e6a3ae
Reviewed-by: Nir Soffer <nsoffer@redhat.com>
Pablo Greco e6a3ae
Message-id: 20190516144319.12570-1-mreitz@redhat.com
Pablo Greco e6a3ae
Signed-off-by: Max Reitz <mreitz@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit a3bd71b5773a3664692601e6e181f108e1e4aa41)
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 tests/qemu-iotests/175     | 26 ++++++++++++++++++++++----
Pablo Greco e6a3ae
 tests/qemu-iotests/175.out |  8 ++++----
Pablo Greco e6a3ae
 2 files changed, 26 insertions(+), 8 deletions(-)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175
Pablo Greco e6a3ae
index ca56e82..2e37c9a 100755
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/175
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/175
Pablo Greco e6a3ae
@@ -29,10 +29,25 @@ status=1	# failure is the default!
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 _cleanup()
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
-	_cleanup_test_img
Pablo Greco e6a3ae
+    _cleanup_test_img
Pablo Greco e6a3ae
+    rm -f "$TEST_DIR/empty"
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 trap "_cleanup; exit \$status" 0 1 2 3 15
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+# Some file systems sometimes allocate extra blocks independently of
Pablo Greco e6a3ae
+# the file size.  This function hides the resulting difference in the
Pablo Greco e6a3ae
+# stat -c '%b' output.
Pablo Greco e6a3ae
+# Parameter 1: Number of blocks an empty file occupies
Pablo Greco e6a3ae
+# Parameter 2: Image size in bytes
Pablo Greco e6a3ae
+_filter_blocks()
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    extra_blocks=$1
Pablo Greco e6a3ae
+    img_size=$2
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    sed -e "s/blocks=$extra_blocks\\(\$\\|[^0-9]\\)/nothing allocated/" \
Pablo Greco e6a3ae
+        -e "s/blocks=$((extra_blocks + img_size / 512))\\(\$\\|[^0-9]\\)/everything allocated/"
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 # get standard environment, filters and checks
Pablo Greco e6a3ae
 . ./common.rc
Pablo Greco e6a3ae
 . ./common.filter
Pablo Greco e6a3ae
@@ -41,18 +56,21 @@ _supported_fmt raw
Pablo Greco e6a3ae
 _supported_proto file
Pablo Greco e6a3ae
 _supported_os Linux
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
-size=1m
Pablo Greco e6a3ae
+size=$((1 * 1024 * 1024))
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+touch "$TEST_DIR/empty"
Pablo Greco e6a3ae
+extra_blocks=$(stat -c '%b' "$TEST_DIR/empty")
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 echo
Pablo Greco e6a3ae
 echo "== creating image with default preallocation =="
Pablo Greco e6a3ae
 _make_test_img $size | _filter_imgfmt
Pablo Greco e6a3ae
-stat -c "size=%s, blocks=%b" $TEST_IMG
Pablo Greco e6a3ae
+stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $size
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 for mode in off full falloc; do
Pablo Greco e6a3ae
     echo
Pablo Greco e6a3ae
     echo "== creating image with preallocation $mode =="
Pablo Greco e6a3ae
     IMGOPTS=preallocation=$mode _make_test_img $size | _filter_imgfmt
Pablo Greco e6a3ae
-    stat -c "size=%s, blocks=%b" $TEST_IMG
Pablo Greco e6a3ae
+    stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $size
Pablo Greco e6a3ae
 done
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 # success, all done
Pablo Greco e6a3ae
diff --git a/tests/qemu-iotests/175.out b/tests/qemu-iotests/175.out
Pablo Greco e6a3ae
index 76c02c6..6d9a5ed 100644
Pablo Greco e6a3ae
--- a/tests/qemu-iotests/175.out
Pablo Greco e6a3ae
+++ b/tests/qemu-iotests/175.out
Pablo Greco e6a3ae
@@ -2,17 +2,17 @@ QA output created by 175
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 == creating image with default preallocation ==
Pablo Greco e6a3ae
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
Pablo Greco e6a3ae
-size=1048576, blocks=0
Pablo Greco e6a3ae
+size=1048576, nothing allocated
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 == creating image with preallocation off ==
Pablo Greco e6a3ae
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=off
Pablo Greco e6a3ae
-size=1048576, blocks=0
Pablo Greco e6a3ae
+size=1048576, nothing allocated
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 == creating image with preallocation full ==
Pablo Greco e6a3ae
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=full
Pablo Greco e6a3ae
-size=1048576, blocks=2048
Pablo Greco e6a3ae
+size=1048576, everything allocated
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 == creating image with preallocation falloc ==
Pablo Greco e6a3ae
 Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=falloc
Pablo Greco e6a3ae
-size=1048576, blocks=2048
Pablo Greco e6a3ae
+size=1048576, everything allocated
Pablo Greco e6a3ae
  *** done
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae