fstests: btrfs/14[01]: Use proper helper to get both devid and physical for corruption
diff mbox series

Message ID 20191212083123.25888-1-wqu@suse.com
State New
Headers show
Series
  • fstests: btrfs/14[01]: Use proper helper to get both devid and physical for corruption
Related show

Commit Message

Qu Wenruo Dec. 12, 2019, 8:31 a.m. UTC
[BUG]
With btrfs-progs v5.4, btrfs/140 and btrfs/141 will fail.

[CAUSE]
Both tests are testing re-silvering of RAID1, thus they need to corrupt
on-disk data.

This requires to do manual logical -> physical bytes mapping in the test
case.
However the test case itself uses too many hard coded helper to grab
physical offset, which will change with mkfs.btrfs.

[FIX]
Use more flex helper, to get both devid and physical for such
corruption.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 tests/btrfs/140     | 36 ++++++++++++++++++++++++++++--------
 tests/btrfs/140.out |  2 --
 tests/btrfs/141     | 33 ++++++++++++++++++++++++++-------
 tests/btrfs/141.out |  2 --
 4 files changed, 54 insertions(+), 19 deletions(-)

Comments

Filipe Manana Dec. 17, 2019, 5:43 p.m. UTC | #1
On Thu, Dec 12, 2019 at 8:31 AM Qu Wenruo <wqu@suse.com> wrote:
>
> [BUG]
> With btrfs-progs v5.4, btrfs/140 and btrfs/141 will fail.

Oddly, it doesn't fail for me. Only 142, 143, 157 and 158.

However this seems correct.

>
> [CAUSE]
> Both tests are testing re-silvering of RAID1, thus they need to corrupt
> on-disk data.
>
> This requires to do manual logical -> physical bytes mapping in the test
> case.
> However the test case itself uses too many hard coded helper to grab
> physical offset, which will change with mkfs.btrfs.
>
> [FIX]
> Use more flex helper, to get both devid and physical for such

more flex -> more flexible

> corruption.
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>  tests/btrfs/140     | 36 ++++++++++++++++++++++++++++--------
>  tests/btrfs/140.out |  2 --
>  tests/btrfs/141     | 33 ++++++++++++++++++++++++++-------
>  tests/btrfs/141.out |  2 --
>  4 files changed, 54 insertions(+), 19 deletions(-)
>
> diff --git a/tests/btrfs/140 b/tests/btrfs/140
> index 1c5aa679..5c6de733 100755
> --- a/tests/btrfs/140
> +++ b/tests/btrfs/140
> @@ -46,10 +46,26 @@ _require_odirect
>
>  get_physical()
>  {
> -       # $1 is logical address
> -       # print chunk tree and find devid 2 which is $SCRATCH_DEV
> -       $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
> -       grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
> +       local logical=$1
> +       local stripe=$2
> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
> +               grep $logical -A 6 | \
> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
> +}

Same as before, $AWK_PROG.

These helpers seems the same as in 142 and 143 (and 141, updated later
in this patch).
I know this patch isn't introducing them, but we should move them into
helpers at common/btrfs one day.

Thanks.

> +
> +get_devid()
> +{
> +       local logical=$1
> +       local stripe=$2
> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
> +               grep $logical -A 6 | \
> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
> +}
> +
> +get_device_path()
> +{
> +       local devid=$1
> +       echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
>  }
>
>  _scratch_dev_pool_get 2
> @@ -72,11 +88,15 @@ echo "step 2......corrupt file extent" >>$seqres.full
>
>  ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
>  logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
> -physical_on_scratch=`get_physical ${logical_in_btrfs}`
> +physical=$(get_physical ${logical_in_btrfs} 1)
> +devid=$(get_devid ${logical_in_btrfs} 1)
> +devpath=$(get_device_path ${devid})
>
>  _scratch_unmount
> -$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
> -       _filter_xfs_io_offset
> +
> +echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
> +       >> $seqres.full
> +$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
>
>  _scratch_mount
>
> @@ -96,7 +116,7 @@ done
>  _scratch_unmount
>
>  # check if the repair works
> -$XFS_IO_PROG -d -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
> +$XFS_IO_PROG -d -c "pread -v -b 512 $physical 512" $devpath |\
>         _filter_xfs_io_offset
>
>  _scratch_dev_pool_put
> diff --git a/tests/btrfs/140.out b/tests/btrfs/140.out
> index f3fdf174..fb5aa108 100644
> --- a/tests/btrfs/140.out
> +++ b/tests/btrfs/140.out
> @@ -1,8 +1,6 @@
>  QA output created by 140
>  wrote 131072/131072 bytes
>  XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -wrote 65536/65536 bytes
> -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> diff --git a/tests/btrfs/141 b/tests/btrfs/141
> index 186d18c8..2f5ad1a2 100755
> --- a/tests/btrfs/141
> +++ b/tests/btrfs/141
> @@ -46,10 +46,26 @@ _require_command "$FILEFRAG_PROG" filefrag
>
>  get_physical()
>  {
> -        # $1 is logical address
> -        # print chunk tree and find devid 2 which is $SCRATCH_DEV
> +       local logical=$1
> +       local stripe=$2
>          $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
> -       grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
> +               grep $logical -A 6 | \
> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
> +}
> +
> +get_devid()
> +{
> +       local logical=$1
> +       local stripe=$2
> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
> +               grep $logical -A 6 | \
> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
> +}
> +
> +get_device_path()
> +{
> +       local devid=$1
> +       echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
>  }
>
>  _scratch_dev_pool_get 2
> @@ -72,11 +88,14 @@ echo "step 2......corrupt file extent" >>$seqres.full
>
>  ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
>  logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
> -physical_on_scratch=`get_physical ${logical_in_btrfs}`
> +physical=$(get_physical ${logical_in_btrfs} 1)
> +devid=$(get_devid ${logical_in_btrfs} 1)
> +devpath=$(get_device_path ${devid})
>
>  _scratch_unmount
> -$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
> -       _filter_xfs_io_offset
> +echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
> +       >> $seqres.full
> +$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
>
>  _scratch_mount
>
> @@ -97,7 +116,7 @@ done
>  _scratch_unmount
>
>  # check if the repair works
> -$XFS_IO_PROG -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
> +$XFS_IO_PROG -c "pread -v -b 512 $physical 512" $devpath |\
>         _filter_xfs_io_offset
>
>  _scratch_dev_pool_put
> diff --git a/tests/btrfs/141.out b/tests/btrfs/141.out
> index 116f98a2..4b8be189 100644
> --- a/tests/btrfs/141.out
> +++ b/tests/btrfs/141.out
> @@ -1,8 +1,6 @@
>  QA output created by 141
>  wrote 131072/131072 bytes
>  XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
> -wrote 65536/65536 bytes
> -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
> --
> 2.23.0
>
Qu Wenruo Dec. 18, 2019, 12:20 a.m. UTC | #2
On 2019/12/18 上午1:43, Filipe Manana wrote:
> On Thu, Dec 12, 2019 at 8:31 AM Qu Wenruo <wqu@suse.com> wrote:
>>
>> [BUG]
>> With btrfs-progs v5.4, btrfs/140 and btrfs/141 will fail.
> 
> Oddly, it doesn't fail for me. Only 142, 143, 157 and 158.
> 
> However this seems correct.
> 
>>
>> [CAUSE]
>> Both tests are testing re-silvering of RAID1, thus they need to corrupt
>> on-disk data.
>>
>> This requires to do manual logical -> physical bytes mapping in the test
>> case.
>> However the test case itself uses too many hard coded helper to grab
>> physical offset, which will change with mkfs.btrfs.
>>
>> [FIX]
>> Use more flex helper, to get both devid and physical for such
> 
> more flex -> more flexible
> 
>> corruption.
>>
>> Signed-off-by: Qu Wenruo <wqu@suse.com>
>> ---
>>  tests/btrfs/140     | 36 ++++++++++++++++++++++++++++--------
>>  tests/btrfs/140.out |  2 --
>>  tests/btrfs/141     | 33 ++++++++++++++++++++++++++-------
>>  tests/btrfs/141.out |  2 --
>>  4 files changed, 54 insertions(+), 19 deletions(-)
>>
>> diff --git a/tests/btrfs/140 b/tests/btrfs/140
>> index 1c5aa679..5c6de733 100755
>> --- a/tests/btrfs/140
>> +++ b/tests/btrfs/140
>> @@ -46,10 +46,26 @@ _require_odirect
>>
>>  get_physical()
>>  {
>> -       # $1 is logical address
>> -       # print chunk tree and find devid 2 which is $SCRATCH_DEV
>> -       $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
>> -       grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
>> +       local logical=$1
>> +       local stripe=$2
>> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
>> +               grep $logical -A 6 | \
>> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
>> +}
> 
> Same as before, $AWK_PROG.
> 
> These helpers seems the same as in 142 and 143 (and 141, updated later
> in this patch).
> I know this patch isn't introducing them, but we should move them into
> helpers at common/btrfs one day.

This is also recommended by Nikolay.

However there is a problem, mostly on the `grep` line.
- The target
  Some caller uses logical address like this, but some uses chunk type.
  This difference also affects the "-A" option, as logical matches the
chunk key, while
  the type matches the chunk type, causing a small difference in "-A"
number.

- The "-A" number for different chunk type
  The "-A" number depends mostly on the number of stripes.
  It needs to cover all stripes, while doesn't catch the stripes of the
next chunk.

  Currently we all use immediate number, as that number matches current
dump-tree
  output, but there is no guarantee for it at all as that dump-tree
output can also change.

  The best pattern should be something to only grab the first continuous
hunk of stripes.

But unfortunately I don't have enough experience in awk/grep, thus have
no choice but use the current immediate way, and not extracting them
into a generic helper.

Any advice would be highly appreciated.

Thanks,
Qu
> 
> Thanks.
> 
>> +
>> +get_devid()
>> +{
>> +       local logical=$1
>> +       local stripe=$2
>> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
>> +               grep $logical -A 6 | \
>> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
>> +}
>> +
>> +get_device_path()
>> +{
>> +       local devid=$1
>> +       echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
>>  }
>>
>>  _scratch_dev_pool_get 2
>> @@ -72,11 +88,15 @@ echo "step 2......corrupt file extent" >>$seqres.full
>>
>>  ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
>>  logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
>> -physical_on_scratch=`get_physical ${logical_in_btrfs}`
>> +physical=$(get_physical ${logical_in_btrfs} 1)
>> +devid=$(get_devid ${logical_in_btrfs} 1)
>> +devpath=$(get_device_path ${devid})
>>
>>  _scratch_unmount
>> -$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
>> -       _filter_xfs_io_offset
>> +
>> +echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
>> +       >> $seqres.full
>> +$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
>>
>>  _scratch_mount
>>
>> @@ -96,7 +116,7 @@ done
>>  _scratch_unmount
>>
>>  # check if the repair works
>> -$XFS_IO_PROG -d -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
>> +$XFS_IO_PROG -d -c "pread -v -b 512 $physical 512" $devpath |\
>>         _filter_xfs_io_offset
>>
>>  _scratch_dev_pool_put
>> diff --git a/tests/btrfs/140.out b/tests/btrfs/140.out
>> index f3fdf174..fb5aa108 100644
>> --- a/tests/btrfs/140.out
>> +++ b/tests/btrfs/140.out
>> @@ -1,8 +1,6 @@
>>  QA output created by 140
>>  wrote 131072/131072 bytes
>>  XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>> -wrote 65536/65536 bytes
>> -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>> diff --git a/tests/btrfs/141 b/tests/btrfs/141
>> index 186d18c8..2f5ad1a2 100755
>> --- a/tests/btrfs/141
>> +++ b/tests/btrfs/141
>> @@ -46,10 +46,26 @@ _require_command "$FILEFRAG_PROG" filefrag
>>
>>  get_physical()
>>  {
>> -        # $1 is logical address
>> -        # print chunk tree and find devid 2 which is $SCRATCH_DEV
>> +       local logical=$1
>> +       local stripe=$2
>>          $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
>> -       grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
>> +               grep $logical -A 6 | \
>> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
>> +}
>> +
>> +get_devid()
>> +{
>> +       local logical=$1
>> +       local stripe=$2
>> +        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
>> +               grep $logical -A 6 | \
>> +               awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
>> +}
>> +
>> +get_device_path()
>> +{
>> +       local devid=$1
>> +       echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
>>  }
>>
>>  _scratch_dev_pool_get 2
>> @@ -72,11 +88,14 @@ echo "step 2......corrupt file extent" >>$seqres.full
>>
>>  ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
>>  logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
>> -physical_on_scratch=`get_physical ${logical_in_btrfs}`
>> +physical=$(get_physical ${logical_in_btrfs} 1)
>> +devid=$(get_devid ${logical_in_btrfs} 1)
>> +devpath=$(get_device_path ${devid})
>>
>>  _scratch_unmount
>> -$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
>> -       _filter_xfs_io_offset
>> +echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
>> +       >> $seqres.full
>> +$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
>>
>>  _scratch_mount
>>
>> @@ -97,7 +116,7 @@ done
>>  _scratch_unmount
>>
>>  # check if the repair works
>> -$XFS_IO_PROG -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
>> +$XFS_IO_PROG -c "pread -v -b 512 $physical 512" $devpath |\
>>         _filter_xfs_io_offset
>>
>>  _scratch_dev_pool_put
>> diff --git a/tests/btrfs/141.out b/tests/btrfs/141.out
>> index 116f98a2..4b8be189 100644
>> --- a/tests/btrfs/141.out
>> +++ b/tests/btrfs/141.out
>> @@ -1,8 +1,6 @@
>>  QA output created by 141
>>  wrote 131072/131072 bytes
>>  XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>> -wrote 65536/65536 bytes
>> -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>>  XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
>> --
>> 2.23.0
>>
> 
>

Patch
diff mbox series

diff --git a/tests/btrfs/140 b/tests/btrfs/140
index 1c5aa679..5c6de733 100755
--- a/tests/btrfs/140
+++ b/tests/btrfs/140
@@ -46,10 +46,26 @@  _require_odirect
 
 get_physical()
 {
-	# $1 is logical address
-	# print chunk tree and find devid 2 which is $SCRATCH_DEV
-	$BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
-	grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
+	local logical=$1
+	local stripe=$2
+        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
+		grep $logical -A 6 | \
+		awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
+}
+
+get_devid()
+{
+	local logical=$1
+	local stripe=$2
+        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
+		grep $logical -A 6 | \
+		awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
+}
+
+get_device_path()
+{
+	local devid=$1
+	echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
 }
 
 _scratch_dev_pool_get 2
@@ -72,11 +88,15 @@  echo "step 2......corrupt file extent" >>$seqres.full
 
 ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
 logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
-physical_on_scratch=`get_physical ${logical_in_btrfs}`
+physical=$(get_physical ${logical_in_btrfs} 1)
+devid=$(get_devid ${logical_in_btrfs} 1)
+devpath=$(get_device_path ${devid})
 
 _scratch_unmount
-$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
-	_filter_xfs_io_offset
+
+echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
+	>> $seqres.full
+$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
 
 _scratch_mount
 
@@ -96,7 +116,7 @@  done
 _scratch_unmount
 
 # check if the repair works
-$XFS_IO_PROG -d -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
+$XFS_IO_PROG -d -c "pread -v -b 512 $physical 512" $devpath |\
 	_filter_xfs_io_offset
 
 _scratch_dev_pool_put
diff --git a/tests/btrfs/140.out b/tests/btrfs/140.out
index f3fdf174..fb5aa108 100644
--- a/tests/btrfs/140.out
+++ b/tests/btrfs/140.out
@@ -1,8 +1,6 @@ 
 QA output created by 140
 wrote 131072/131072 bytes
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 65536/65536 bytes
-XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
diff --git a/tests/btrfs/141 b/tests/btrfs/141
index 186d18c8..2f5ad1a2 100755
--- a/tests/btrfs/141
+++ b/tests/btrfs/141
@@ -46,10 +46,26 @@  _require_command "$FILEFRAG_PROG" filefrag
 
 get_physical()
 {
-        # $1 is logical address
-        # print chunk tree and find devid 2 which is $SCRATCH_DEV
+	local logical=$1
+	local stripe=$2
         $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
-	grep $1 -A 6 | awk '($1 ~ /stripe/ && $3 ~ /devid/ && $4 ~ /1/) { print $6 }'
+		grep $logical -A 6 | \
+		awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$6 }"
+}
+
+get_devid()
+{
+	local logical=$1
+	local stripe=$2
+        $BTRFS_UTIL_PROG inspect-internal dump-tree -t 3 $SCRATCH_DEV | \
+		grep $logical -A 6 | \
+		awk "(\$1 ~ /stripe/ && \$3 ~ /devid/ && \$2 ~ /$stripe/) { print \$4 }"
+}
+
+get_device_path()
+{
+	local devid=$1
+	echo "$SCRATCH_DEV_POOL" | awk "{print \$$devid}"
 }
 
 _scratch_dev_pool_get 2
@@ -72,11 +88,14 @@  echo "step 2......corrupt file extent" >>$seqres.full
 
 ${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar >> $seqres.full
 logical_in_btrfs=`${FILEFRAG_PROG} -v $SCRATCH_MNT/foobar | _filter_filefrag | cut -d '#' -f 1`
-physical_on_scratch=`get_physical ${logical_in_btrfs}`
+physical=$(get_physical ${logical_in_btrfs} 1)
+devid=$(get_devid ${logical_in_btrfs} 1)
+devpath=$(get_device_path ${devid})
 
 _scratch_unmount
-$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical_on_scratch 64K" $SCRATCH_DEV |\
-	_filter_xfs_io_offset
+echo " corrupt stripe #1, devid $devid devpath $devpath physical $physical" \
+	>> $seqres.full
+$XFS_IO_PROG -d -c "pwrite -S 0xbb -b 64K $physical 64K" $devpath > /dev/null
 
 _scratch_mount
 
@@ -97,7 +116,7 @@  done
 _scratch_unmount
 
 # check if the repair works
-$XFS_IO_PROG -c "pread -v -b 512 $physical_on_scratch 512" $SCRATCH_DEV |\
+$XFS_IO_PROG -c "pread -v -b 512 $physical 512" $devpath |\
 	_filter_xfs_io_offset
 
 _scratch_dev_pool_put
diff --git a/tests/btrfs/141.out b/tests/btrfs/141.out
index 116f98a2..4b8be189 100644
--- a/tests/btrfs/141.out
+++ b/tests/btrfs/141.out
@@ -1,8 +1,6 @@ 
 QA output created by 141
 wrote 131072/131072 bytes
 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 65536/65536 bytes
-XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................
 XXXXXXXX:  aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa  ................