generic: add test for boundary in xfs_attr_shortform_verify
[xfstests-dev.git] / tests / generic / 409
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2016 Red Hat Inc.  All Rights Reserved.
4 #
5 # FS QA Test 409
6 #
7 # Test mount shared subtrees, verify the bind semantics:
8 #
9 # ---------------------------------------------------------------------------
10 # |         BIND 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     |  invalid   |
20 # ***************************************************************************
21 #
22 seq=`basename $0`
23 seqres=$RESULT_DIR/$seq
24 echo "QA output created by $seq"
25
26 here=`pwd`
27 tmp=/tmp/$$
28 status=1        # failure is the default!
29 trap "_cleanup; exit \$status" 0 1 2 3 15
30
31 _cleanup()
32 {
33         cd /
34         rm -f $tmp.*
35         _clear_mount_stack
36         # make sure there's no bug cause dentry isn't be freed
37         rm -rf $MNTHEAD
38 }
39
40 # get standard environment, filters and checks
41 . ./common/rc
42 . ./common/filter
43
44 # remove previous $seqres.full before test
45 rm -f $seqres.full
46
47 # real QA test starts here
48 _supported_fs generic
49 _supported_os Linux
50 _require_test
51 _require_scratch
52 _require_local_device $SCRATCH_DEV
53
54 fs_stress()
55 {
56         local target=$1
57
58         $FSSTRESS_PROG -z -n 50 -p 3 \
59                        -f creat=5 \
60                        -f mkdir=5 \
61                        -f link=2 \
62                        -f rename=1 \
63                        -f rmdir=2 \
64                        -f unlink=1 \
65                        -f symlink=1 \
66                        -f write=1 \
67                        -f read=1 \
68                        -f chown=1 \
69                        -f getdents=1 \
70                        -f fiemap=1 \
71                        -d $target >/dev/null
72         sync
73 }
74
75 # prepare some mountpoint dir
76 MNTHEAD=$TEST_DIR/$seq
77 rm -rf $MNTHEAD
78 mkdir $MNTHEAD 2>>$seqres.full
79 mpA=$MNTHEAD/"$$"_mpA
80 mpB=$MNTHEAD/"$$"_mpB
81 mpC=$MNTHEAD/"$$"_mpC
82 mpD=$MNTHEAD/"$$"_mpD
83
84 find_mnt()
85 {
86         echo "------"
87         findmnt -n -o TARGET,SOURCE $SCRATCH_DEV | \
88                 sed -e "s;$mpA;mpA;g" \
89                     -e "s;$mpB;mpB;g" \
90                     -e "s;$mpC;mpC;g" \
91                     -e "s;$mpD;mpD;g" | \
92                 _filter_spaces | _filter_testdir_and_scratch | sort
93         echo "======"
94 }
95
96 start_test()
97 {
98         local type=$1
99
100         _scratch_mkfs >$seqres.full 2>&1
101         _get_mount -t $FSTYP $SCRATCH_DEV $MNTHEAD
102         $MOUNT_PROG --make-"${type}" $MNTHEAD
103         mkdir $mpA $mpB $mpC $mpD
104 }
105
106 end_test()
107 {
108         _clear_mount_stack
109         rm -rf $mpA $mpB $mpC $mpD
110 }
111
112 bind_run()
113 {
114         local source=$1
115         local dest=$2
116
117         start_test $dest
118
119         echo "bind $source on $dest"
120         _get_mount -t $FSTYP $SCRATCH_DEV $mpA
121         mkdir -p $mpA/dir 2>/dev/null
122         $MOUNT_PROG --make-shared $mpA
123         _get_mount --bind $mpA $mpB
124         $MOUNT_PROG --make-"$source" $mpB
125         # maybe unbindable at here
126         _get_mount --bind $mpB $mpC 2>/dev/null
127         if [ $? -ne 0 ]; then
128                 find_mnt
129                 end_test
130                 return 0
131         fi
132         _get_mount --bind $mpC $mpD
133         for m in $mpA $mpB $mpC $mpD; do
134                 _get_mount -t $FSTYP $SCRATCH_DEV $m/dir
135                 fs_stress $m/dir
136                 find_mnt
137                 _put_mount
138         done
139
140         end_test
141 }
142
143 bind_test()
144 {
145         #        source     dest
146         bind_run shared     shared
147         bind_run slave      shared
148         bind_run private    shared
149         bind_run unbindable shared
150
151         bind_run shared     slave
152         bind_run slave      slave
153         bind_run private    slave
154         bind_run unbindable slave
155
156         bind_run shared     private
157         bind_run slave      private
158         bind_run private    private
159         bind_run unbindable private
160 }
161
162 bind_test
163
164 # success, all done
165 status=0
166 exit