blob: 321bbee9909915237f772f10ea0f61012c63b601 (
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2017 Oracle. All Rights Reserved.
#
# FS QA Test 154
#
# Test for reappearing missing device functionality.
# This test will fail without the btrfs kernel patch
# [PATCH] btrfs: handle dynamically reappearing missing device
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"
here=`pwd`
tmp=/tmp/$$
status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
_cleanup()
{
cd /
rm -f $tmp.*
}
# get standard environment, filters and checks
. ./common/rc
. ./common/filter
. ./common/module
# remove previous $seqres.full before test
rm -f $seqres.full
# real QA test starts here
_supported_fs btrfs
_supported_os Linux
_require_scratch_dev_pool 2
_require_btrfs_forget_or_module_loadable
_scratch_dev_pool_get 2
DEV1=`echo $SCRATCH_DEV_POOL | awk '{print $1}'`
DEV2=`echo $SCRATCH_DEV_POOL | awk '{print $2}'`
echo DEV1=$DEV1 >> $seqres.full
echo DEV2=$DEV2 >> $seqres.full
# Balance won't be successful if filled too much
DEV1_SZ=`blockdev --getsize64 $DEV1`
DEV2_SZ=`blockdev --getsize64 $DEV2`
# get min
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
_notrun "Smallest dev size $MAX_FS_SZ, Need at least 2G"
fi
MAX_FS_SZ=100000000
bs="1M"
COUNT=$(($MAX_FS_SZ / 1000000))
CHECKPOINT1=0
CHECKPOINT2=0
setup()
{
echo >> $seqres.full
echo "MAX_FS_SZ=$MAX_FS_SZ COUNT=$COUNT" >> $seqres.full
echo "setup"
echo "-----setup-----" >> $seqres.full
_scratch_pool_mkfs "-mraid1 -draid1" >> $seqres.full 2>&1
_scratch_mount >> $seqres.full 2>&1
dd if=/dev/urandom of="$SCRATCH_MNT"/tf bs=$bs count=1 \
>>$seqres.full 2>&1
_run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT}
_run_btrfs_util_prog filesystem df $SCRATCH_MNT
COUNT=$(( $COUNT - 1 ))
echo "unmount" >> $seqres.full
_scratch_unmount
}
degrade_mount_write()
{
echo >> $seqres.full
echo "--degraded mount: max_fs_sz $max_fs_sz bytes--" >> $seqres.full
echo
echo "degraded mount"
echo "clean btrfs ko" >> $seqres.full
# un-scan the btrfs devices
_btrfs_forget_or_module_reload
_mount -o degraded $DEV1 $SCRATCH_MNT >>$seqres.full 2>&1
cnt=$(( $COUNT/10 ))
dd if=/dev/urandom of="$SCRATCH_MNT"/tf1 bs=$bs count=$cnt \
>>$seqres.full 2>&1
COUNT=$(( $COUNT - $cnt ))
_run_btrfs_util_prog filesystem show -m $SCRATCH_MNT
_run_btrfs_util_prog filesystem df $SCRATCH_MNT
CHECKPOINT1=`md5sum $SCRATCH_MNT/tf1`
echo $SCRATCH_MNT/tf1:$CHECKPOINT1 >> $seqres.full
}
scan_missing_dev_and_write()
{
echo >> $seqres.full
echo "--scan missing $DEV2--" >> $seqres.full
echo
echo "scan missing dev and write"
_run_btrfs_util_prog device scan $DEV2
echo >> $seqres.full
_run_btrfs_util_prog filesystem show -m ${SCRATCH_MNT}
_run_btrfs_util_prog filesystem df ${SCRATCH_MNT}
dd if=/dev/urandom of="$SCRATCH_MNT"/tf2 bs=$bs count=$COUNT \
>>$seqres.full 2>&1
CHECKPOINT2=`md5sum $SCRATCH_MNT/tf2`
echo $SCRATCH_MNT/tf2:$CHECKPOINT2 >> $seqres.full
}
balance_convert()
{
echo >> $seqres.full
echo "----- run balance -----" >> $seqres.full
echo
echo "run balance"
_run_btrfs_balance_start -dconvert=raid1 \
-mconvert=raid1 $SCRATCH_MNT >> $seqres.full
}
verify()
{
echo >> $seqres.full
echo "--mount reconstructed dev only and check md5sum--" >> $seqres.full
echo
echo "mount reconstructed dev only and check md5sum"
echo "unmount" >> $seqres.full
_scratch_unmount
_btrfs_forget_or_module_reload
_mount -o degraded $DEV2 $SCRATCH_MNT >>$seqres.full 2>&1
verify_checkpoint1=`md5sum $SCRATCH_MNT/tf1`
verify_checkpoint2=`md5sum $SCRATCH_MNT/tf2`
if [ "$verify_checkpoint1" != "$CHECKPOINT1" ]; then
echo "checkpoint1 on reappeared disk does not match after balance"
fi
if [ "$verify_checkpoint2" != "$CHECKPOINT2" ]; then
echo "checkpoint2 on reappeared disk does not match after balance"
fi
}
setup
degrade_mount_write
scan_missing_dev_and_write
balance_convert
verify
$UMOUNT_PROG $DEV2
_scratch_dev_pool_put
status=0
exit
|