summaryrefslogtreecommitdiff
path: root/tests/xfs/243
blob: 2e537f3f5578f2932e5b3e90e95e5d8ead36e7ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016, Oracle and/or its affiliates.  All Rights Reserved.
#
# FS QA Test No. 243
#
# Ensuring that copy on write in buffered mode works when the CoW
# range originally covers multiple extents, some unwritten, some not.
#   - Set cowextsize hint.
#   - Create a file with the following repeating sequence of blocks:
#     1. reflinked
#     2. unwritten
#     3. hole
#     4. regular block
#     5. delalloc
#   - CoW across the halfway mark, starting with the unwritten extent.
#   - Check that the files are now different where we say they're different.
#
. ./common/preamble
_begin_fstest auto quick clone punch prealloc

# Import common functions.
. ./common/filter
. ./common/reflink

# real QA test starts here
_supported_fs xfs
_require_xfs_debug
_require_scratch_reflink
_require_scratch_delalloc
_require_xfs_io_command "falloc"
_require_xfs_io_command "cowextsize"
_require_xfs_io_command "fpunch"
_require_xfs_io_command "bmap" "-c"
_require_cp_reflink

echo "Format and mount"
_scratch_mkfs > $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1

testdir=$SCRATCH_MNT/test-$seq
mkdir $testdir

echo "Create the original files"
blksz=65536
nr=64
filesize=$((blksz * nr))

$XFS_IO_PROG -c "cowextsize $((blksz * 16))" $testdir >> $seqres.full
_pwrite_byte 0x61 0 $filesize $testdir/file1 >> $seqres.full
$XFS_IO_PROG -f -c "truncate $filesize" $testdir/file3 >> $seqres.full
# 0 blocks are reflinked
seq 0 5 $nr | while read f; do
	_reflink_range $testdir/file1 $((blksz * f)) $testdir/file3 $((blksz * f)) $blksz >> $seqres.full
	_pwrite_byte 0x61 $((blksz * f)) $blksz $testdir/file3.chk >> $seqres.full
done
# 1 blocks are unwritten
seq 1 5 $nr | while read f; do
	$XFS_IO_PROG -f -c "falloc $((blksz * f)) $blksz" $testdir/file3 >> $seqres.full
	_pwrite_byte 0x00 $((blksz * f)) $blksz $testdir/file3.chk >> $seqres.full
done
# 2 blocks are holes
seq 2 5 $nr | while read f; do
	_pwrite_byte 0x00 $((blksz * f)) $blksz $testdir/file3.chk >> $seqres.full
done
# 3 blocks are regular
seq 3 5 $nr | while read f; do
	_pwrite_byte 0x71 $((blksz * f)) $blksz $testdir/file3 >> $seqres.full
	_pwrite_byte 0x71 $((blksz * f)) $blksz $testdir/file3.chk >> $seqres.full
done
sync
# 4 blocks are delalloc (do later)
seq 4 5 $nr | while read f; do
	_pwrite_byte 0x62 $((blksz * f)) $blksz $testdir/file3 >> $seqres.full
	_pwrite_byte 0x62 $((blksz * f)) $blksz $testdir/file3.chk >> $seqres.full
done

# 10 blocks are cow'd
seq 0 10 $((nr/2)) | while read f; do
	_pwrite_byte 0x61 $((blksz * f)) 1 $testdir/file3 >> $seqres.full
	_pwrite_byte 0x61 $((blksz * f)) 1 $testdir/file3.chk >> $seqres.full
done

echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file3 | _filter_scratch
md5sum $testdir/file3.chk | _filter_scratch

echo "Dump extents"
$XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
echo "Delayed allocation CoW extents:"
test $(_xfs_bmapx_find cow $testdir/file3 delalloc) -gt 0 || \
	echo "Expected to find a delalloc CoW extent"
echo "Shared data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '10[01]{4}$') -gt 0 || \
	echo "Expected to find a shared data extent"
echo "Unwritten data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '1[01]{4}$') -gt 0 || \
	echo "Expected to find an unwritten data extent"
echo "Hole data extents:"
test $(_xfs_bmapx_find data $testdir/file3 hole) -gt 0 || \
	echo "Expected to find a hole data extent"
echo "Regular data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '00[01]{4}$') -gt 0 || \
	echo "Expected to find a regular data extent"

sync

echo "Dump extents after sync"
$XFS_IO_PROG -c "cowextsize" $testdir/file3 | _filter_scratch
echo "Delayed allocation CoW extents:"
test $(_xfs_bmapx_find cow $testdir/file3 -v hole ) -gt 0 || \
	echo "Expected to find a regular CoW extent"
echo "Real CoW extents:"
test $(_xfs_bmapx_find cow $testdir/file3 delalloc ) -eq 0 || \
	echo "Expected to find zero delalloc CoW extent"
echo "Shared data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '10[01]{4}$') -gt 0 || \
	echo "Expected to find a shared data extent"
echo "Unwritten data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '1[01]{4}$') -gt 0 || \
	echo "Expected to find an unwritten data extent"
echo "Hole data extents:"
test $(_xfs_bmapx_find data $testdir/file3 hole) -gt 0 || \
	echo "Expected to find a hole data extent"
echo "Regular data extents:"
test $(_xfs_bmapx_find data $testdir/file3 -E '00[01]{4}$') -gt 0 || \
	echo "Expected to find a regular data extent"

_scratch_cycle_mount

echo "Compare files"
md5sum $testdir/file1 | _filter_scratch
md5sum $testdir/file3 | _filter_scratch
md5sum $testdir/file3.chk | _filter_scratch

# success, all done
status=0
exit