Skip to contentSkip to conversation

Fix tests to work on non-4k block sized fs instances

PATCH Superseded Chandan Rajendra 4 participants 29 messages Sep 12, 2018 – Sep 18, 2018

v3 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

v3 cover Fix tests to work on non-4k block sized fs instances

This patchset fixes tests (mostly XFS specific ones) to work on variable block size. These patches now use the output of "od" utility to verify the contents of the test files instead of the md5sum utility.

Also, The patchset modifies _filter_fiemap() filter function to optionally print the file offset range in block size units.

Changelog:
V2->V3:
Added fixes for getting generic/018, generic/108 and generic/459 tests to work in 64k block size scenario.

V1->V2:
Eryu Guan pointed out that some of the tests were obtaining the filesystem's block size value from $TEST_DIR even though the test was executed on the $SCRATCH_DEV's filesystem. This version of the patchset fixes the following tests to obtain the block size from $SCRATCH_MNT. The relevant changes was made to the following tests:
xfs/009, xfs/050, xfs/074, xfs/139, xfs/140, xfs/190, xfs/299, generic/177 and generic/230.

Chandan Rajendra (19):
Fix xfs/009 to work with 64k block size xfs/050: Fix "Push past soft inode limit" case Fix xfs/050 to work with 64k block size
Fix xfs/074 to work with 64k block size
Fix xfs/127 to work with 64k block size
Fix xfs/139 to work with 64k block size
Fix xfs/140 to work with 64k block size
Fix xfs/190 to work with 64k block size
Fix xfs/299 to work with 64k block size xfs/325: Inject free_extent error after CoW operation Fix generic/102 to work with 64k block size Fix generic/172 to work with 64k block size Filter fiemap output by FS block size
Fix generic/177 to work with 64k block size Fix generic/230 to work with 64k block size Fix generic/235 to work with 64k block size Fix generic/459 to work with 64k block size Fix generic/018 to work with 64k block size Fix generic/108 to work with 64k block size

 common/punch          | 19 ++++++++---
 tests/generic/018     |  2 +-
 tests/generic/102     |  4 +--
 tests/generic/102.out | 20 +++++------
 tests/generic/108     |  4 +--
 tests/generic/172     |  4 +--
 tests/generic/177     | 20 ++++++-----
 tests/generic/177.out | 23 ++++++++-----
 tests/generic/230     | 23 +++++++------
 tests/generic/230.out | 16 ++++-----
 tests/generic/235     |  2 +-
 tests/generic/235.out |  4 +--
 tests/generic/459     | 14 ++++----
 tests/xfs/009         | 92 ++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out     | 66 ++++++++++++++++++------------------
 tests/xfs/050         | 26 ++++++++++-----
 tests/xfs/050.out     | 60 ++++++++++++++++-----------------
 tests/xfs/074         | 23 ++++++++++---
 tests/xfs/127         |  2 +-
 tests/xfs/139         | 15 +++++----
 tests/xfs/139.out     |  8 +++--
 tests/xfs/140         | 12 ++++---
 tests/xfs/190         | 26 ++++++++++-----
 tests/xfs/299         | 29 ++++++++++------
 tests/xfs/299.out     | 60 ++++++++++++++++-----------------
 tests/xfs/325         |  5 +--
 tests/xfs/325.out     |  2 +-
 27 files changed, 358 insertions(+), 223 deletions(-)
Signature · 1 line
2.9.5
#1 lore raw

PATCH v3 1/19 Fix xfs/009 to work with 64k block size

xfs_alloc_file_space() rounds up allocation requests by the filesystem block size. Hence this commit changes the test to work with block size units rather than with a multiple of 4096 bytes.

---
 tests/xfs/009     | 92 ++++++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out | 66 +++++++++++++++++++--------------------
 2 files changed, 110 insertions(+), 48 deletions(-)
tests/xfs/009 +77 -15
index 68f6379..70717eb 100755
@@ -14,9 +14,6 @@ here=`pwd`
 tmp=/tmp/$$
 status=1	# failure is the default!
 trap "_cleanup; exit \$status" 0 1 2 3 15
-# This isn't really related to fs block size, it's just what
-# alloc uses for the "block" unit in it's input parameters...
-bsize=4096
 
 _cleanup()
 {
@@ -24,13 +21,6 @@ _cleanup()
     _scratch_unmount
 }
 
-_block_filter()
-{
-   sed \
-	-e 's/[0-9][0-9]*\.\.[0-9][0-9]*/BLOCKRANGE/g' \
-	-e "s/blocksize $bsize/blocksize BSIZE/g"
-}
-
 _init()
 {
     echo "*** mkfs"
@@ -49,11 +39,6 @@ _init()
     fi
 }
 
-_filesize()
-{
-    ls -l $1 | $AWK_PROG '{print "filesize = " $5}'
-}
-
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
@@ -64,9 +49,86 @@ _supported_os Linux
 
 _require_scratch
 
+_filesize()
+{
+    ls -l $1 | $AWK_PROG -v bsize="$bsize" '{print "filesize = " $5 / bsize}'
+}
+
+_block_filter()
+{
+	$AWK_PROG -v bsize="$bsize" '
+	/blocksize/ {
+		printf("    blocksize BSIZE\n")
+
+		next
+	}
+
+	/CMD/ {
+		split($3, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($4, len, "=")
+		nr_blocks = strtonum(len[2])
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s %s off=%s, len=%d\n", $1, $2, offset, nr_blocks)
+
+		next
+	}
+
+	/MAP/ {
+		split($2, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($3, len, "=")
+
+		nr_blocks = strtonum(len[2])
+
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s off=%s, len=%d %s\n", $1, offset, nr_blocks, $4)
+
+		next
+	}
+
+	/TRUNCATE/ {
+		split($2, off, "=")
+		offset = strtonum(off[2]) / bsize
+
+		printf("    %s off=%s\n", $1, offset)
+
+		next
+	}
+
+	/\[[0-9]+,[0-9]+\]:/ {
+		printf("        %s BLOCKRANGE\n", $1)
+
+		next
+	}
+
+	{
+		print
+
+		next
+	}
+	'
+}
+
 _init
 out=$SCRATCH_MNT/$$.tmp
 
+# This isn't really related to fs block size, it's just what
+# alloc uses for the "block" unit in it's input parameters...
+# However, xfs_alloc_file_space() rounds up allocation
+# request by the filesystem's block size.
+bsize=$(_get_block_size $SCRATCH_MNT)
+
 # since we're using a clean FS here, we make some assumptions
 # about availability of contiguous blocks
 
tests/xfs/009.out +33 -33

138 lines not on this page · raw message

Signature · 1 line
2.9.5
#2 lore raw

Re: [PATCH V3 01/19] Fix xfs/009 to work with 64k block size

Quoted 123 lines · Chandan Rajendra

xfs_alloc_file_space() rounds up allocation requests by the filesystem block size. Hence this commit changes the test to work with block size units rather than with a multiple of 4096 bytes.

---
 tests/xfs/009     | 92 ++++++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out | 66 +++++++++++++++++++--------------------
 2 files changed, 110 insertions(+), 48 deletions(-)
tests/xfs/009 +69 -15
index 68f6379..70717eb 100755
@@ -14,9 +14,6 @@ here=`pwd`
 tmp=/tmp/$$
 status=1	# failure is the default!
 trap "_cleanup; exit \$status" 0 1 2 3 15
-# This isn't really related to fs block size, it's just what
-# alloc uses for the "block" unit in it's input parameters...
-bsize=4096
 
 _cleanup()
 {
@@ -24,13 +21,6 @@ _cleanup()
     _scratch_unmount
 }
 
-_block_filter()
-{
-   sed \
-	-e 's/[0-9][0-9]*\.\.[0-9][0-9]*/BLOCKRANGE/g' \
-	-e "s/blocksize $bsize/blocksize BSIZE/g"
-}
-
 _init()
 {
     echo "*** mkfs"
@@ -49,11 +39,6 @@ _init()
     fi
 }
 
-_filesize()
-{
-    ls -l $1 | $AWK_PROG '{print "filesize = " $5}'
-}
-
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
@@ -64,9 +49,86 @@ _supported_os Linux
 
 _require_scratch
 
+_filesize()
+{
+    ls -l $1 | $AWK_PROG -v bsize="$bsize" '{print "filesize = " $5 / bsize}'
+}
+
+_block_filter()
+{
+	$AWK_PROG -v bsize="$bsize" '
+	/blocksize/ {
+		printf("    blocksize BSIZE\n")
+
+		next
+	}
+
+	/CMD/ {
+		split($3, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($4, len, "=")
+		nr_blocks = strtonum(len[2])
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s %s off=%s, len=%d\n", $1, $2, offset, nr_blocks)
+
+		next
+	}
+
+	/MAP/ {
+		split($2, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($3, len, "=")
+
+		nr_blocks = strtonum(len[2])
+
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s off=%s, len=%d %s\n", $1, offset, nr_blocks, $4)
+
+		next
+	}
+
+	/TRUNCATE/ {
+		split($2, off, "=")
+		offset = strtonum(off[2]) / bsize
+
+		printf("    %s off=%s\n", $1, offset)
+
+		next
+	}
+
+	/\[[0-9]+,[0-9]+\]:/ {
+		printf("        %s BLOCKRANGE\n", $1)
+
+		next
+	}
+
+	{
+		print
+
+		next
+	}
+	'

tests/xfs/009 _supported_os Linux · line 130

Quoted 10 lines
tests/xfs/009 +7 -0
+}
+
 _init
 out=$SCRATCH_MNT/$$.tmp
 
+# This isn't really related to fs block size, it's just what
+# alloc uses for the "block" unit in it's input parameters...
+# However, xfs_alloc_file_space() rounds up allocation
+# request by the filesystem's block size.
+bsize=$(_get_block_size $SCRATCH_MNT)

[Sorry for the extremely long delay, I've been on leave...]

Hm. Certain filesystems draw a distinction between the fundamental block size and the minimum file block mapping size. ocfs2 supports having a file cluster size (mkfs.ocfs2 -C) that is greater than the fs block size, and (I think) xfs can achieve something similar for files on a realtime device via the mkfs.xfs -r extsize= option.

If you're dealing with writing things into a file for a test, I think you have to use _get_file_block_size to make sure that you don't fall afoul of the cluster/block difference. I don't know if you've checked that for this patch series...?

(Granted, I suspect that many tests have been sloppy about this...)

--D

Quoted 152 lines
tests/xfs/009 +1 -0
+
 # since we're using a clean FS here, we make some assumptions
 # about availability of contiguous blocks
 
tests/xfs/009.out +33 -33
index 7132aca..02b5d82 100644
@@ -3,8 +3,8 @@ QA output created by 009
 *** mount
 *** test 1 - reservations cleared on O_TRUNC
     blocksize BSIZE
-    CMD resvsp, off=0, len=4096000
-    MAP off=0, len=4096000 [0,1000]
+    CMD resvsp, off=0, len=1000
+    MAP off=0, len=1000 [0,1000]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
     MAP off=0, len=-1 [0-]
@@ -17,53 +17,53 @@ filesize = 0
 filesize = 0
 *** test 2 - reserve & filesize
     blocksize BSIZE
-    CMD resvsp, off=0, len=4096000
-    MAP off=0, len=4096000 [0,1000]
+    CMD resvsp, off=0, len=1000
+    MAP off=0, len=1000 [0,1000]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
 filesize = 0
 *** test 3 - alloc & filesize
     blocksize BSIZE
-    CMD allocsp, off=4096000, len=-1
-    MAP off=4096000, len=-1 [1000-]
+    CMD allocsp, off=1000, len=-1
+    MAP off=1000, len=-1 [1000-]
         [ofs,count]: start..end
-filesize = 4096000
+filesize = 1000
 *** test 4 - allocations cleared on O_TRUNC
     blocksize BSIZE
-    CMD allocsp, off=4096000, len=-1
-    MAP off=4096000, len=-1 [1000-]
+    CMD allocsp, off=1000, len=-1
+    MAP off=1000, len=-1 [1000-]
         [ofs,count]: start..end
-filesize = 4096000
+filesize = 1000
     blocksize BSIZE
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
 filesize = 0
 *** test 5 - reserve / unreserve
     blocksize BSIZE
-    CMD resvsp, off=0, len=409600
-    MAP off=0, len=409600 [0,100]
+    CMD resvsp, off=0, len=100
+    MAP off=0, len=100 [0,100]
         [ofs,count]: start..end
         [0,100]: BLOCKRANGE
-    CMD unresvsp, off=409600, len=2048000
-    MAP off=409600, len=2048000 [100,500]
+    CMD unresvsp, off=100, len=500
+    MAP off=100, len=500 [100,500]
         [ofs,count]: start..end
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,100]: BLOCKRANGE
-    CMD unresvsp, off=3686400, len=819200
-    MAP off=3686400, len=819200 [900,200]
+    CMD unresvsp, off=900, len=200
+    MAP off=900, len=200 [900,200]
         [ofs,count]: start..end
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,100]: BLOCKRANGE
 *** test 6 - reserve adjacent
     blocksize BSIZE
-    CMD resvsp, off=0, len=409600
-    MAP off=0, len=409600 [0,100]
+    CMD resvsp, off=0, len=100
+    MAP off=0, len=100 [0,100]
         [ofs,count]: start..end
         [0,100]: BLOCKRANGE
-    CMD resvsp, off=409600, len=409600
-    MAP off=409600, len=409600 [100,100]
+    CMD resvsp, off=100, len=100
+    MAP off=100, len=100 [100,100]
         [ofs,count]: start..end
         [100,100]: BLOCKRANGE
     MAP off=0, len=-1 [0-]
@@ -71,44 +71,44 @@ filesize = 0
         [0,200]: BLOCKRANGE
 *** test 7 - alloc
     blocksize BSIZE
-    CMD allocsp, off=4096000, len=-1
-    MAP off=4096000, len=-1 [1000-]
+    CMD allocsp, off=1000, len=-1
+    MAP off=1000, len=-1 [1000-]
         [ofs,count]: start..end
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
-    CMD allocsp, off=8192000, len=-1
-    MAP off=8192000, len=-1 [2000-]
+    CMD allocsp, off=2000, len=-1
+    MAP off=2000, len=-1 [2000-]
         [ofs,count]: start..end
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,2000]: BLOCKRANGE
-filesize = 8192000
+filesize = 2000
 *** test 8 - alloc & truncate
     blocksize BSIZE
-    CMD allocsp, off=4096000, len=-1
-    MAP off=4096000, len=-1 [1000-]
+    CMD allocsp, off=1000, len=-1
+    MAP off=1000, len=-1 [1000-]
         [ofs,count]: start..end
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
-    TRUNCATE off=2048000
+    TRUNCATE off=500
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,500]: BLOCKRANGE
-filesize = 2048000
+filesize = 500
 *** test 9 - reserve & truncate
     blocksize BSIZE
-    CMD resvsp, off=0, len=4096000
-    MAP off=0, len=4096000 [0,1000]
+    CMD resvsp, off=0, len=1000
+    MAP off=0, len=1000 [0,1000]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
-    TRUNCATE off=2048000
+    TRUNCATE off=500
     MAP off=0, len=-1 [0-]
         [ofs,count]: start..end
         [0,1000]: BLOCKRANGE
-filesize = 2048000
+filesize = 500
 *** unmount
Signature · 1 line
2.9.5
#3 lore raw

Re: [PATCH V3 01/19] Fix xfs/009 to work with 64k block size

Quoted 7 lines · Darrick J. Wong

Hm. Certain filesystems draw a distinction between the fundamental block size and the minimum file block mapping size. ocfs2 supports having a file cluster size (mkfs.ocfs2 -C) that is greater than the fs block size, and (I think) xfs can achieve something similar for files on a realtime device via the mkfs.xfs -r extsize= option.

Quoted 6 lines

If you're dealing with writing things into a file for a test, I think you have to use _get_file_block_size to make sure that you don't fall afoul of the cluster/block difference. I don't know if you've checked that for this patch series...?

(Granted, I suspect that many tests have been sloppy about this...)

Indeed, we have a number of failures in ext4 bigalloc which are because of this block size vs. cluster size difference. IIRC, a while back Eric Whitney had tried to start a discussion about how to best deal with this issue, but it wasn't clear what was the right way to add the necessary infrastructure to xfstests. I had assumed it was an ext4-only problem, and no one had time to try to come up with a solution.

As far as I know, we still don't have any general infrastructure to support this in xfstests. Is this correct, or am I missing something?

- Ted

#4 lore raw

Re: [PATCH V3 01/19] Fix xfs/009 to work with 64k block size

Quoted 23 lines · Theodore Y. Ts'o
Quoted 7 lines · Darrick J. Wong

Hm. Certain filesystems draw a distinction between the fundamental block size and the minimum file block mapping size. ocfs2 supports having a file cluster size (mkfs.ocfs2 -C) that is greater than the fs block size, and (I think) xfs can achieve something similar for files on a realtime device via the mkfs.xfs -r extsize= option.

Quoted 6 lines

If you're dealing with writing things into a file for a test, I think you have to use _get_file_block_size to make sure that you don't fall afoul of the cluster/block difference. I don't know if you've checked that for this patch series...?

(Granted, I suspect that many tests have been sloppy about this...)

Indeed, we have a number of failures in ext4 bigalloc which are because of this block size vs. cluster size difference. IIRC, a while back Eric Whitney had tried to start a discussion about how to best deal with this issue, but it wasn't clear what was the right way to add the necessary infrastructure to xfstests. I had assumed it was an ext4-only problem, and no one had time to try to come up with a solution.

Quoted 2 lines

As far as I know, we still don't have any general infrastructure to support this in xfstests. Is this correct, or am I missing something?

As far as I know we don't have any general infrastructure -- ocfs2 has only recently been subjected to xfstests, and I don't think there are many people running xfstests on a xfs filesystem where realtime has been forced on for all files *and* the rt extent size is larger than a block.

IOWs: we don't test hardly ever, it's probably broken, and sigh. :(

--D

Quoted 1 line

- Ted

#5 lore raw

Re: [PATCH V3 01/19] Fix xfs/009 to work with 64k block size

In reply to Darrick J. Wong
Quoted 143 lines · IST Darrick J. Wong
Quoted 123 lines · Chandan Rajendra

xfs_alloc_file_space() rounds up allocation requests by the filesystem block size. Hence this commit changes the test to work with block size units rather than with a multiple of 4096 bytes.

---
 tests/xfs/009     | 92 ++++++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out | 66 +++++++++++++++++++--------------------
 2 files changed, 110 insertions(+), 48 deletions(-)
tests/xfs/009 +69 -15
index 68f6379..70717eb 100755
@@ -14,9 +14,6 @@ here=`pwd`
 tmp=/tmp/$$
 status=1	# failure is the default!
 trap "_cleanup; exit \$status" 0 1 2 3 15
-# This isn't really related to fs block size, it's just what
-# alloc uses for the "block" unit in it's input parameters...
-bsize=4096
 
 _cleanup()
 {
@@ -24,13 +21,6 @@ _cleanup()
     _scratch_unmount
 }
 
-_block_filter()
-{
-   sed \
-	-e 's/[0-9][0-9]*\.\.[0-9][0-9]*/BLOCKRANGE/g' \
-	-e "s/blocksize $bsize/blocksize BSIZE/g"
-}
-
 _init()
 {
     echo "*** mkfs"
@@ -49,11 +39,6 @@ _init()
     fi
 }
 
-_filesize()
-{
-    ls -l $1 | $AWK_PROG '{print "filesize = " $5}'
-}
-
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
@@ -64,9 +49,86 @@ _supported_os Linux
 
 _require_scratch
 
+_filesize()
+{
+    ls -l $1 | $AWK_PROG -v bsize="$bsize" '{print "filesize = " $5 / bsize}'
+}
+
+_block_filter()
+{
+	$AWK_PROG -v bsize="$bsize" '
+	/blocksize/ {
+		printf("    blocksize BSIZE\n")
+
+		next
+	}
+
+	/CMD/ {
+		split($3, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($4, len, "=")
+		nr_blocks = strtonum(len[2])
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s %s off=%s, len=%d\n", $1, $2, offset, nr_blocks)
+
+		next
+	}
+
+	/MAP/ {
+		split($2, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($3, len, "=")
+
+		nr_blocks = strtonum(len[2])
+
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s off=%s, len=%d %s\n", $1, offset, nr_blocks, $4)
+
+		next
+	}
+
+	/TRUNCATE/ {
+		split($2, off, "=")
+		offset = strtonum(off[2]) / bsize
+
+		printf("    %s off=%s\n", $1, offset)
+
+		next
+	}
+
+	/\[[0-9]+,[0-9]+\]:/ {
+		printf("        %s BLOCKRANGE\n", $1)
+
+		next
+	}
+
+	{
+		print
+
+		next
+	}
+	'

tests/xfs/009 _supported_os Linux · line 130

Quoted 10 lines
tests/xfs/009 +7 -0
+}
+
 _init
 out=$SCRATCH_MNT/$$.tmp
 
+# This isn't really related to fs block size, it's just what
+# alloc uses for the "block" unit in it's input parameters...
+# However, xfs_alloc_file_space() rounds up allocation
+# request by the filesystem's block size.
+bsize=$(_get_block_size $SCRATCH_MNT)

[Sorry for the extremely long delay, I've been on leave...]

Hm. Certain filesystems draw a distinction between the fundamental block size and the minimum file block mapping size. ocfs2 supports having a file cluster size (mkfs.ocfs2 -C) that is greater than the fs block size, and (I think) xfs can achieve something similar for files on a realtime device via the mkfs.xfs -r extsize= option.

Quoted 4 lines

If you're dealing with writing things into a file for a test, I think you have to use _get_file_block_size to make sure that you don't fall afoul of the cluster/block difference. I don't know if you've checked that for this patch series...?

Thanks for pointing that out. I didn't know about the existance of _get_file_block_size. I will go through the patchset once again and figure out which one of _get_block_size v/s _get_file_block_size to use?

Signature · 1 line
chandan
#6 lore raw

Re: [PATCH V3 01/19] Fix xfs/009 to work with 64k block size

Quoted 144 lines · Chandan Rajendra
Quoted 143 lines · IST Darrick J. Wong
Quoted 123 lines · Chandan Rajendra

xfs_alloc_file_space() rounds up allocation requests by the filesystem block size. Hence this commit changes the test to work with block size units rather than with a multiple of 4096 bytes.

---
 tests/xfs/009     | 92 ++++++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out | 66 +++++++++++++++++++--------------------
 2 files changed, 110 insertions(+), 48 deletions(-)
tests/xfs/009 +69 -15
index 68f6379..70717eb 100755
@@ -14,9 +14,6 @@ here=`pwd`
 tmp=/tmp/$$
 status=1	# failure is the default!
 trap "_cleanup; exit \$status" 0 1 2 3 15
-# This isn't really related to fs block size, it's just what
-# alloc uses for the "block" unit in it's input parameters...
-bsize=4096
 
 _cleanup()
 {
@@ -24,13 +21,6 @@ _cleanup()
     _scratch_unmount
 }
 
-_block_filter()
-{
-   sed \
-	-e 's/[0-9][0-9]*\.\.[0-9][0-9]*/BLOCKRANGE/g' \
-	-e "s/blocksize $bsize/blocksize BSIZE/g"
-}
-
 _init()
 {
     echo "*** mkfs"
@@ -49,11 +39,6 @@ _init()
     fi
 }
 
-_filesize()
-{
-    ls -l $1 | $AWK_PROG '{print "filesize = " $5}'
-}
-
 # get standard environment, filters and checks
 . ./common/rc
 . ./common/filter
@@ -64,9 +49,86 @@ _supported_os Linux
 
 _require_scratch
 
+_filesize()
+{
+    ls -l $1 | $AWK_PROG -v bsize="$bsize" '{print "filesize = " $5 / bsize}'
+}
+
+_block_filter()
+{
+	$AWK_PROG -v bsize="$bsize" '
+	/blocksize/ {
+		printf("    blocksize BSIZE\n")
+
+		next
+	}
+
+	/CMD/ {
+		split($3, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($4, len, "=")
+		nr_blocks = strtonum(len[2])
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s %s off=%s, len=%d\n", $1, $2, offset, nr_blocks)
+
+		next
+	}
+
+	/MAP/ {
+		split($2, off, "=")
+		offset = strtonum(off[2])
+		if (offset != -1)
+			offset = offset / bsize
+
+		split($3, len, "=")
+
+		nr_blocks = strtonum(len[2])
+
+		if (nr_blocks != -1)
+			nr_blocks = nr_blocks / bsize
+
+		printf("    %s off=%s, len=%d %s\n", $1, offset, nr_blocks, $4)
+
+		next
+	}
+
+	/TRUNCATE/ {
+		split($2, off, "=")
+		offset = strtonum(off[2]) / bsize
+
+		printf("    %s off=%s\n", $1, offset)
+
+		next
+	}
+
+	/\[[0-9]+,[0-9]+\]:/ {
+		printf("        %s BLOCKRANGE\n", $1)
+
+		next
+	}
+
+	{
+		print
+
+		next
+	}
+	'

tests/xfs/009 _supported_os Linux · line 130

Quoted 10 lines
tests/xfs/009 +7 -0
+}
+
 _init
 out=$SCRATCH_MNT/$$.tmp
 
+# This isn't really related to fs block size, it's just what
+# alloc uses for the "block" unit in it's input parameters...
+# However, xfs_alloc_file_space() rounds up allocation
+# request by the filesystem's block size.
+bsize=$(_get_block_size $SCRATCH_MNT)

[Sorry for the extremely long delay, I've been on leave...]

Hm. Certain filesystems draw a distinction between the fundamental block size and the minimum file block mapping size. ocfs2 supports having a file cluster size (mkfs.ocfs2 -C) that is greater than the fs block size, and (I think) xfs can achieve something similar for files on a realtime device via the mkfs.xfs -r extsize= option.

Quoted 8 lines
Quoted 4 lines

If you're dealing with writing things into a file for a test, I think you have to use _get_file_block_size to make sure that you don't fall afoul of the cluster/block difference. I don't know if you've checked that for this patch series...?

Thanks for pointing that out. I didn't know about the existance of _get_file_block_size. I will go through the patchset once again and figure out which one of _get_block_size v/s _get_file_block_size to use?

<nod>

_get_block_size is usually the appropriate tool when you're trying to massage a filesystem into creating a particular metadata block (e.g. fragmenting the free space just enough to force it to store free space records in N separate metadata blocks).

_get_file_block_size is more appropriate for massaging a file into a particular format (e.g. fragmenting a file just enough to force it to store the file's extent records in N separate metadata blocks).

And mea culpa, the vast majority of tests (including the ones I wrote) use _g_b_s when they probably mean _g_f_b_s...

--D

Quoted 4 lines
Signature · 2 lines
-- 
chandan
#7 lore raw

PATCH v3 2/19 xfs/050: Fix "Push past soft inode limit" case

In reply to Chandan Rajendra

The test sets an inode soft limit of four but only three files are created. This commit creates two more files in order to really push past the soft inode limit.

---
 tests/xfs/050     |  2 ++
 tests/xfs/050.out | 36 ++++++++++++++++++------------------
 2 files changed, 20 insertions(+), 18 deletions(-)
tests/xfs/050 +2 -0
index dd77971..8569c2c 100755
@@ -143,6 +143,8 @@ _exercise()
 	echo "*** push past the soft inode limit" | tee -a $seqres.full
 	_file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0
 	_file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0
+	_file_as_id $SCRATCH_MNT/softie3 $id $type 1024 0
+	_file_as_id $SCRATCH_MNT/softie4 $id $type 1024 0
 	_qmount
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
 		-c "repquota -birnN -$type" $SCRATCH_DEV |
tests/xfs/050.out +18 -18
index 5cb4a10..ff9eb1c 100644
@@ -16,11 +16,11 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [7 days] 6 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
@@ -48,11 +48,11 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [7 days] 6 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
@@ -80,19 +80,19 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 6 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** push past the hard block limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 540 100 500 00 [--none--] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** unmount
 *** gqnoenforce
@@ -112,19 +112,19 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 6 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** push past the hard block limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 540 100 500 00 [--none--] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** unmount
 *** pquota
@@ -144,11 +144,11 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [7 days] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [7 days] 6 4 10 00 [7 days] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
@@ -176,18 +176,18 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
 
 *** push past the soft inode limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 0 100 500 00 [--------] 3 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 0 100 500 00 [--------] 5 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the soft block limit
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 4 4 10 00 [--------] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 6 4 10 00 [--------] 0 0 0 00 [--------]
 
 *** push past the hard inode limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 140 100 500 00 [--------] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 140 100 500 00 [--------] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** push past the hard block limit (expect EDQUOT)
 [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
-[NAME] 540 100 500 00 [--none--] 16 4 10 00 [--none--] 0 0 0 00 [--------]
+[NAME] 540 100 500 00 [--none--] 18 4 10 00 [--none--] 0 0 0 00 [--------]
 
 *** unmount
Signature · 1 line
2.9.5
#8 lore raw

PATCH v3 3/19 Fix xfs/050 to work with 64k block size

In reply to Chandan Rajendra

This commit changes the test to calculate quota limits based on the block size of the underlying filesystem. Also, the sizes of the test files are now made to be a multiple of the filesystem block size.

---
 tests/xfs/050     | 24 ++++++++++++++--------
 tests/xfs/050.out | 60 +++++++++++++++++++++++++++----------------------------
 2 files changed, 46 insertions(+), 38 deletions(-)
tests/xfs/050 +16 -8
index 8569c2c..01d82cc 100755
@@ -38,8 +38,13 @@ chmod a+rwx $seqres.full	# arbitrary users will write here
 _require_scratch
 _require_xfs_quota
 
-bsoft=100
-bhard=500
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+bsize=$(_get_block_size $SCRATCH_MNT)
+_scratch_unmount
+
+bsoft=$(( 25 * $bsize ))
+bhard=$(( 125 * $bsize ))
 isoft=4
 ihard=10
 
@@ -55,7 +60,9 @@ _filter_report()
 		if ($ENV{'LARGE_SCRATCH_DEV'}) {
 			$val = $ENV{'NUM_SPACE_FILES'};
 		}
-		s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g'
+		s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g' |
+	perl -npe '
+		s|^(.*?) (\d+) (\d+) (\d+)|$1 @{[$2 * 1024 /'$bsize']} @{[$3 * 1024 /'$bsize']} @{[$4 * 1024 /'$bsize']}|'
 }
 
 # The actual point at which limit enforcement takes place for the
@@ -70,9 +77,10 @@ _filter_and_check_blks()
 		if (/^\#'$id'\s+(\d+)/ && '$enforce') {
 			$maximum = '$bhard';
 			$minimum = '$bhard' * 85/100;
-			if (($1 < $minimum || $1 > $maximum) && '$noextsz') {
+			$used = $1 * 1024;
+			if (($used < $minimum || $used > $maximum) && '$noextsz') {
 				printf(" URK %d: %d is out of range! [%d,%d]\n",
-					'$id', $1, $minimum, $maximum);
+					'$id', $used, $minimum, $maximum);
 			}
 			s/^(\#'$id'\s+)(\d+)/\1 =OK=/g;
 		}
@@ -132,7 +140,7 @@ _exercise()
 	echo "ls -l $SCRATCH_MNT" >>$seqres.full
 	ls -l $SCRATCH_MNT >>$seqres.full
 	xfs_quota -D $tmp.projects -P $temp.projid -x \
-		-c "limit -$type bsoft=${bsoft}k bhard=${bhard}k $id" \
+		-c "limit -$type bsoft=${bsoft} bhard=${bhard} $id" \
 		-c "limit -$type isoft=$isoft ihard=$ihard $id" \
 		$SCRATCH_DEV
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
@@ -152,7 +160,7 @@ _exercise()
 
 	echo
 	echo "*** push past the soft block limit" | tee -a $seqres.full
-	_file_as_id $SCRATCH_MNT/softie $id $type 1024 140
+	_file_as_id $SCRATCH_MNT/softie $id $type $bsize 35
 	_qmount
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
 		-c "repquota -birnN -$type" $SCRATCH_DEV |
@@ -173,7 +181,7 @@ _exercise()
 	echo
 	# Note: for quota accounting (not enforcement), EDQUOT is not expected
 	echo "*** push past the hard block limit (expect EDQUOT)" | tee -a $seqres.full
-	_file_as_id $SCRATCH_MNT/softie $id $type 1024 540
+	_file_as_id $SCRATCH_MNT/softie $id $type $bsize 135
 	echo "ls -l $SCRATCH_MNT" >>$seqres.full
 	ls -l $SCRATCH_MNT >>$seqres.full
 	_qmount
tests/xfs/050.out +30 -30

167 lines not on this page · raw message

Signature · 1 line
2.9.5
#9 lore raw

PATCH v3 4/19 Fix xfs/074 to work with 64k block size

In reply to Chandan Rajendra

This commit makes file and extent size calculations to be a function of the filesystem's block size. It also adds a brief description of the bug that is being tested.

---
 tests/xfs/074 | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)
tests/xfs/074 +19 -4
index e5888d5..1e1e16e 100755
@@ -7,6 +7,18 @@
 # Check some extent size hint boundary conditions that can result in
 # MAXEXTLEN overflows.
 #
+# In xfs_bmap_extsize_align(), we had,
+# 	if ((temp = (align_alen % extsz))) {
+# 		align_alen += extsz - temp;
+# 	}
+# align_alen had the value of 2097151 (i.e. MAXEXTLEN) blocks. extsz had
+# the value of 4096 blocks.
+#
+# align_alen % extsz will be 4095. so align_alen will end up having
+# 2097151 + (4096 - 4095) = 2097152 i.e. (MAXEXTLEN + 1). Thus the length
+# of the new extent will be larger than MAXEXTLEN. This will later cause
+# the bmbt leaf to have an entry whose length is set to zero block count.
+#
 seq=`basename $0`
 seqres=$RESULT_DIR/$seq
 echo "QA output created by $seq"
@@ -46,19 +58,22 @@ mkdir -p $LOOP_MNT
 $XFS_IO_PROG -ft -c "truncate 1t" $LOOP_FILE >> $seqres.full
 LOOP_DEV=`_create_loop_device $LOOP_FILE`
 
-_mkfs_dev -d size=156452m,agcount=4 -l size=32m $LOOP_DEV
+_mkfs_dev -d size=260g,agcount=2 $LOOP_DEV
 _mount $LOOP_DEV $LOOP_MNT
 
+BLOCK_SIZE=$(_get_block_size $LOOP_MNT)
+
 # Corrupt the BMBT by creating extents larger than MAXEXTLEN
+# For 4k blocksize, MAXEXTLEN * 4k = 2097151 * 4k = 8589930496 = ~8GiB
 $XFS_IO_PROG -ft \
-	-c "extsize 16m" \
-	-c "falloc 0 30g" \
+	-c "extsize $(($BLOCK_SIZE * 4096))" \
+	-c "falloc 0 $(($BLOCK_SIZE * 2097152))" \
 	$LOOP_MNT/foo >> $seqres.full
 
 umount $LOOP_MNT
 _check_xfs_filesystem $LOOP_DEV none none
 
-_mkfs_dev -f -l size=32m $LOOP_DEV
+_mkfs_dev -f $LOOP_DEV
 _mount $LOOP_DEV $LOOP_MNT
 
 # check we trim both ends of the extent approproiately; this will fail
Signature · 1 line
2.9.5
#10 lore raw

PATCH v3 5/19 Fix xfs/127 to work with 64k block size

In reply to Chandan Rajendra

With reflink feature enabled, we require atleast 500MiB of disk space to create a filesystem with 64k block size. Hence this commit sets the size of the scratch filesystem to 512MiB.

---
 tests/xfs/127 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tests/xfs/127 +1 -1
index 41dacd7..6a95026 100755
@@ -34,7 +34,7 @@ _require_no_large_scratch_dev
 _require_cp_reflink
 
 echo "Format and mount"
-_scratch_mkfs_sized $((2 * 4096 * 4096)) > $seqres.full 2>&1
+_scratch_mkfs_sized $((512 * 1024 * 1024)) > $seqres.full 2>&1
 _scratch_mount >> $seqres.full 2>&1
 
 testdir=$SCRATCH_MNT/test-$seq
Signature · 1 line
2.9.5
#11 lore raw

PATCH v3 6/19 Fix xfs/139 to work with 64k block size

In reply to Chandan Rajendra

For 64k block size, the agsize provided in the test causes mkfs.xfs to fail due to insufficient log space. Hence this commit computes agsize based on block size of the filesystem.

---
 tests/xfs/139     | 15 +++++++++------
 tests/xfs/139.out |  8 ++++++--
 2 files changed, 15 insertions(+), 8 deletions(-)
tests/xfs/139 +9 -6
index 2a26635..9ab74c8 100755
@@ -34,17 +34,20 @@ _require_cp_reflink
 
 rm -f $seqres.full
 
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+blksz=$(_get_block_size $SCRATCH_MNT)
+_scratch_unmount
+
 echo "Format and mount"
-_scratch_mkfs -d agsize=$((32 * 1048576)) > $seqres.full 2>&1
+_scratch_mkfs -d agsize=$((4400 * $blksz)) > $seqres.full 2>&1
 _scratch_mount >> $seqres.full 2>&1
 
 testdir=$SCRATCH_MNT/test-$seq
 mkdir $testdir
-blksz="$(_get_block_size $testdir)"
 
 echo "Create the original files"
-sz=$((48 * 1048576))
-nr=$((sz / blksz))
+sz=$((4800 * $blksz))
 _pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
 _cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
 _scratch_cycle_mount
@@ -54,8 +57,8 @@ _pwrite_byte 0x62 0 $sz $testdir/file1 >> $seqres.full
 _scratch_cycle_mount
 
 echo "Compare files"
-md5sum $testdir/file1 | _filter_scratch
-md5sum $testdir/file2 | _filter_scratch
+od -t x1 $testdir/file1 | _filter_od
+od -t x1 $testdir/file2 | _filter_od
 #filefrag -v $testdir/file1 $testdir/file2
 
 # success, all done
tests/xfs/139.out +6 -2
index dc6a31e..55e03d6 100644
@@ -3,5 +3,9 @@ Format and mount
 Create the original files
 CoW every other block
 Compare files
-673c759fb131ccf3336c4f8c549a497e  SCRATCH_MNT/test-139/file1
-dc802351f6717547cbf4c951b294f952  SCRATCH_MNT/test-139/file2
+0 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+*
+11300
+0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+*
+11300
Signature · 1 line
2.9.5
#12 lore raw

Re: [PATCH V3 06/19] Fix xfs/139 to work with 64k block size

Quoted 16 lines · Chandan Rajendra

For 64k block size, the agsize provided in the test causes mkfs.xfs to fail due to insufficient log space. Hence this commit computes agsize based on block size of the filesystem.

---
 tests/xfs/139     | 15 +++++++++------
 tests/xfs/139.out |  8 ++++++--
 2 files changed, 15 insertions(+), 8 deletions(-)
tests/xfs/139 +0 -0
index 2a26635..9ab74c8 100755
@@ -34,17 +34,20 @@ _require_cp_reflink
 

tests/xfs/139 _require_cp_reflink · line 43

Quoted 10 lines
tests/xfs/139 +6 -1
 rm -f $seqres.full
 
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+blksz=$(_get_block_size $SCRATCH_MNT)
+_scratch_unmount
+
 echo "Format and mount"
-_scratch_mkfs -d agsize=$((32 * 1048576)) > $seqres.full 2>&1
+_scratch_mkfs -d agsize=$((4400 * $blksz)) > $seqres.full 2>&1

Uh... how did this magic 4400 number come about? I'd have expected 8192...?

--D

Quoted 43 lines
tests/xfs/139 +3 -5
 _scratch_mount >> $seqres.full 2>&1
 
 testdir=$SCRATCH_MNT/test-$seq
 mkdir $testdir
-blksz="$(_get_block_size $testdir)"
 
 echo "Create the original files"
-sz=$((48 * 1048576))
-nr=$((sz / blksz))
+sz=$((4800 * $blksz))
 _pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
 _cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
 _scratch_cycle_mount
@@ -54,8 +57,8 @@ _pwrite_byte 0x62 0 $sz $testdir/file1 >> $seqres.full
 _scratch_cycle_mount
 
 echo "Compare files"
-md5sum $testdir/file1 | _filter_scratch
-md5sum $testdir/file2 | _filter_scratch
+od -t x1 $testdir/file1 | _filter_od
+od -t x1 $testdir/file2 | _filter_od
 #filefrag -v $testdir/file1 $testdir/file2
 
 # success, all done
tests/xfs/139.out +6 -2
index dc6a31e..55e03d6 100644
@@ -3,5 +3,9 @@ Format and mount
 Create the original files
 CoW every other block
 Compare files
-673c759fb131ccf3336c4f8c549a497e  SCRATCH_MNT/test-139/file1
-dc802351f6717547cbf4c951b294f952  SCRATCH_MNT/test-139/file2
+0 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+*
+11300
+0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+*
+11300
Signature · 1 line
2.9.5
#13 lore raw

Re: [PATCH V3 06/19] Fix xfs/139 to work with 64k block size

Quoted 19 lines · IST Darrick J. Wong
Quoted 18 lines · Chandan Rajendra

For 64k block size, the agsize provided in the test causes mkfs.xfs to fail due to insufficient log space. Hence this commit computes agsize based on block size of the filesystem.

---
 tests/xfs/139     | 15 +++++++++------
 tests/xfs/139.out |  8 ++++++--
 2 files changed, 15 insertions(+), 8 deletions(-)
tests/xfs/139 +0 -0
index 2a26635..9ab74c8 100755
@@ -34,17 +34,20 @@ _require_cp_reflink
 
 rm -f $seqres.full
 
Quoted 11 lines

tests/xfs/139 _require_cp_reflink · line 43

Quoted 8 lines
tests/xfs/139 +6 -1
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+blksz=$(_get_block_size $SCRATCH_MNT)
+_scratch_unmount
+
 echo "Format and mount"
-_scratch_mkfs -d agsize=$((32 * 1048576)) > $seqres.full 2>&1
+_scratch_mkfs -d agsize=$((4400 * $blksz)) > $seqres.full 2>&1

Uh... how did this magic 4400 number come about? I'd have expected 8192...?

Sorry, I should have added a comment describing the reasoning behind using 4400. And now, I have forgotten the rational behind choosing 4400 blocks. Most likely it was to keep the AG size smaller when using 64k block size. The test requires that file1 occupy enough blocks to overflow an AG and then CoW-ing the same would cause ENOSPC when expanding the per-AG refcntbt if a bug exists in the Per-AG reservation.

I will post another version of this patchset which uses 8192 blocks as the AG size.

Signature · 1 line
chandan
#14 lore raw

PATCH v3 7/19 Fix xfs/140 to work with 64k block size

In reply to Chandan Rajendra

For 64k block size, the agsize provided in the test causes mkfs.xfs to fail due to insufficient log space. Hence this commit computes agsize based on block size of the filesystem.

---
 tests/xfs/140 | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)
tests/xfs/140 +8 -4
index 6e89fe3..c13ed65 100755
@@ -34,17 +34,21 @@ _require_cp_reflink
 
 rm -f $seqres.full
 
+_scratch_mkfs >/dev/null 2>&1
+_scratch_mount
+blksz=$(_get_block_size $SCRATCH_MNT)
+_scratch_unmount
+
 echo "Format and mount"
-_scratch_mkfs -d agsize=$((32 * 1048576)) > $seqres.full 2>&1
+_scratch_mkfs -d agsize=$((4400 * $blksz)) > $seqres.full 2>&1
 _scratch_mount >> $seqres.full 2>&1
 
 testdir=$SCRATCH_MNT/test-$seq
 mkdir $testdir
-blksz=$(_get_block_size $testdir)
 
 echo "Create the original files"
-sz=$((48 * 1048576))
-nr=$((sz / blksz))
+nr=4800
+sz=$(($nr * $blksz))
 _pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full
 _cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full
 _pwrite_byte 0x61 0 $sz $testdir/file2.chk >> $seqres.full
Signature · 1 line
2.9.5
#15 lore raw

PATCH v3 8/19 Fix xfs/190 to work with 64k block size

In reply to Chandan Rajendra

This commit describes "file hole" ranges in multiples of block sizes rather than using constants.

---
 tests/xfs/190 | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)
tests/xfs/190 +17 -9
index 3275e29..53dad06 100755
@@ -10,13 +10,6 @@
 #
 # PV 985792
 #
-#This is the list of holes to punch in the file limited to $filesize
-#NOTE holes cannot overlap or this script will fail.
-holes="4096:4096 303104:4096 1048576:512 1051648:8192 1065984:8192 1085440:7168"
-#filesize in MB
-filesize=10
-#Name of file to perform the test on
-filename=test-190
 
 seq=`basename $0`
 seqres=$RESULT_DIR/$seq
@@ -38,9 +31,24 @@ _supported_os Linux
 _require_scratch
 _scratch_mkfs_xfs >/dev/null 2>&1
 _scratch_mount
-fsblocksize=`$XFS_INFO_PROG $SCRATCH_MNT|sed 's/=/ /g'|awk '/^data / { print $3 }'`
 
-dd if=/dev/zero of=$SCRATCH_MNT/$filename bs=1024k count=10 >> $seqres.full 2>&1
+fsblocksize=$(_get_block_size $SCRATCH_MNT)
+
+#This is the list of holes to punch in the file limited to $filesize
+#NOTE holes cannot overlap or this script will fail.
+holes="$fsblocksize:$fsblocksize \
+$(($fsblocksize * 74)):$fsblocksize \
+$(($fsblocksize * 256)):$(($fsblocksize / 8)) \
+$(echo scale=0\;$fsblocksize \* 256 \+ $fsblocksize \* 3 \/ 4 | bc):$(($fsblocksize * 2)) \
+$(echo scale=0\;$fsblocksize \* 260 \+ $fsblocksize \* 1 \/ 4 | bc):$(($fsblocksize * 2)) \
+$(($fsblocksize * 265)):$(echo scale=0\;$fsblocksize \+ $fsblocksize \* 3 \/ 4 | bc)"
+
+#filesize
+filesize=$(($fsblocksize * 2560))
+#Name of file to perform the test on
+filename=test-190
+
+$XFS_IO_PROG -f -c "pwrite 0 $(($fsblocksize * 2560))" $SCRATCH_MNT/$filename >> $seqres.full 2>&1
 
 # run DMAPI test using verbose output
 echo Punching holes in file
Signature · 1 line
2.9.5
#16 lore raw

PATCH v3 9/19 Fix xfs/299 to work with 64k block size

In reply to Chandan Rajendra

This commit changes the test to calculate quota limits based on the block size of the underlying filesystem. Also, the sizes of the test files are now made to be a multiple of the filesystem block size.

---
 tests/xfs/299     | 29 +++++++++++++++++----------
 tests/xfs/299.out | 60 +++++++++++++++++++++++++++----------------------------
 2 files changed, 48 insertions(+), 41 deletions(-)
tests/xfs/299 +18 -11
index f0012ff..5a0e693 100755
@@ -41,11 +41,6 @@ _require_xfs_quota
 _require_xfs_mkfs_crc
 _require_xfs_crc
 
-bsoft=100
-bhard=500
-isoft=4
-ihard=10
-
 _filter_report()
 {
 	tr -s '[:space:]' | \
@@ -58,7 +53,9 @@ _filter_report()
 		if ($ENV{'LARGE_SCRATCH_DEV'}) {
 			$val = $ENV{'NUM_SPACE_FILES'};
 		}
-		s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g'
+		s/(^\[ROOT\] \S+ \S+ \S+ \S+ \[--------\] )(\S+)/$1@{[$2 - $val]}/g' |
+	perl -npe '
+		s|^(.*?) (\d+) (\d+) (\d+)|$1 @{[$2 * 1024 /'$bsize']} @{[$3 * 1024 /'$bsize']} @{[$4 * 1024 /'$bsize']}|'
 }
 
 # The actual point at which limit enforcement takes place for the
@@ -73,9 +70,10 @@ _filter_and_check_blks()
 		if (/^\#'$id'\s+(\d+)/ && '$enforce') {
 			$maximum = '$bhard';
 			$minimum = '$bhard' * 85/100;
-			if (($1 < $minimum || $1 > $maximum) && '$noextsz') {
+			$used = $1 * 1024;
+			if (($used < $minimum || $used > $maximum) && '$noextsz') {
 				printf(" URK %d: %d is out of range! [%d,%d]\n",
-					'$id', $1, $minimum, $maximum);
+					'$id', $used, $minimum, $maximum);
 			}
 			s/^(\#'$id'\s+)(\d+)/\1 =OK=/g;
 		}
@@ -128,7 +126,7 @@ _exercise()
 	echo "ls -l $SCRATCH_MNT" >>$seqres.full
 	ls -l $SCRATCH_MNT >>$seqres.full
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
-		-c "limit -$type bsoft=${bsoft}k bhard=${bhard}k $id" \
+		-c "limit -$type bsoft=${bsoft} bhard=${bhard} $id" \
 		-c "limit -$type isoft=$isoft ihard=$ihard $id" \
 		$SCRATCH_DEV
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
@@ -139,6 +137,8 @@ _exercise()
 	echo "*** push past the soft inode limit" | tee -a $seqres.full
 	_file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0
 	_file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0
+	_file_as_id $SCRATCH_MNT/softie3 $id $type 1024 0
+	_file_as_id $SCRATCH_MNT/softie4 $id $type 1024 0
 	_qmount
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
 		-c "repquota -birnN -$type" $SCRATCH_DEV |
@@ -146,7 +146,7 @@ _exercise()
 
 	echo
 	echo "*** push past the soft block limit" | tee -a $seqres.full
-	_file_as_id $SCRATCH_MNT/softie $id $type 1024 140
+	_file_as_id $SCRATCH_MNT/softie $id $type $bsize 35
 	_qmount
 	xfs_quota -D $tmp.projects -P $tmp.projid -x \
 		-c "repquota -birnN -$type" $SCRATCH_DEV |
@@ -167,7 +167,7 @@ _exercise()
 	echo
 	# Note: for quota accounting (not enforcement), EDQUOT is not expected
 	echo "*** push past the hard block limit (expect EDQUOT)" | tee -a $seqres.full
-	_file_as_id $SCRATCH_MNT/softie $id $type 1024 540
+	_file_as_id $SCRATCH_MNT/softie $id $type $bsize 135
 	echo "ls -l $SCRATCH_MNT" >>$seqres.full
 	ls -l $SCRATCH_MNT >>$seqres.full
 	_qmount
@@ -202,6 +202,13 @@ echo "*** user, group, and project"
 _qmount_option "uquota,gquota,pquota"
 _qmount
 
+bsize=$(_get_block_size $SCRATCH_MNT)
+
+bsoft=$(( 25 * $bsize ))
+bhard=$(( 125 * $bsize ))
+isoft=4
+ihard=10
+
 # non-root users need to be able to write to this filesystem
 chmod 777 $SCRATCH_MNT
 
tests/xfs/299.out +30 -30

167 lines not on this page · raw message

Signature · 1 line
2.9.5
#17 lore raw

PATCH v3 10/19 xfs/325: Inject free_extent error after CoW operation

In reply to Chandan Rajendra

On a 64k blocksized filesystem, when the test CoWs the file2's offset range [10 * 64k, 19 * 64k], the call to xfs_bmapi_reserve_delalloc() allocates 32 64k blocks. This is because XFS_DEFAULT_COWEXTSZ_HINT has the value of 32 and xfs_get_cowextsz_hint() uses this to compute the extent alignment. This leads to xfs_bmapi_reserve_delalloc() to reserve space corresponding to the file range [0, 32 * 64k] in the inode's cow fork area. On completion of write I/O corresponding to file2's range [10 * 64k, 19 * 64k], xfs_end_io() moves 10 out of the originally allocated 32 64k blocks to the data fork area. The remaining 22 64k blocks linger on in cow fork area of the inode.

Later, when servicing the exit() syscall for the xfs_io process, xfs_free_eofblocks() ends up invoking xfs_reflink_cancel_cow_blocks() since i_delayed_blks has the value 22. xfs_reflink_cancel_cow_blocks() indirectly invokes __xfs_free_extent() which returns EIO since XFS_ERRTAG_FREE_EXTENT has been set. This leads to the filesystem to be shutdown. The "rm" command invoked later ends up returning an error and hence the test fails. The test actually requires that the filesystem gets shutdown when executing the "rm" command.

To fix the problem, this commit injects the free_extent error after we CoW file2's [10 * 64k, 19 * 64k] range.

---
 tests/xfs/325     | 5 +++--
 tests/xfs/325.out | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)
tests/xfs/325 +3 -2
index b156de9..6795901 100755
@@ -54,11 +54,12 @@ echo "Check files"
 md5sum $SCRATCH_MNT/file1 | _filter_scratch
 md5sum $SCRATCH_MNT/file2 | _filter_scratch
 
+echo "CoW a few blocks"
+$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
+
 echo "Inject error"
 _scratch_inject_error "free_extent"
 
-echo "CoW a few blocks"
-$XFS_IO_PROG -c "pwrite -W -S 0x67 $((10 * blksz)) $((10 * blksz))" $SCRATCH_MNT/file2 >> $seqres.full
 rm $SCRATCH_MNT/file1
 sync
 
tests/xfs/325.out +1 -1
index 4e25d2b..92027cd 100644
@@ -4,8 +4,8 @@ Create files
 Check files
 d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file1
 d5a0ed0305c8df4180cb2bf975ecffe8  SCRATCH_MNT/file2
-Inject error
 CoW a few blocks
+Inject error
 FS should be shut down, touch will fail
 touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error
 Remount to replay log
Signature · 1 line
2.9.5
#18 lore raw

PATCH v3 11/19 Fix generic/102 to work with 64k block size

In reply to Chandan Rajendra

With 64k block size, mkfs.xfs fails with the following message when the filesystem size is 512MiB in size,

"log size 2037 blocks too small, minimum size is 2473 blocks"

Hence this commit increases the test filesystem size to 1GiB. Also, the size of the test file is increased to 800MiB which is ~80% of the test filesystem size. This is in proportion to the 400MiB test file used with the original 512MiB test filesystem.

---
 tests/generic/102     |  4 ++--
 tests/generic/102.out | 20 ++++++++++----------
 2 files changed, 12 insertions(+), 12 deletions(-)
tests/generic/102 +2 -2
index faf940a..29abd89 100755
@@ -31,14 +31,14 @@ _require_scratch
 
 rm -f $seqres.full
 
-dev_size=$((512 * 1024 * 1024))     # 512MB filesystem
+dev_size=$((1024 * 1024 * 1024))     # 1GB filesystem
 _scratch_mkfs_sized $dev_size >>$seqres.full 2>&1
 _scratch_mount
 
 for ((i = 0; i < 10; i++)); do
 	echo "loop $i" >>$seqres.full
 
-	$XFS_IO_PROG -f -c "pwrite -b 1m 0 400m" "$SCRATCH_MNT"/file | \
+	$XFS_IO_PROG -f -c "pwrite -b 1m 0 800m" "$SCRATCH_MNT"/file | \
 _filter_xfs_io | _filter_scratch
 
 	rm -f "$SCRATCH_MNT"/file
tests/generic/102.out +10 -10
index fc9275d..b58aa5c 100644
@@ -1,21 +1,21 @@
 QA output created by 102
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 419430400/419430400 bytes at offset 0
+wrote 838860800/838860800 bytes at offset 0
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
Signature · 1 line
2.9.5
#19 lore raw

PATCH v3 12/19 Fix generic/172 to work with 64k block size

In reply to Chandan Rajendra

For 64k block size, With 256MiB as the XFS filesystem size and 168 MiB as the size of the clone source file, we end up hitting ENOSPC when cloning the source file. This happens due to lack of space for housing the corresponding metadata. This scenario also occurs when using a 512MiB XFS filesystem and 300MiB clone source file.

Hence this commit increases the size of the test filesystem to 1 GiB and the size of the clone source file to 768MiB.

---
 tests/generic/172 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
tests/generic/172 +2 -2
index 5d6f295..08d2789 100755
@@ -47,8 +47,8 @@ echo "Reformat with appropriate size"
 blksz="$(_get_block_size $testdir)"
 umount $SCRATCH_MNT
 
-file_size=$((168 * 1024 * 1024))
-fs_size=$((256 * 1024 * 1024))
+file_size=$((768 * 1024 * 1024))
+fs_size=$((1024 * 1024 * 1024))
 _scratch_mkfs_sized $fs_size >> $seqres.full 2>&1
 _scratch_mount >> $seqres.full 2>&1
 rm -rf $testdir
Signature · 1 line
2.9.5
#20 lore raw

PATCH v3 13/19 Filter fiemap output by FS block size

In reply to Chandan Rajendra

When testing FS instances of block size other than 4k, the output of fiemap command will not match those in *.out files. This commit adds an optional "block size" argument to _filter_fiemap() which prints fiemap output in units of block size.

---
 common/punch | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
common/punch +14 -5
index 8088b01..0fc7729 100644
@@ -165,7 +165,11 @@ _test_punch() {
 
 _coalesce_extents()
 {
-	awk -F: '
+	block_size=$1
+
+	[[ -z $block_size ]] && block_size=512
+
+	awk -v block_size="$block_size" -F: '
 	{
 		range = $2;
 		type = $3;
@@ -176,19 +180,24 @@ _coalesce_extents()
 
 		if (type != prev_type) {
 			if (prev_type != "")
-				printf("%u]:%s\n", low - 1, prev_type);
-			printf("%u: [%u..", out_count++, low);
+				printf("%u]:%s\n", (low * 512 / block_size) - 1,
+					prev_type);
+			printf("%u: [%u..", out_count++,
+				(low * 512) / block_size);
 			prev_type = type;
 		}
 	}
 	END {
 		if (prev_type != "")
-			printf("%u]:%s\n", high, prev_type);
+			printf("%u]:%s\n", ((high + 1) * 512 / block_size) - 1,
+				prev_type);
 	}'
 }
 
 _filter_fiemap()
 {
+	block_size=$1
+
 	$AWK_PROG '
 		$3 ~ /hole/ {
 			print $1, $2, $3;
@@ -201,7 +210,7 @@ _filter_fiemap()
 		$5 ~ /0x[[:xdigit:]]+/ {
 			print $1, $2, "data";
 		}' |
-	_coalesce_extents
+	_coalesce_extents $block_size
 }
 
 _filter_fiemap_flags()
Signature · 1 line
2.9.5
#21 lore raw

PATCH v3 14/19 Fix generic/177 to work with 64k block size

In reply to Chandan Rajendra

This commit changes the test to work on file offsets that are aligned with the block size of the underlying filesystem.

---
 tests/generic/177     | 20 +++++++++++---------
 tests/generic/177.out | 23 +++++++++++++++--------
 2 files changed, 26 insertions(+), 17 deletions(-)
tests/generic/177 +11 -9
index 36577b1..069bb81 100755
@@ -45,44 +45,46 @@ _require_metadata_journaling $SCRATCH_DEV
 _init_flakey
 _mount_flakey
 
+BLOCK_SIZE=$(_get_block_size $SCRATCH_MNT)
+
 # Create out test file with some data and then fsync it.
 # We do the fsync only to make sure the last fsync we do in this test triggers
 # the fast code path of btrfs' fsync implementation, a condition necessary to
 # trigger the bug btrfs had.
-$XFS_IO_PROG -f -c "pwrite -S 0xaa 0K 128K" \
+$XFS_IO_PROG -f -c "pwrite -S 0xaa 0K $(($BLOCK_SIZE * 32))" \
 		-c "fsync"                  \
-		$SCRATCH_MNT/foobar | _filter_xfs_io
+		$SCRATCH_MNT/foobar | _filter_xfs_io_blocks_modified
 
 # Now punch a hole against the range [96K, 128K[.
-$XFS_IO_PROG -c "fpunch 96K 32K" $SCRATCH_MNT/foobar
+$XFS_IO_PROG -c "fpunch $(($BLOCK_SIZE * 24)) $(($BLOCK_SIZE * 8))" $SCRATCH_MNT/foobar
 
 # Punch another hole against a range that overlaps the previous range and ends
 # beyond eof.
-$XFS_IO_PROG -c "fpunch 64K 128K" $SCRATCH_MNT/foobar
+$XFS_IO_PROG -c "fpunch $(($BLOCK_SIZE * 16)) $(($BLOCK_SIZE * 32))" $SCRATCH_MNT/foobar
 
 # Punch another hole against a range that overlaps the first range ([96K, 128K[)
 # and ends at eof.
-$XFS_IO_PROG -c "fpunch 32K 96K" $SCRATCH_MNT/foobar
+$XFS_IO_PROG -c "fpunch $(($BLOCK_SIZE * 8)) $(($BLOCK_SIZE * 24))" $SCRATCH_MNT/foobar
 
 # Fsync our file. We want to verify that, after a power failure and mounting the
 # filesystem again, the file content reflects all the hole punch operations.
 $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foobar
 
 echo "File digest before power failure:"
-md5sum $SCRATCH_MNT/foobar | _filter_scratch
+od -t x1 $SCRATCH_MNT/foobar | _filter_od
 
 echo "Fiemap before power failure:"
-$XFS_IO_PROG -c "fiemap -v" $SCRATCH_MNT/foobar | _filter_fiemap
+$XFS_IO_PROG -c "fiemap -v" $SCRATCH_MNT/foobar | _filter_fiemap $BLOCK_SIZE
 
 _flakey_drop_and_remount
 
 echo "File digest after log replay:"
 # Must match the same digest we got before the power failure.
-md5sum $SCRATCH_MNT/foobar | _filter_scratch
+od -t x1 $SCRATCH_MNT/foobar | _filter_od
 
 echo "Fiemap after log replay:"
 # Must match the same extent listing we got before the power failure.
-$XFS_IO_PROG -c "fiemap -v" $SCRATCH_MNT/foobar | _filter_fiemap
+$XFS_IO_PROG -c "fiemap -v" $SCRATCH_MNT/foobar | _filter_fiemap $BLOCK_SIZE
 
 _unmount_flakey
 
tests/generic/177.out +15 -8
index cc10768..b47e136 100644
@@ -1,13 +1,20 @@
 QA output created by 177
-wrote 131072/131072 bytes at offset 0
-XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+Blocks modified: [0 - 31]
 File digest before power failure:
-d26bbb9a8396a9c0dd76423471b72b15  SCRATCH_MNT/foobar
+0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+*
+40
 Fiemap before power failure:
-0: [0..63]: data
-1: [64..255]: hole
+0: [0..7]: data
+1: [8..31]: hole
 File digest after log replay:
-d26bbb9a8396a9c0dd76423471b72b15  SCRATCH_MNT/foobar
+0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
+*
+10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+*
+40
 Fiemap after log replay:
-0: [0..63]: data
-1: [64..255]: hole
+0: [0..7]: data
+1: [8..31]: hole
Signature · 1 line
2.9.5
#22 lore raw

PATCH v3 15/19 Fix generic/230 to work with 64k block size

In reply to Chandan Rajendra

This commit changes the test to work on file offsets that are aligned with the block size of the underlying filesystem.

---
 tests/generic/230     | 23 +++++++++++++----------
 tests/generic/230.out | 16 ++++++++--------
 2 files changed, 21 insertions(+), 18 deletions(-)
tests/generic/230 +13 -10
index bc8c1ad..fc09391 100755
@@ -42,27 +42,27 @@ test_enforcement()
 	echo "### some buffered IO (type=$type)"
 	echo "--- initiating IO..." >>$seqres.full
 	# Firstly fit below block soft limit
-	echo "Write 900k..."
-	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 900k' -c fsync \
+	echo "Write 225 blocks..."
+	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((225 * $BLOCK_SIZE))' -c fsync \
 		$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
 		_filter_xfs_io_error | tee -a $seqres.full
 	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
 	# Secondly overcome block soft limit
-	echo "Rewrite 1001k..."
-	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 1001k' -c fsync \
+	echo "Rewrite 250 blocks plus 1 byte..."
+	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE + 1))' -c fsync \
 		$SCRATCH_MNT/file1" 2>&1 >>$seqres.full | \
 		_filter_xfs_io_error | tee -a $seqres.full
 	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
 	# Now try to overcome block hardlimit
-	echo "Write 1000k..."
-	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 1000k' -c fsync \
+	echo "Write 250 blocks..."
+	su $qa_user -c "$XFS_IO_PROG -c 'pwrite 0 $((250 * $BLOCK_SIZE))' -c fsync \
 		$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
 		_filter_xfs_io_error | tee -a $seqres.full
 	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
 	# Now sleep for grace time and check that softlimit got enforced
 	sleep $((grace+1))
-	echo "Write 4096..."
-	su $qa_user -c "$XFS_IO_PROG -c 'truncate 0' -c 'pwrite 0 4096' \
+	echo "Write 1 block..."
+	su $qa_user -c "$XFS_IO_PROG -c 'truncate 0' -c 'pwrite 0 $BLOCK_SIZE' \
 		$SCRATCH_MNT/file2" 2>&1 >>$seqres.full | \
 		_filter_xfs_io_error | tee -a $seqres.full
 	repquota -$type $SCRATCH_MNT  | grep -v "^root" >>$seqres.full 2>&1
@@ -101,11 +101,14 @@ grace=2
 
 _scratch_mkfs >> $seqres.full 2>&1
 _scratch_mount "-o usrquota,grpquota"
+BLOCK_SIZE=$(_get_block_size $SCRATCH_MNT)
 quotacheck -u -g $SCRATCH_MNT 2>/dev/null
 quotaon $SCRATCH_MNT 2>/dev/null
-setquota -u $qa_user 1000 2000 3 5 $SCRATCH_MNT
+setquota -u $qa_user $((250 * $BLOCK_SIZE / 1024)) \
+	 $((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
 setquota -u -t $grace $grace $SCRATCH_MNT
-setquota -g $qa_user 1000 2000 3 5 $SCRATCH_MNT
+setquota -g $qa_user $((250 * $BLOCK_SIZE / 1024)) \
+	 $((500 * $BLOCK_SIZE / 1024)) 3 5 $SCRATCH_MNT
 setquota -g -t $grace $grace $SCRATCH_MNT
 _scratch_unmount
 
tests/generic/230.out +8 -8
index fcbacf2..9e89a47 100644
@@ -4,11 +4,11 @@ QA output created by 230
 
 ### create files, setting up ownership (type=u)
 ### some buffered IO (type=u)
-Write 900k...
-Rewrite 1001k...
-Write 1000k...
+Write 225 blocks...
+Rewrite 250 blocks plus 1 byte...
+Write 250 blocks...
 pwrite: Disk quota exceeded
-Write 4096...
+Write 1 block...
 pwrite: Disk quota exceeded
 Touch 3+4
 Touch 5+6
@@ -20,11 +20,11 @@ touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded
 
 ### create files, setting up ownership (type=g)
 ### some buffered IO (type=g)
-Write 900k...
-Rewrite 1001k...
-Write 1000k...
+Write 225 blocks...
+Rewrite 250 blocks plus 1 byte...
+Write 250 blocks...
 pwrite: Disk quota exceeded
-Write 4096...
+Write 1 block...
 pwrite: Disk quota exceeded
 Touch 3+4
 Touch 5+6
Signature · 1 line
2.9.5
#23 lore raw

PATCH v3 16/19 Fix generic/235 to work with 64k block size

In reply to Chandan Rajendra

With 64k blocksized filesystem, this test fails since a single 8k write will actually end up consuming 64k. Hence this commit writes 64k data into the test file.

---
 tests/generic/235     | 2 +-
 tests/generic/235.out | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
tests/generic/235 +1 -1
index 902e9ad..6adc803 100755
@@ -55,7 +55,7 @@ _try_scratch_mount "-o remount,ro" 2>&1 | tee -a $seqres.full | _filter_scratch
 touch $SCRATCH_MNT/failed 2>&1 | tee -a $seqres.full | _filter_scratch
 _try_scratch_mount "-o remount,rw" 2>&1 | tee -a $seqres.full | _filter_scratch
 
-$XFS_IO_PROG -c 'pwrite 0 8k' -c 'fsync' \
+$XFS_IO_PROG -c 'pwrite 0 64k' -c 'fsync' \
 			$SCRATCH_MNT/testfile >>$seqres.full 2>&1
 do_repquota
 
tests/generic/235.out +2 -2
index 601fa2f..abcb47a 100644
@@ -17,10 +17,10 @@ Block grace time: 7days; Inode grace time: 7days
                         Block limits                File limits
 User            used    soft    hard  grace    used  soft  hard  grace
 ----------------------------------------------------------------------
-fsgqa     --       8       0       0              1     0     0       
+fsgqa     --      64       0       0              1     0     0       
 *** Report for group quotas on device SCRATCH_DEV
 Block grace time: 7days; Inode grace time: 7days
                         Block limits                File limits
 Group           used    soft    hard  grace    used  soft  hard  grace
 ----------------------------------------------------------------------
-fsgqa     --       8       0       0              1     0     0       
+fsgqa     --      64       0       0              1     0     0       
Signature · 1 line
2.9.5
#24 lore raw

PATCH v3 17/19 Fix generic/459 to work with 64k block size

In reply to Chandan Rajendra

With 64k block size, 200MiB disk space is not sufficient to create an XFS filesystem. Hence this commit increases the size of the overprovisioned dm-thin device to 300MiB. The commit also increases the other associated disk sizes (original physical size and new physical size) appropriately.

---
 tests/generic/459 | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)
tests/generic/459 +7 -7
index aee71a0..c430952 100755
@@ -59,14 +59,14 @@ vgname=vg_$seq
 lvname=lv_$seq
 poolname=pool_$seq
 snapname=snap_$seq
-origpsize=100
-virtsize=200
-newpsize=200
+origpsize=200
+virtsize=300
+newpsize=300
 
 # Ensure we have enough disk space
-_scratch_mkfs_sized $((250 * 1024 * 1024)) >>$seqres.full 2>&1
+_scratch_mkfs_sized $((350 * 1024 * 1024)) >>$seqres.full 2>&1
 
-# Create a 100MB dm-thin POOL
+# Create a 200MB dm-thin POOL
 $LVM_PROG pvcreate -f $SCRATCH_DEV >>$seqres.full 2>&1
 $LVM_PROG vgcreate -f $vgname $SCRATCH_DEV >>$seqres.full 2>&1
 
@@ -74,7 +74,7 @@ $LVM_PROG lvcreate  --thinpool $poolname  --errorwhenfull y \
 		    --zero n -L $origpsize \
 		    --poolmetadatasize 4M $vgname >>$seqres.full 2>&1
 
-# Create a overprovisioned 200MB dm-thin virt. device
+# Create a overprovisioned 300MB dm-thin virt. device
 $LVM_PROG lvcreate  --virtualsize $virtsize \
 		    -T $vgname/$poolname \
 		    -n $lvname >>$seqres.full 2>&1
@@ -92,7 +92,7 @@ _mount /dev/mapper/$vgname-$snapname $SCRATCH_MNT
 
 # Consume all space available in the volume and freeze to ensure everything
 # required to make the fs consistent is flushed to disk.
-$XFS_IO_PROG -f -d -c 'pwrite -b 1m 0 120m' $SCRATCH_MNT/f1 >>$seqres.full 2>&1
+$XFS_IO_PROG -f -d -c 'pwrite -b 1m 0 220m' $SCRATCH_MNT/f1 >>$seqres.full 2>&1
 
 # In XFS, this freeze will never complete until the dm-thin POOL device is
 # extended. It is expected, and is only used so xfsaild is triggered to
Signature · 1 line
2.9.5
#25 lore raw

PATCH v3 18/19 Fix generic/018 to work with 64k block size

In reply to Chandan Rajendra

This commit replaces the hard coded bsize variable with the block size obtained from the underlying filesystem.

---
 tests/generic/018 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
tests/generic/018 +1 -1
index 43610ef..2a56c38 100755
@@ -42,7 +42,7 @@ fragfile=$SCRATCH_MNT/fragfile.$$
 rm -f $fragfile
 
 # Craft some fragmented files, defrag them, check the result.
-bsize=4096
+bsize=$(_get_block_size $SCRATCH_MNT)
 
 echo "zero-length file:" | tee -a $seqres.full
 touch $fragfile
Signature · 1 line
2.9.5
#26 lore raw

PATCH v3 19/19 Fix generic/108 to work with 64k block size

In reply to Chandan Rajendra

This commit increases the size of the scsi debug device to 300MiB to accommodate a 275MiB sized XFS filesystem with 64k block size. mkfs.xfs fails to create a 64k block sized filesystem on devices with capacity less than 275MiB.

---
 tests/generic/108 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
tests/generic/108 +2 -2
index e464335..9b4fe60 100755
@@ -48,7 +48,7 @@ vgname=vg_$seq
 rm -f $seqres.full
 
 # _get_scsi_debug_dev returns a scsi debug device with 128M in size by default
-SCSI_DEBUG_DEV=`_get_scsi_debug_dev`
+SCSI_DEBUG_DEV=`_get_scsi_debug_dev 512 512 0 300`
 if [ "$SCSI_DEBUG_DEV" == "/dev/" ]; then
 	_fail "Failed to initialize scsi debug device"
 fi
@@ -59,7 +59,7 @@ $LVM_PROG pvcreate -f $SCSI_DEBUG_DEV $SCRATCH_DEV >>$seqres.full 2>&1
 $LVM_PROG vgcreate -f $vgname $SCSI_DEBUG_DEV $SCRATCH_DEV >>$seqres.full 2>&1
 # We use yes pipe instead of 'lvcreate --yes' because old version of lvm
 # (like 2.02.95 in RHEL6) don't support --yes option
-yes | $LVM_PROG lvcreate -i 2 -I 4m -L 100m -n $lvname $vgname \
+yes | $LVM_PROG lvcreate -i 2 -I 4m -L 275m -n $lvname $vgname \
 	>>$seqres.full 2>&1
 # wait for lv creation to fully complete
 $UDEV_SETTLE_PROG >>$seqres.full 2>&1
Signature · 1 line
2.9.5
#27 lore raw
In reply to Chandan Rajendra
Quoted 63 lines · Chandan Rajendra

This patchset fixes tests (mostly XFS specific ones) to work on variable block size. These patches now use the output of "od" utility to verify the contents of the test files instead of the md5sum utility.

Also, The patchset modifies _filter_fiemap() filter function to optionally print the file offset range in block size units.

Changelog:
V2->V3:
Added fixes for getting generic/018, generic/108 and generic/459 tests to work in 64k block size scenario.

V1->V2:
Eryu Guan pointed out that some of the tests were obtaining the filesystem's block size value from $TEST_DIR even though the test was executed on the $SCRATCH_DEV's filesystem. This version of the patchset fixes the following tests to obtain the block size from $SCRATCH_MNT. The relevant changes was made to the following tests:
xfs/009, xfs/050, xfs/074, xfs/139, xfs/140, xfs/190, xfs/299, generic/177 and generic/230.

Chandan Rajendra (19):
Fix xfs/009 to work with 64k block size xfs/050: Fix "Push past soft inode limit" case Fix xfs/050 to work with 64k block size
Fix xfs/074 to work with 64k block size
Fix xfs/127 to work with 64k block size
Fix xfs/139 to work with 64k block size
Fix xfs/140 to work with 64k block size
Fix xfs/190 to work with 64k block size
Fix xfs/299 to work with 64k block size xfs/325: Inject free_extent error after CoW operation Fix generic/102 to work with 64k block size Fix generic/172 to work with 64k block size Filter fiemap output by FS block size
Fix generic/177 to work with 64k block size Fix generic/230 to work with 64k block size Fix generic/235 to work with 64k block size Fix generic/459 to work with 64k block size Fix generic/018 to work with 64k block size Fix generic/108 to work with 64k block size

 common/punch          | 19 ++++++++---
 tests/generic/018     |  2 +-
 tests/generic/102     |  4 +--
 tests/generic/102.out | 20 +++++------
 tests/generic/108     |  4 +--
 tests/generic/172     |  4 +--
 tests/generic/177     | 20 ++++++-----
 tests/generic/177.out | 23 ++++++++-----
 tests/generic/230     | 23 +++++++------
 tests/generic/230.out | 16 ++++-----
 tests/generic/235     |  2 +-
 tests/generic/235.out |  4 +--
 tests/generic/459     | 14 ++++----
 tests/xfs/009         | 92 ++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out     | 66 ++++++++++++++++++------------------
 tests/xfs/050         | 26 ++++++++++-----
 tests/xfs/050.out     | 60 ++++++++++++++++-----------------
 tests/xfs/074         | 23 ++++++++++---
 tests/xfs/127         |  2 +-
 tests/xfs/139         | 15 +++++----
Quoted 10 lines
 tests/xfs/139.out     |  8 +++--
 tests/xfs/140         | 12 ++++---
 tests/xfs/190         | 26 ++++++++++-----
 tests/xfs/299         | 29 ++++++++++------
 tests/xfs/299.out     | 60 ++++++++++++++++-----------------
 tests/xfs/325         |  5 +--
 tests/xfs/325.out     |  2 +-
 27 files changed, 358 insertions(+), 223 deletions(-)

Hi,

For help, I've tested this patchset on ppc64le machine with 4.18 released kernel. But only tested thoses cases which changed, 64k xfs/ext4 and 4k xfs/ext4 all test passed, refer to [1], [2], [3], [4].

But I tested 512 block size (crc=0) XFS passingly, then hit a new failure:

# ./check xfs/050
FSTYP         -- xfs (debug)
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug                                            
MKFS_OPTIONS  -- -f -b size=512 -m crc=0 /dev/sda5
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2                      

xfs/050 18s ... - output mismatch (see /root/xfstests-patched/results//xfs/050.out.bad)

    --- tests/xfs/050.out       2018-09-17 05:56:47.738590176 -0400
    +++ /root/xfstests-patched/results//xfs/050.out.bad 2018-09-18 01:12:55.538747111 -0400
    @@ -12,23 +12,24 @@
     
     *** report initial settings
     [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
    -[NAME] 0 25 125 00 [--------] 1 4 10 00 [--------] 0 0 0 00 [--------]
    +[NAME] 0 24 124 00 [--------] 1 4 10 00 [--------] 0 0 0 00 [--------]
     
     *** push past the soft inode limit
    ...
    (Run 'diff -u tests/xfs/050.out /root/xfstests-patched/results//xfs/050.out.bad'  to see the entire diff)

Ran: xfs/050
Failures: xfs/050
Failed 1 of 1 tests

It test passed on xfstests which doesn't merged above patches:

# ./check xfs/050
FSTYP         -- xfs (debug)
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug
MKFS_OPTIONS  -- -f -b size=512 -m crc=0 /dev/sda5
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2

xfs/050 16s ... 16s
Ran: xfs/050
Passed all 1 tests

Thanks,
Zorro

[1] Ext4 test passed on 64k block size:

# ./check generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459
FSTYP         -- ext4
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug
MKFS_OPTIONS  -- -b 65536 /dev/sda5
MOUNT_OPTIONS -- -o acl,user_xattr -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2
generic/018 7s ...  7s
generic/102 5s ...  44s
generic/108 9s ...  6s

generic/172 16s ... [not run] Reflink not supported by scratch filesystem type: ext4 generic/177 5s ... 5s
generic/230 19s ... 18s
generic/235 4s ... 5s
generic/459 26s ... 19s
Ran: generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459 Not run: generic/172
Passed all 8 tests

[2] XFS test passed on 64k block size:

# ./check generic/018 generic/102 generic/108 generic/172 generic/177  generic/230 generic/235 generic/459 xfs/009 xfs/050 xfs/074 xfs/127 xfs/139 xfs/140 xfs/190 xfs/299 xfs/325
FSTYP         -- xfs (debug)
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug
MKFS_OPTIONS  -- -f -b size=65536 /dev/sda5
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2

generic/018 5s ... 7s
generic/102 6s ... 5s

generic/108 16s ...  9s
generic/172 12s ...  16s
generic/177 14s ...  5s
generic/230 29s ...  19s
generic/235 5s ...  4s
generic/459 24s ...  26s
xfs/009 6s ...  6s
xfs/050 68s ...  34s
xfs/074 14s ...  7s
xfs/127 16s ...  25s
xfs/139 266s ...  33s
xfs/140 427s ...  90s
xfs/190 27s ...  7s
xfs/299 24s ...  20s
xfs/325 10s ...  9s

Ran: generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459 xfs/009 xfs/050 xfs/074 xfs/127 xfs/139 xfs/140 xfs/190 xfs/299 xfs/325 Passed all 17 tests

[3] Ext4 test passed on default block size

# ./check generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459
FSTYP         -- ext4
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug
MKFS_OPTIONS  -- /dev/sda5
MOUNT_OPTIONS -- -o acl,user_xattr -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2

generic/018 7s ... 4s
generic/102 44s ... 52s
generic/108 6s ... 7s
generic/172 16s ... [not run] Reflink not supported by scratch filesystem type: ext4 generic/177 5s ... 3s
generic/230 18s ... 16s
generic/235 5s ... 2s
generic/459 19s ... 22s
Ran: generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459 Not run: generic/172
Passed all 8 tests

[4] XFS test passed on default block size

# ./check generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459 xfs/009 xfs/050 xfs/074 xfs/127 xfs/139 xfs/140 xfs/190 xfs/299 xfs/325
FSTYP         -- xfs (debug)
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug                                            
MKFS_OPTIONS  -- -f -bsize=4096 /dev/sda5
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2                      

generic/018 8s ... 5s
generic/102 70s ... 6s
generic/108 7s ... 7s
generic/172 16s ... 11s
generic/177 6s ... 4s
generic/230 18s ... 15s
generic/235 5s ... 3s
generic/459 21s ... 20s
xfs/009 6s ... 3s
xfs/050 34s ... 18s
xfs/074 7s ... 9s

xfs/127 25s ...  14s
xfs/139 33s ...  243s
xfs/140 90s ...  286s

xfs/190 7s ... 10s
xfs/299 20s ... 13s
xfs/325 9s ... 4s
Ran: generic/018 generic/102 generic/108 generic/172 generic/177 generic/230 generic/235 generic/459 xfs/009 xfs/050 xfs/074 xfs/127 xfs/139 xfs/140 xfs/190 xfs/299 xfs/325 Passed all 17 tests

Quoted 2 lines

2.9.5

#28 lore raw
Quoted 101 lines · IST Zorro Lang
Quoted 63 lines · Chandan Rajendra

This patchset fixes tests (mostly XFS specific ones) to work on variable block size. These patches now use the output of "od" utility to verify the contents of the test files instead of the md5sum utility.

Also, The patchset modifies _filter_fiemap() filter function to optionally print the file offset range in block size units.

Changelog:
V2->V3:
Added fixes for getting generic/018, generic/108 and generic/459 tests to work in 64k block size scenario.

V1->V2:
Eryu Guan pointed out that some of the tests were obtaining the filesystem's block size value from $TEST_DIR even though the test was executed on the $SCRATCH_DEV's filesystem. This version of the patchset fixes the following tests to obtain the block size from $SCRATCH_MNT. The relevant changes was made to the following tests:
xfs/009, xfs/050, xfs/074, xfs/139, xfs/140, xfs/190, xfs/299, generic/177 and generic/230.

Chandan Rajendra (19):
Fix xfs/009 to work with 64k block size xfs/050: Fix "Push past soft inode limit" case Fix xfs/050 to work with 64k block size
Fix xfs/074 to work with 64k block size
Fix xfs/127 to work with 64k block size
Fix xfs/139 to work with 64k block size
Fix xfs/140 to work with 64k block size
Fix xfs/190 to work with 64k block size
Fix xfs/299 to work with 64k block size xfs/325: Inject free_extent error after CoW operation Fix generic/102 to work with 64k block size Fix generic/172 to work with 64k block size Filter fiemap output by FS block size
Fix generic/177 to work with 64k block size Fix generic/230 to work with 64k block size Fix generic/235 to work with 64k block size Fix generic/459 to work with 64k block size Fix generic/018 to work with 64k block size Fix generic/108 to work with 64k block size

 common/punch          | 19 ++++++++---
 tests/generic/018     |  2 +-
 tests/generic/102     |  4 +--
 tests/generic/102.out | 20 +++++------
 tests/generic/108     |  4 +--
 tests/generic/172     |  4 +--
 tests/generic/177     | 20 ++++++-----
 tests/generic/177.out | 23 ++++++++-----
 tests/generic/230     | 23 +++++++------
 tests/generic/230.out | 16 ++++-----
 tests/generic/235     |  2 +-
 tests/generic/235.out |  4 +--
 tests/generic/459     | 14 ++++----
 tests/xfs/009         | 92 ++++++++++++++++++++++++++++++++++++++++++---------
 tests/xfs/009.out     | 66 ++++++++++++++++++------------------
 tests/xfs/050         | 26 ++++++++++-----
 tests/xfs/050.out     | 60 ++++++++++++++++-----------------
 tests/xfs/074         | 23 ++++++++++---
 tests/xfs/127         |  2 +-
 tests/xfs/139         | 15 +++++----
Quoted 9 lines
 tests/xfs/139.out     |  8 +++--
 tests/xfs/140         | 12 ++++---
 tests/xfs/190         | 26 ++++++++++-----
 tests/xfs/299         | 29 ++++++++++------
 tests/xfs/299.out     | 60 ++++++++++++++++-----------------
 tests/xfs/325         |  5 +--
 tests/xfs/325.out     |  2 +-
 27 files changed, 358 insertions(+), 223 deletions(-)

Hi,

For help, I've tested this patchset on ppc64le machine with 4.18 released kernel. But only tested thoses cases which changed, 64k xfs/ext4 and 4k xfs/ext4 all test passed, refer to [1], [2], [3], [4].

But I tested 512 block size (crc=0) XFS passingly, then hit a new failure:

# ./check xfs/050
FSTYP         -- xfs (debug)
PLATFORM      -- Linux/ppc64le ibm-p9z-16-lp5 4.18.0-xfs-debug                                            
MKFS_OPTIONS  -- -f -b size=512 -m crc=0 /dev/sda5
MOUNT_OPTIONS -- -o context=system_u:object_r:root_t:s0 /dev/sda5 /mnt/xfstests/mnt2                      

xfs/050 18s ... - output mismatch (see /root/xfstests-patched/results//xfs/050.out.bad)

    --- tests/xfs/050.out       2018-09-17 05:56:47.738590176 -0400
    +++ /root/xfstests-patched/results//xfs/050.out.bad 2018-09-18 01:12:55.538747111 -0400
    @@ -12,23 +12,24 @@
     
     *** report initial settings
     [ROOT] 0 0 0 00 [--------] 3 0 0 00 [--------] 0 0 0 00 [--------]
    -[NAME] 0 25 125 00 [--------] 1 4 10 00 [--------] 0 0 0 00 [--------]
    +[NAME] 0 24 124 00 [--------] 1 4 10 00 [--------] 0 0 0 00 [--------]
     
     *** push past the soft inode limit
    ...
    (Run 'diff -u tests/xfs/050.out /root/xfstests-patched/results//xfs/050.out.bad'  to see the entire diff)
Quoted 3 lines

Ran: xfs/050
Failures: xfs/050
Failed 1 of 1 tests

Thanks for testing this. The mismatch happens here due to xfs_quota using 1K as the minimum block size. I will have to think about how to solve this.

Signature · 1 line
chandan