summaryrefslogtreecommitdiff
path: root/test/shell/lvresize-xfs.sh
blob: 7f3193941fd58e88cd8f3a5c0611735147c200de (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
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#!/usr/bin/env bash

# Copyright (C) 2023 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


SKIP_WITH_LVMPOLLD=1

. lib/inittest

aux prepare_vg 1 500

which mkfs.xfs || skip
which xfs_growfs || skip

mount_dir="mnt_lvresize_fs"
mkdir -p "$mount_dir"

mount_dir_space="other mnt dir"
mkdir -p "$mount_dir_space"


# Test combinations of the following:
# lvreduce / lvextend
# xfs
# each --fs opt / no --fs opt / --resizefs
# active / inactive
# mounted / unmounted
# fs size less than, equal to or greater than reduced lv size

#################
#
# lvextend, xfs
#
#################

# lvextend, xfs, active, mounted, no --fs setting is same as --fs ignore
lvcreate -n $lv -L 300M $vg
mkfs.xfs "$DM_DEV_DIR/$vg/$lv"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"

# --fs tests require a libblkid version that shows FSLASTBLOCK
# so exit 0 test here, if the feature is not present
blkid -p "$DM_DEV_DIR/$vg/$lv" | grep FSLASTBLOCK || skip

df --output=size "$mount_dir" |tee df1
dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct
lvextend -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "320.00m"
# with no --fs used, the fs size should be the same
df --output=size "$mount_dir" |tee df2
diff df1 df2
xfs_growfs "$DM_DEV_DIR/$vg/$lv"
df --output=size "$mount_dir" |tee df3
not diff df2 df3
dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=20 oflag=direct
# keep it mounted

# lvextend, xfs, active, mounted, --fs ignore
df --output=size "$mount_dir" |tee df1
lvextend --fs ignore -L+20 $vg/$lv
check lv_field $vg/$lv lv_size "340.00m"
df --output=size "$mount_dir" |tee df2
diff df1 df2

# lvextend, xfs, active, mounted, --fs resize
lvextend --fs resize -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "360.00m"
df --output=size "$mount_dir" |tee df3
not diff df2 df3

# lvextend, xfs, active, mounted, --resizefs (same as --fs resize)
lvextend --resizefs -L+10M $vg/$lv
check lv_field $vg/$lv lv_size "370.00m"
df --output=size "$mount_dir" |tee df4
not diff df3 df4

# lvextend, xfs, active, mounted, --fs resize --fsmode manage (same as --fs resize)
lvextend --fs resize --fsmode manage -L+10M $vg/$lv
check lv_field $vg/$lv lv_size "380.00m"
df --output=size "$mount_dir" |tee df2
not diff df1 df2

umount "$mount_dir"
lvchange -an $vg/$lv

# lvextend, xfs, inactive, --fs ignore
lvextend --fs ignore -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"

lvremove -f $vg/$lv

####################
# start with new fs 
####################

# lvextend, xfs, active, mounted, --fs resize --fsmode offline
lvcreate -n $lv -L 300M $vg
mkfs.xfs "$DM_DEV_DIR/$vg/$lv"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space"
df --output=size "$mount_dir_space" |tee df1
dd if=/dev/zero of="$mount_dir_space/zeros1" bs=1M count=20 oflag=direct
# xfs_growfs requires the fs to be mounted, so extending the lv is
# succeeds, then the xfs extend fails because it cannot be done unmounted
not lvextend --fs resize --fsmode offline -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "320.00m"
df -a | tee dfa
grep "$mount_dir_space" dfa
df --output=size "$mount_dir_space" |tee df2
# fs not extended so fs size not changed
diff df1 df2

# lvextend, xfs, active, mounted, --fs resize --fsmode nochange
lvextend --fs resize --fsmode nochange -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "340.00m"
df --output=size "$mount_dir_space" |tee df2
not diff df1 df2

# lvextend, xfs, active, mounted, --fs resize_fsadm
lvextend --fs resize_fsadm -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "360.00m"
df --output=size "$mount_dir_space" |tee df3
not diff df2 df3
umount "$mount_dir_space"

# lvextend, xfs, active, unmounted, --fs resize --fsmode nochange
# xfs_growfs requires the fs to be mounted to grow, so --fsmode nochange
# with an unmounted fs fails
not lvextend --fs resize --fsmode nochange -L+20M $vg/$lv
check lv_field $vg/$lv lv_size "380.00m"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space"
df --output=size "$mount_dir_space" |tee df4
# fs not extended so fs size not changed
diff df3 df4
umount "$mount_dir_space"

# lvextend, xfs, active, unmounted, --fs resize
# --yes needed because mount changes are required and plain "resize"
# fsopt did not specify if the user wants to change mount state
lvextend --yes --fs resize -L+10M $vg/$lv
check lv_field $vg/$lv lv_size "390.00m"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space"
df --output=size "$mount_dir_space" |tee df5
not diff df4 df5
umount "$mount_dir_space"

# lvextend, xfs, active, unmounted, --fs resize_fsadm
lvextend --fs resize_fsadm -L+10M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space"
df --output=size "$mount_dir_space" |tee df6
not diff df5 df6
umount "$mount_dir_space"
lvremove -f $vg/$lv


#################################################
#
# lvreduce, xfs (xfs does not support shrinking)
#
##################################################

# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize
# fs smaller than the reduced size
lvcreate -n $lv -L 300M $vg
mkfs.xfs "$DM_DEV_DIR/$vg/$lv"
lvextend -L+100M $vg/$lv
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=20 oflag=direct
df --output=size "$mount_dir" |tee df1
# fs is 300M, reduced size is 326M, so no fs reduce is needed
lvreduce -L326M $vg/$lv
check lv_field $vg/$lv lv_size "326.00m"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
umount "$mount_dir"
lvchange -an $vg/$lv

# lvreduce, xfs, inactive, no fs setting is same as --fs checksize
# fs smaller than the reduced size
# fs is 200M, reduced size is 216M, so no fs reduce is needed
lvreduce --fs checksize -L316M $vg/$lv
check lv_field $vg/$lv lv_size "316.00m"
lvchange -ay $vg/$lv
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2

# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize
# fs equal to the reduced size
# fs is 300M, reduced size is 300M, so no fs reduce is needed
lvreduce -L300M $vg/$lv
check lv_field $vg/$lv lv_size "300.00m"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2

# lvreduce, xfs, active, unmounted, no --fs setting is same as --fs checksize
# fs smaller than the reduced size
lvextend -L+100M $vg/$lv
umount "$mount_dir"
# fs is 300M, reduced size is 316M, so no fs reduce is needed
lvreduce -L356M $vg/$lv
check lv_field $vg/$lv lv_size "356.00m"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2

# lvreduce, xfs, active, mounted, --fs resize
# fs smaller than the reduced size
# fs is 300M, reduced size is 316M, so no fs reduce is needed
lvreduce -L316M $vg/$lv
check lv_field $vg/$lv lv_size "316.00m"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
umount "$mount_dir"
lvchange -an $vg/$lv


# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize
# fs equal to the reduced size
# fs is 300M, reduced size is 300M, so no fs reduce is needed
lvreduce --fs checksize -L300M $vg/$lv
check lv_field $vg/$lv lv_size "300.00m"
lvchange -ay $vg/$lv
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
umount "$mount_dir"

lvremove -f $vg/$lv


##########################################################
#
# lvreduce bigger xfs size (xfs does not support shrinking)
#
##########################################################

# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize
# fs larger than the reduced size, fs not using reduced space
lvcreate -n $lv -L 400M $vg
mkfs.xfs "$DM_DEV_DIR/$vg/$lv"
mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=20 oflag=direct
df --output=size "$mount_dir" |tee df1
# lvreduce fails because fs needs to be reduced
not lvreduce -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
# keep fs mounted

# lvreduce, xfs, active, mounted, --fs resize
# fs larger than the reduced size, fs not using reduced space
# lvreduce fails because xfs cannot shrink
not lvreduce --yes --fs resize -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
umount "$mount_dir"

# lvreduce, xfs, active, unmounted, --fs resize*
# fs larger than the reduced size, fs not using reduced space
# lvreduce fails because xfs cannot shrink
not lvreduce --yes --fs resize -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
not lvreduce --yes --fs resize --fsmode manage -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
not lvreduce --yes --fs resize --fsmode nochange -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
not lvreduce --yes --fs resize --fsmode offline -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
not lvreduce --yes --fs resize_fsadm -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"
not lvreduce --yes --resizefs -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"

mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir"
df --output=size "$mount_dir" |tee df2
# fs size unchanged
diff df1 df2
umount "$mount_dir"
lvchange -an $vg/$lv

# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize
# fs larger than the reduced size
# lvreduce fails because fs needs to be reduced
not lvreduce -L-100M $vg/$lv
check lv_field $vg/$lv lv_size "400.00m"

vgremove -f $vg