summaryrefslogtreecommitdiff
path: root/tests/btrfs/125
blob: 5d76018c086411b64b183b25c2ec29a95db7c08f (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
143
144
145
146
147
148
149
150
151
152
153
154
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016 Oracle.  All Rights Reserved.
#
# FS QA Test 125
#
# This test verify if the reconstructed data on the RAID5 is good.
# Steps:
# Initialize RAID5 with some data
#
# Re-mount RAID5 degraded with dev3 missing and write data
# Save md5sum checkpoint1
#
# Re-mount healthy RAID5
#
# Let balance fix the RAID5.
# Save md5sum checkpoint2
#
# Re-mount RAID5 degraded with dev1 as missing.
# Save md5sum checkpoint3
#
# Verify if all three checkpoints match
#
. ./common/preamble
_begin_fstest replace volume balance auto quick

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

. ./common/filter

_supported_fs btrfs
_require_scratch_dev_pool 3
_test_unmount
_require_btrfs_forget_or_module_loadable
_require_btrfs_raid_type raid5

_scratch_dev_pool_get 3

dev1=${SCRATCH_DEV_NAME[0]}
dev2=${SCRATCH_DEV_NAME[1]}
dev3=${SCRATCH_DEV_NAME[2]}

echo dev1=$dev1 >> $seqres.full
echo dev2=$dev2 >> $seqres.full
echo dev3=$dev3 >> $seqres.full

# Balance won't be successful if filled too much
dev1_sz=`blockdev --getsize64 $dev1`
dev2_sz=`blockdev --getsize64 $dev2`
dev3_sz=`blockdev --getsize64 $dev3`

# get min of both.
max_fs_sz=`echo -e "$dev1_sz\n$dev2_sz\n$dev3_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=100000000
bs="1M"
count=$(($max_fs_sz / 1000000))

#-------------normal init-------------------
echo >> $seqres.full
echo "max_fs_sz=$max_fs_sz count=$count" >> $seqres.full
echo "-----Initialize -----" >> $seqres.full
_scratch_pool_mkfs "-mraid5 -draid5" >> $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
dd if=/dev/zero of="$SCRATCH_MNT"/tf1 bs=$bs count=1 \
					>>$seqres.full 2>&1
_btrfs filesystem show
_btrfs filesystem df $SCRATCH_MNT

#-------------degraded-init-------------------
echo >> $seqres.full
echo "-----Write degraded mount fill upto $max_fs_sz bytes-----" >> $seqres.full
echo
echo "Write data with degraded mount"

echo "unmount" >> $seqres.full
_scratch_unmount
echo "clean btrfs ko" >> $seqres.full
# un-scan the btrfs devices
_btrfs_forget_or_module_reload
_mount -o degraded,device=$dev2 $dev1 $SCRATCH_MNT >>$seqres.full 2>&1
dd if=/dev/zero of="$SCRATCH_MNT"/tf2 bs=$bs count=$count \
					>>$seqres.full 2>&1
_btrfs filesystem show
_btrfs filesystem df $SCRATCH_MNT
checkpoint1=`md5sum $SCRATCH_MNT/tf2`
echo $checkpoint1 >> $seqres.full 2>&1

#-------------balance-------------------
echo >> $seqres.full
echo "-----Mount normal-----" >> $seqres.full
echo
echo "Mount normal and balance"

_scratch_unmount
_btrfs device scan
_scratch_mount >> $seqres.full 2>&1

echo >> $seqres.full
_run_btrfs_balance_start $SCRATCH_MNT >> $seqres.full

_btrfs filesystem show
_btrfs filesystem df ${SCRATCH_MNT}

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

#-------------degraded-mount-------------------
echo >> $seqres.full
echo "-----Mount degraded with dev1 missing-----" >> $seqres.full
echo
echo "Mount degraded but with other dev"

_scratch_unmount
# un-scan the btrfs devices
_btrfs_forget_or_module_reload

_mount -o degraded,device=${dev2} $dev3 $SCRATCH_MNT >>$seqres.full 2>&1

_btrfs filesystem show
_btrfs filesystem df $SCRATCH_MNT
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