summaryrefslogtreecommitdiff
path: root/tests/xfs/078
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