blob: 501551e5e144a578b1ffb000eb33c2c16ad563a8 (
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
|
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2000-2003,2006 Silicon Graphics, Inc. All Rights Reserved.
#
# FS QA Test No. 078
#
# Check several growfs corner cases
#
. ./common/preamble
_begin_fstest growfs auto quick
_register_cleanup "_cleanup; rm -f $tmp.*"
# Override the default cleanup function.
_cleanup()
{
cd /
rm -f $tmp.*
$UMOUNT_PROG $LOOP_MNT 2>/dev/null
[ -n "$LOOP_DEV" ] && _destroy_loop_device $LOOP_DEV 2>/dev/null
# try to keep the image file if test fails
[ $status -eq 0 ] && rm -f $LOOP_IMG
rmdir $LOOP_MNT
}
# Import common functions.
. ./common/filter
# loop devices are available in Linux only
_supported_fs xfs
_require_test
# Must have loop device
_require_loop
_require_xfs_io_command "truncate"
LOOP_IMG=$TEST_DIR/$seq.fs
LOOP_MNT=$TEST_DIR/$seq.mnt
_filter_io()
{
sed -e '/.* ops; /d'
}
# real QA test starts here
echo "*** create loop mount point"
rmdir $LOOP_MNT 2>/dev/null
mkdir -p $LOOP_MNT || _fail "cannot create loopback mount point"
_grow_loop()
{
original=$1
new_size=$2
bsize=$3
check=$4
agsize=$5
$XFS_IO_PROG -f -c "truncate $original" $LOOP_IMG
LOOP_DEV=`_create_loop_device $LOOP_IMG`
dparam=""
if [ -n "$agsize" ]; then
dparam="-d agsize=$agsize"
fi
echo
echo "=== GROWFS (from $original to $new_size, $bsize blocksize)"
echo
echo "*** mkfs loop file (size=$original)"
$MKFS_XFS_PROG -b size=$bsize $dparam $LOOP_DEV | \
_filter_mkfs 2>/dev/null
echo "*** extend loop file"
_destroy_loop_device $LOOP_DEV
$XFS_IO_PROG -c "pwrite $new_size $bsize" $LOOP_IMG | _filter_io
LOOP_DEV=`_create_loop_device $LOOP_IMG`
echo "*** mount loop filesystem"
$MOUNT_PROG -t xfs $LOOP_DEV $LOOP_MNT
echo "*** grow loop filesystem"
$XFS_GROWFS_PROG $LOOP_MNT 2>&1 | _filter_growfs 2>&1
echo "*** unmount"
$UMOUNT_PROG -d $LOOP_MNT && LOOP_DEV=
# Large grows takes forever to check..
if [ "$check" -gt "0" ]
then
echo "*** check"
_check_xfs_filesystem $LOOP_IMG none none
fi
rm -f $LOOP_IMG
}
# Wes' problem sizes...
_grow_loop $((168024*4096)) 1376452608 4096 1
# Some other blocksize cases...
_grow_loop $((168024*2048)) 1376452608 2048 1
_grow_loop $((168024*1024)) 688230400 1024 1
# Other corner cases suggested by dgc
# also the following doesn't check if the filesystem is consistent.
# - grow 1TB by 1.5TB (control)
_grow_loop 1t 2500g 4096 0
# - grow 1TB by 2.5TB (grow by > 2TB)
_grow_loop 1t 3500g 4096 0
# - grow 1TB by 3.5TB (grow past 4TB)
_grow_loop 1t 4500g 4096 0
# - grow 1TB by 4.5TB (grow by > 4TB)
_grow_loop 1t 5500g 4096 0
# - grow 1TB by 7.5TB (grow past 8TB)
_grow_loop 1t 8500g 4096 0
# - grow 1TB by 8.5TB (grow by > 8TB)
_grow_loop 1t 9500g 4096 0
# - grow 1TB by 14.5TB (grow by > 8TB)
_grow_loop 1t 15500g 4096 0
# - grow 1TB by 15TB (grow to 16TB)
_grow_loop 1t 16000g 4096 0
# It would be nice to go on, but this would require a totally new test in order
# to take care of 64-bit machines.
echo "*** all done"
status=0
exit
|