fsx/fsstress: round blocksize properly
[xfstests-dev.git] / tests / generic / 589
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2019 Red Hat Inc.  All Rights Reserved.
4 #
5 # FS QA Test 589
6 #
7 # Test mount shared subtrees, verify the move semantics:
8 #
9 # ---------------------------------------------------------------------------
10 # |         MOVE MOUNT OPERATION                                            |
11 # |**************************************************************************
12 # |source(A)->| shared       |       private  |       slave    | unbindable |
13 # | dest(B)  |               |                |                |            |
14 # |   |      |               |                |                |            |
15 # |   v      |               |                |                |            |
16 # |**************************************************************************
17 # |  shared  | shared        |     shared     | shared & slave |  invalid   |
18 # |          |               |                |                |            |
19 # |non-shared| shared        |      private   |      slave     | unbindable |
20 # ***************************************************************************
21 #   NOTE: moving a mount residing under a shared mount is invalid.
22 #
23 #-----------------------------------------------------------------------
24 #
25 seq=`basename $0`
26 seqres=$RESULT_DIR/$seq
27 echo "QA output created by $seq"
28
29 here=`pwd`
30 tmp=/tmp/$$
31 status=1        # failure is the default!
32 trap "_cleanup; exit \$status" 0 1 2 3 15
33
34 _cleanup()
35 {
36         cd /
37         rm -f $tmp.*
38         _clear_mount_stack
39         # make sure there's no bug cause dentry isn't be freed
40         rm -rf $MNTHEAD
41 }
42
43 # get standard environment, filters and checks
44 . ./common/rc
45 . ./common/filter
46
47 # remove previous $seqres.full before test
48 rm -f $seqres.full
49
50 # real QA test starts here
51 _supported_fs generic
52 _require_test
53 _require_scratch
54 _require_local_device $SCRATCH_DEV
55
56 fs_stress()
57 {
58         local target=$1
59
60         $FSSTRESS_PROG -n 50 -p 3 -d $target >/dev/null
61         sync
62 }
63
64 # prepare some mountpoint dir
65 SRCHEAD=$TEST_DIR/$seq-src
66 DSTHEAD=$TEST_DIR/$seq-dst
67 rm -rf $SRCHEAD $DSTHEAD
68 mkdir $SRCHEAD $DSTHEAD 2>>$seqres.full
69 mpA=$SRCHEAD/"$$"_mpA
70 mpB=$SRCHEAD/"$$"_mpB
71 mpC=$DSTHEAD/"$$"_mpC
72 mpD=$DSTHEAD/"$$"_mpD
73
74 find_mnt()
75 {
76         echo "------"
77         findmnt -n -o TARGET,SOURCE $SCRATCH_DEV | \
78                 sed -e "s;$mpA;mpA;g" \
79                     -e "s;$mpB;mpB;g" \
80                     -e "s;$mpC;mpC;g" \
81                     -e "s;$mpD;mpD;g" | \
82                 _filter_spaces | _filter_testdir_and_scratch | sort
83         echo "======"
84 }
85
86 start_test()
87 {
88         local type=$1
89
90         _scratch_mkfs >$seqres.full 2>&1
91
92         _get_mount -t $FSTYP $SCRATCH_DEV $SRCHEAD
93         # make sure $SRCHEAD is private
94         $MOUNT_PROG --make-private $SRCHEAD
95
96         _get_mount -t $FSTYP $SCRATCH_DEV $DSTHEAD
97         # test start with a bind, then make-shared $DSTHEAD
98         _get_mount --bind $DSTHEAD $DSTHEAD
99         $MOUNT_PROG --make-"${type}" $DSTHEAD
100         mkdir $mpA $mpB $mpC $mpD
101 }
102
103 end_test()
104 {
105         _clear_mount_stack
106         rm -rf $mpA $mpB $mpC $mpD
107 }
108
109 move_run()
110 {
111         local source=$1
112         local dest=$2
113
114         start_test $dest
115
116         echo "move $source to $dest"
117         _get_mount -t $FSTYP $SCRATCH_DEV $mpA
118         mkdir -p $mpA/dir 2>/dev/null
119         $MOUNT_PROG --make-shared $mpA
120         # need a peer for slave later
121         _get_mount --bind $mpA $mpB
122         $MOUNT_PROG --make-"$source" $mpB
123         # maybe unbindable at here
124         _get_mount --move $mpB $mpC 2>/dev/null
125         if [ $? -ne 0 ]; then
126                 find_mnt
127                 end_test
128                 return 0
129         fi
130
131         # check mpC after move B to C
132         for m in $mpA $mpC; do
133                 _get_mount -t $FSTYP $SCRATCH_DEV $m/dir
134                 fs_stress $m/dir
135                 find_mnt
136                 _put_mount
137         done
138
139         # mpC will be in different parent mount, test moving from different
140         # parent mount, and moving a mount residing under a shared mount is
141         # invalid
142         _get_mount --move $mpC $mpD 2>/dev/null
143         if [ $? -ne 0 ]; then
144                 find_mnt
145                 end_test
146                 return 0
147         fi
148         for m in $mpA $mpD; do
149                 _get_mount -t $FSTYP $SCRATCH_DEV $m/dir
150                 fs_stress $m/dir
151                 find_mnt
152                 _put_mount
153         done
154
155         end_test
156 }
157
158 move_test()
159 {
160         #        source     dest
161         move_run shared     shared
162         move_run slave      shared
163         move_run private    shared
164         move_run unbindable shared
165
166         move_run shared     slave
167         move_run slave      slave
168         move_run private    slave
169         move_run unbindable slave
170
171         move_run shared     private
172         move_run slave      private
173         move_run private    private
174         move_run unbindable private
175 }
176
177 move_test
178
179 # success, all done
180 status=0
181 exit