summaryrefslogtreecommitdiff
path: root/tests/btrfs/124
blob: ba001ff8ad7df093f3d7f85ad8b3f65c3d8ff8ab (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
140
141
142
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016 Oracle.  All Rights Reserved.
#
# FS QA Test 124
#
# This test verify the RAID1 reconstruction on the reappeared
# device. By using the following steps:
# Initialize a RAID1 with some data
#
# Re-mount RAID1 degraded with dev2 missing and write up to
# half of the FS capacity.
# Save md5sum checkpoint1
#
# Re-mount healthy RAID1
#
# Let balance re-silver.
# Save md5sum checkpoint2
#
# Re-mount RAID1 degraded with dev1 missing
# Save md5sum checkpoint3
#
# Verify if all three checkpoints match
#
. ./common/preamble
_begin_fstest auto replace volume balance

# Override the default cleanup function.
_cleanup()
{
	cd /
	rm -f $tmp.*
	_btrfs_rescan_devices
}

. ./common/filter

_supported_fs btrfs
_require_scratch_dev_pool 2
_test_unmount
_require_btrfs_forget_or_module_loadable

_scratch_dev_pool_get 2

dev1=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $1}'`
dev2=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}'`

# RAID1 is not supported on zoned btrfs
_require_non_zoned_device "$dev1"
_require_non_zoned_device "$dev2"

dev1_sz=`blockdev --getsize64 $dev1`
dev2_sz=`blockdev --getsize64 $dev2`
# get min of both
max_fs_sz=`echo -e "$dev1_sz\n$dev2_sz" | sort -n | head -1`
# Need disks with more than 2G.
if [ $max_fs_sz -lt 2000000000 ]; then
	_scratch_dev_pool_put
	_test_mount
	_notrun "Smallest dev size $max_fs_sz, Need at least 2G"
fi
max_fs_sz=1200000000
bs="1M"
count=$(($max_fs_sz / 1000000))

echo >> $seqres.full
echo "max_fs_sz=$max_fs_sz count=$count" >> $seqres.full
echo "-----Initialize -----" >> $seqres.full
_scratch_pool_mkfs "-mraid1 -draid1" >> $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
_btrfs filesystem show
dd if=/dev/zero of="$SCRATCH_MNT"/tf1 bs=$bs count=1 \
					>>$seqres.full 2>&1
echo "unmount" >> $seqres.full
echo "clean btrfs ko" >> $seqres.full
_scratch_unmount

# un-scan the btrfs devices
_btrfs_forget_or_module_reload

echo >> $seqres.full
echo "-----Write degraded mount fill upto $max_fs_sz bytes-----" >> $seqres.full
echo
echo "Write data with degraded mount"
# Since we didn't run dev scan, btrfs kernel does not know
# about the dev2
# don't use _scratch_mount as we want to control
# the device used for mounting.

_mount -o degraded $dev1 $SCRATCH_MNT >>$seqres.full 2>&1
_btrfs filesystem show
dd if=/dev/zero of="$SCRATCH_MNT"/tf2 bs=$bs count=$count \
					>>$seqres.full 2>&1
checkpoint1=`md5sum $SCRATCH_MNT/tf2`
echo $checkpoint1 >> $seqres.full 2>&1
_scratch_unmount
echo "unmount" >> $seqres.full

echo >> $seqres.full
echo "-----Mount normal-----" >> $seqres.full
echo
echo "Mount normal and balance"
_btrfs device scan
_scratch_mount >> $seqres.full 2>&1
_btrfs filesystem show
echo >> $seqres.full
_run_btrfs_balance_start ${SCRATCH_MNT} >>$seqres.full

checkpoint2=`md5sum $SCRATCH_MNT/tf2`
echo $checkpoint2 >> $seqres.full 2>&1

echo >> $seqres.full
echo "-----Mount degraded with the other dev -----" >> $seqres.full
echo
echo "Mount degraded with the other dev"
_scratch_unmount
# un-scan the btrfs devices
_btrfs_forget_or_module_reload
_mount -o degraded $dev2 $SCRATCH_MNT >>$seqres.full 2>&1
_btrfs filesystem show
checkpoint3=`md5sum $SCRATCH_MNT/tf2`
echo $checkpoint3 >> $seqres.full 2>&1

if [ "$checkpoint1" != "$checkpoint2" ]; then
	echo $checkpoint1
	echo $checkpoint2
	echo "Inital sum does not match with after balance"
fi

if [ "$checkpoint1" != "$checkpoint3" ]; then
	echo $checkpoint1
	echo $checkpoint3
	echo "Inital sum does not match with data on dev2 written by balance"
fi

$UMOUNT_PROG $dev2
_scratch_dev_pool_put
_btrfs_rescan_devices
_test_mount

status=0
exit