Whamcloud - gitweb
429b93d2873ccb6844d1b7557bc72091c31c1677
[fs/lustre-release.git] / lustre / tests / posix.sh
1 #!/bin/bash
2 #set -vx
3 set -e
4
5 ONLY=${ONLY:-"$*"}
6
7 # bug number for skipped test:
8 ALWAYS_EXCEPT="$POSIX_EXCEPT"
9 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
10
11 [ "$ALWAYS_EXCEPT$EXCEPT" ] &&
12         echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
13
14 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
15 . $LUSTRE/tests/test-framework.sh
16 init_test_env $@
17 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
18 init_logging
19
20 POSIX_DIR=${POSIX_DIR:-"$LUSTRE/tests/posix"}
21 POSIX_SRC=${POSIX_SRC:-"/usr/src/posix"}
22 BASELINE_FS=${BASELINE_FS:-"ext4"}
23
24 # SLES does not support read-write access to an ext4 file system by default
25 [[ -e /etc/SuSE-release ]] && BASELINE_FS=ext3
26
27 if [[ $(facet_fstype $SINGLEMDS) = zfs ]]; then
28         BASELINE_FS=zfs
29         ! which $ZFS $ZPOOL >/dev/null 2>&1 &&
30                 skip_env "need $ZFS and $ZPOOL commands" && exit 0
31
32         POSIX_ZPOOL=$FSNAME-posix
33         POSIX_ZFS=$POSIX_ZPOOL/${POSIX_ZPOOL##$FSNAME-}
34 fi
35
36 check_and_setup_lustre
37 build_test_filter
38
39 cleanup_loop_dev() {
40     local mnt=$1
41     local dev=$2
42     local file=$3
43
44     # if we only have 1 arg, we will search for dev
45     if [[ $# = 1 ]]; then
46         dev=$(losetup -a | grep "$mnt" | cut -d: -f1)
47         [[ -n $dev ]] && losetup -d $dev
48     else # we need all args
49         [[ -z $mnt ]] || [[ -z $dev ]] || [[ -z $file ]] &&
50             error "Can't cleanup loop device"
51         umount -f $mnt
52         losetup -d $dev && rm -rf $mnt
53         rm -f $file
54     fi
55
56         [[ $BASELINE_FS != zfs ]] || destroy_zpool client $POSIX_ZPOOL
57 }
58
59 setup_loop_dev() {
60         local mnt=$1
61         local dev=$2
62         local file=$3
63         local rc=0
64
65         echo "Make a loop file system with $file on $dev"
66         dd if=/dev/zero of=$file bs=1024k count=500 > /dev/null
67         if ! losetup $dev $file; then
68                 rc=$?
69                 echo "can't set up $dev for $file"
70                 return $rc
71         fi
72
73         if [[ $BASELINE_FS = zfs ]]; then
74                 create_zpool client $POSIX_ZPOOL $dev || return ${PIPESTATUS[0]}
75                 create_zfs client $POSIX_ZFS || return ${PIPESTATUS[0]}
76                 dev=$POSIX_ZFS
77
78         elif ! eval mkfs.$BASELINE_FS $dev; then
79                 rc=$?
80                 echo "mkfs.$BASELINE_FS on $dev failed"
81                 return $rc
82         fi
83         mkdir -p $mnt
84         if ! mount -t $BASELINE_FS $dev $mnt; then
85                 rc=$?
86                 echo "mount $BASELINE_FS failed"
87                 return $rc
88         fi
89         echo
90         return $rc
91 }
92
93 test_1() {
94         local allnodes="$(comma_list $(nodes_list))"
95         local tfile="$TMP/$BASELINE_FS-file"
96         local mntpnt=$POSIX_SRC/$BASELINE_FS
97         local loopbase
98         local loopdev
99         local rc=0
100
101         # We start at loop1 because posix build uses loop0
102         [ -b /dev/loop/1 ] && loopbase=/dev/loop/
103         [ -b /dev/loop1 ] && loopbase=/dev/loop
104         if [ -z "$loopbase" ]; then
105                 # there is no /dev/loop by default on EL7, LU-6707.
106                 load_module loop max_loop=8 || error "load loop module failed"
107                 loopbase=/dev/loop
108         fi
109
110         for i in $(seq 1 7); do
111                 losetup $loopbase$i > /dev/null 2>&1 && continue || true
112                 loopdev=$loopbase$i
113                 break
114         done
115
116         [ -z "$loopdev" ] && error "Can not find loop device"
117
118         if ! setup_loop_dev $mntpnt $loopdev $tfile; then
119                 cleanup_loop_dev "$mntpnt" "$loopdev" "$tfile"
120                 error "Setup loop device failed"
121         fi
122
123         # copy the source over to ext mount point
124         if ! cp -af ${POSIX_SRC}/*.* $mntpnt; then
125                 cleanup_loop_dev "$mntpnt" "$loopdev" "$tfile"
126                 error "Copy POSIX test suite failed"
127         fi
128         export POSIX_SRC=$mntpnt
129         . $POSIX_DIR/posix.cfg
130
131         setup_posix_users $allnodes
132         if ! setup_posix; then
133                 delete_posix_users $allnodes
134                 cleanup_loop_dev "$POSIX_SRC"
135                 cleanup_loop_dev "$mntpnt" "$loopdev" "$tfile"
136                 error "Setup POSIX test suite failed"
137         fi
138
139         log "Run POSIX test against lustre filesystem"
140         run_posix $MOUNT $MGSNID $FSNAME compare ||
141                 error_noexit "Run POSIX testsuite on $MOUNT failed"
142
143         [[ -d "$MOUNT/TESTROOT" ]] && rm -fr $MOUNT/TESTROOT
144         delete_posix_users $allnodes
145         cleanup_loop_dev "$POSIX_SRC"
146         cleanup_loop_dev "$mntpnt" "$loopdev" "$tfile"
147 }
148 run_test 1 "install, build, run posix on $BASELINE_FS and lustre, then compare"
149
150 complete $SECONDS
151 check_and_cleanup_lustre
152 exit_status