]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tests/zfs-tests/tests/functional/mv_files/mv_files_common.kshlib
Vendor import of openzfs master @ 184df27eef0abdc7ab2105b21257f753834b936b
[FreeBSD/FreeBSD.git] / tests / zfs-tests / tests / functional / mv_files / mv_files_common.kshlib
1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 # Use is subject to license terms.
25 #
26
27 #
28 # Copyright (c) 2013, 2016 by Delphix. All rights reserved.
29 #
30
31 . $STF_SUITE/tests/functional/mv_files/mv_files.cfg
32
33 #
34 # Determine whether this version of the ksh being
35 # executed has a bug where the limit of background
36 # processes of 25.
37 #
38 function check_bg_procs_limit_num
39 {
40 echo "#!/bin/ksh" > $TEST_BASE_DIR/exitsZero.ksh
41 echo  "exit 0" >> $TEST_BASE_DIR/exitsZero.ksh
42 chmod 777 $TEST_BASE_DIR/exitsZero.ksh
43
44 cat <<EOF > $TEST_BASE_DIR/testbackgprocs.ksh
45 #!/bin/ksh
46 #
47 # exitsZero.ksh is a one line script
48 # that exit with status of "0"
49 #
50
51 PIDS=""
52 typeset -i i=1
53 while [ \$i -le 50 ]
54 do
55         $TEST_BASE_DIR/exitsZero.ksh &
56         PIDS="\$PIDS \$!"
57         (( i = i + 1 ))
58 done
59
60 sleep 1
61
62 for pid in \$PIDS
63 do
64         wait \$pid
65         (( \$? == 127 )) && exit 1
66 done
67 exit 0
68 EOF
69
70 ksh $TEST_BASE_DIR/testbackgprocs.ksh
71 if [[ $? -eq 1 ]]; then
72 #
73 # Current ksh being executed has a limit
74 # of 25 background processes.
75 #
76         return 1
77 else
78         return 0
79 fi
80 }
81
82 function init_setup
83 {
84
85         typeset disklist=$1
86
87         create_pool $TESTPOOL "$disklist"
88
89         if ! is_global_zone ; then
90                 reexport_pool
91         fi
92
93         rm -rf $TESTDIR  || log_unresolved Could not remove $TESTDIR
94         mkdir -p $TESTDIR || log_unresolved Could not create $TESTDIR
95
96         rm -rf $TESTDIR_TGT  || log_unresolved Could not remove $TESTDIR_TGT
97         mkdir -p $TESTDIR_TGT || log_unresolved Could not create $TESTDIR_TGT
98
99         log_must zfs create $TESTPOOL/$TESTFS
100         log_must zfs set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
101
102         log_must zfs create $TESTPOOL/$TESTFS_TGT
103         log_must zfs set mountpoint=$TESTDIR_TGT $TESTPOOL/$TESTFS_TGT
104
105         mkdir -p $OLDDIR || log_unresolved Could not create $OLDDIR
106         mkdir -p $NEWDIR_IN_FS || log_unresolved Could not create $NEWDIR_IN_FS
107         mkdir -p $NEWDIR_ACROSS_FS || log_unresolved Could not create $NEWDIR_ACROSS_FS
108
109 }
110
111 #
112 # Generate given number files in a
113 # directory of zfs file system
114 # $1 - the directory holds the generated files
115 # $2 - number of to-be-generated files
116 #
117
118 function generate_files
119 {
120         typeset -i count
121         typeset -i proc_num=0
122
123         if (( $2 == $MVNUMFILES )); then
124                 count=1
125         else
126                 count=$MVNUMFILES+1
127         fi
128
129         while (( count <= $2 ))
130         do
131                 cp /etc/passwd $1/file_$count \
132                          > /dev/null 2>&1 &
133
134                 (( proc_num = proc_num + 1 ))
135
136                 if (( proc_num >= GANGPIDS )); then
137                         wait
138                         proc_num=0
139                 fi
140
141                (( count = count + 1 ))
142         done
143
144         wait
145 }
146
147 #
148 # Move given number files from one directory to
149 # another directory in parallel
150 # $1 - source directory
151 # $2 - target directory
152 #
153 function mv_files
154 {
155         find $1 -type f -print | xargs -I "{}" \
156                 mv {} $2 > /dev/null 2>&1
157 }
158
159 #
160 # Count the files number after moving, and
161 # compare it with the original number
162 # $1 - directory that to be operated
163 # $2 - original files number
164 #
165 function count_files
166 {
167         typeset -i file_num
168         file_num=`find $1  -type f -print | \
169                 wc -l`
170         (( file_num != $2 )) && \
171                 log_fail "The file number of target directory"\
172                         "$2 is not equal to that of the source "\
173                         "directory $1"
174
175 }
176
177 #
178 # Running the 'mv' test
179 # $1 - old directory
180 # $2 - new directory
181 #
182 function mv_test
183 {
184         typeset old=$1
185         typeset new=$2
186
187         typeset -i inc_num=$(( MVNUMFILES + MVNUMINCR ))
188         typeset -i num=0
189
190         for num in $MVNUMFILES $inc_num
191         do
192                 generate_files $old $num
193
194                 mv_files $old $new
195                 count_files $new $num
196
197                 mv_files $new $old
198                 count_files $old $num
199         done
200
201         typeset dir=$(get_device_dir $DISKS)
202         verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir"
203
204         return 0
205 }