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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
|
#!/usr/bin/env bash
# Copyright (C) 2018 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# Test dm-writecache and dm-cache with different block size combinations
SKIP_WITH_LVMPOLLD=1
. lib/inittest
aux have_writecache 1 0 0 || skip
which mkfs.xfs || skip
mnt="mnt"
mkdir -p $mnt
awk 'BEGIN { while (z++ < 16384) printf "A" }' > fileA
awk 'BEGIN { while (z++ < 16384) printf "B" }' > fileB
awk 'BEGIN { while (z++ < 16384) printf "C" }' > fileC
# generate random data
dd if=/dev/urandom of=randA bs=512K count=2
dd if=/dev/urandom of=randB bs=512K count=3
dd if=/dev/urandom of=randC bs=512K count=4
_add_new_data_to_mnt() {
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
# add original data
cp randA $mnt
cp randB $mnt
cp randC $mnt
mkdir $mnt/1
cp fileA $mnt/1
cp fileB $mnt/1
cp fileC $mnt/1
mkdir $mnt/2
cp fileA $mnt/2
cp fileB $mnt/2
cp fileC $mnt/2
sync
}
_add_more_data_to_mnt() {
mkdir $mnt/more
cp fileA $mnt/more
cp fileB $mnt/more
cp fileC $mnt/more
cp randA $mnt/more
cp randB $mnt/more
cp randC $mnt/more
sync
}
_verify_data_on_mnt() {
diff randA $mnt/randA
diff randB $mnt/randB
diff randC $mnt/randC
diff fileA $mnt/1/fileA
diff fileB $mnt/1/fileB
diff fileC $mnt/1/fileC
diff fileA $mnt/2/fileA
diff fileB $mnt/2/fileB
diff fileC $mnt/2/fileC
}
_verify_more_data_on_mnt() {
diff randA $mnt/more/randA
diff randB $mnt/more/randB
diff randC $mnt/more/randC
diff fileA $mnt/more/fileA
diff fileB $mnt/more/fileB
diff fileC $mnt/more/fileC
}
_verify_data_on_lv() {
lvchange -ay $vg/$lv1
mount "$DM_DEV_DIR/$vg/$lv1" $mnt
_verify_data_on_mnt
rm $mnt/randA
rm $mnt/randB
rm $mnt/randC
rm -rf $mnt/1
rm -rf $mnt/2
umount $mnt
lvchange -an $vg/$lv1
}
# Check that the LBS ($1) and PBS ($2) are accurately reported.
_check_env() {
check sysfs "$(< SCSI_DEBUG_DEV)" queue/logical_block_size "$1"
check sysfs "$(< SCSI_DEBUG_DEV)" queue/physical_block_size "$2"
blockdev --getss "$dev1"
blockdev --getpbsz "$dev1"
blockdev --getss "$dev2"
blockdev --getpbsz "$dev2"
}
#
# _run_test $BD1 $BD2 $type $optname "..."
#
# $BD1: device to place the main LV on
# $BD2: device to place the cache on
# $type is cache or writecache to use in lvconvert --type $type
# $optname is either --cachevol or --cachepool to use in lvconvert
# "..." a sector size option to use in mkfs.xfs
#
_run_test() {
vgcreate $SHARED $vg "$1"
vgextend $vg "$2"
lvcreate -n $lv1 -L 300 -an $vg "$1"
lvcreate -n $lv2 -l 4 -an $vg "$2"
lvchange -ay $vg/$lv1
mkfs.xfs -f $5 "$DM_DEV_DIR/$vg/$lv1" |tee out
_add_new_data_to_mnt
lvconvert --yes --type $3 $4 $lv2 $vg/$lv1
# TODO: check expected LBS of LV1
# blockdev --getss "$DM_DEV_DIR/$vg/$lv1" |tee out
# grep "$N" out
# TODO: check expected PBS of LV1
# blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1" |tee out
# grep "$N" out
_add_more_data_to_mnt
_verify_data_on_mnt
lvconvert --splitcache $vg/$lv1
check lv_field $vg/$lv1 segtype linear
blockdev --getss "$DM_DEV_DIR/$vg/$lv1"
blockdev --getpbsz "$DM_DEV_DIR/$vg/$lv1"
_verify_data_on_mnt
_verify_more_data_on_mnt
umount $mnt
lvchange -an $vg/$lv1
lvchange -an $vg/$lv2
_verify_data_on_lv
lvremove $vg/$lv1
lvremove $vg/$lv2
vgremove $vg
}
# Setup: dev1 LBS 512, PBS 4096 (using scsi-debug)
# dev2 LBS 512, PBS 4096 (using scsi-debug)
# dev3 LBS 512, PBS 512 (using loop)
# dev4 LBS 512, PBS 512 (using loop)
#
# On scsi debug 2 PVs has to fit!
aux prepare_scsi_debug_dev 602 sector_size=512 physblk_exp=3 || skip
aux prepare_devs 2 301
# Tests with fs block sizes require a libblkid version that shows BLOCK_SIZE
vgcreate $vg "$dev1"
lvcreate -n $lv1 -L300 $vg
mkfs.xfs -f "$DM_DEV_DIR/$vg/$lv1"
blkid -p "$DM_DEV_DIR/$vg/$lv1" | grep BLOCK_SIZE || skip
lvchange -an $vg
vgremove -ff $vg
# loopa/loopb have LBS 512 PBS 512
which fallocate || skip
fallocate -l 301M loopa
fallocate -l 301M loopb
for i in {1..5}; do
LOOP1=$(losetup -f loopa --show || true)
test -n "$LOOP1" && break
done
for i in {1..5} ; do
LOOP2=$(losetup -f loopb --show || true)
test -n "$LOOP2" && break
done
# prepare devX mapping so it works for real & fake dev dir
d=3
for i in "$LOOP1" "$LOOP2"; do
echo "$i"
m=${i##*loop}
test -e "$DM_DEV_DIR/loop$m" || mknod "$DM_DEV_DIR/loop$m" b 7 "$m"
eval "dev$d=\"$DM_DEV_DIR/loop$m\""
d=$(( d + 1 ))
done
# verify dev1/dev2 have LBS 512 PBS 4096
_check_env "512" "4096"
# verify dev3/dev4 have LBS 512 PBS 512
blockdev --getss "$LOOP1" | grep 512
blockdev --getss "$LOOP2" | grep 512
blockdev --getpbsz "$LOOP1" | grep 512
blockdev --getpbsz "$LOOP2" | grep 512
aux extend_filter "a|$dev3|" "a|$dev4|"
aux extend_devices "$dev3" "$dev4"
# place main LV on dev1 with LBS 512, PBS 4096
# and the cache on dev3 with LBS 512, PBS 512
_run_test "$dev1" "$dev3" "writecache" "--cachevol" ""
_run_test "$dev1" "$dev3" "cache" "--cachevol" ""
_run_test "$dev1" "$dev3" "cache" "--cachepool" ""
# place main LV on dev3 with LBS 512, PBS 512
# and the cache on dev1 with LBS 512, PBS 4096
_run_test "$dev3" "$dev1" "writecache" "--cachevol" ""
_run_test "$dev3" "$dev1" "cache" "--cachevol" ""
_run_test "$dev3" "$dev1" "cache" "--cachepool" ""
# place main LV on dev1 with LBS 512, PBS 4096
# and the cache on dev3 with LBS 512, PBS 512
# and force xfs sectsz 512
_run_test "$dev1" "$dev3" "writecache" "--cachevol" "-s size=512"
_run_test "$dev1" "$dev3" "cache" "--cachevol" "-s size=512"
_run_test "$dev1" "$dev3" "cache" "--cachepool" "-s size=512"
# place main LV on dev3 with LBS 512, PBS 512
# and the cache on dev1 with LBS 512, PBS 4096
# and force xfs sectsz 4096
_run_test "$dev3" "$dev1" "writecache" "--cachevol" "-s size=4096"
_run_test "$dev3" "$dev1" "cache" "--cachevol" "-s size=4096"
_run_test "$dev3" "$dev1" "cache" "--cachepool" "-s size=4096"
losetup -d "$LOOP1" || true
losetup -d "$LOOP2" || true
rm loopa loopb
aux cleanup_scsi_debug_dev
|