1#!/bin/sh 2# 3# Copyright (c) 2015 Fujitsu Ltd. 4# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 2 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# Test mkswap command with some basic options. 17# 18 19TST_ID="mkswap01" 20TST_CNT=10 21TST_SETUP=setup 22TST_TESTFUNC=do_test 23TST_NEEDS_ROOT=1 24TST_NEEDS_TMPDIR=1 25TST_NEEDS_DEVICE=1 26TST_NEEDS_CMDS="uuidgen blkid blockdev mkswap" 27. tst_test.sh 28 29setup() 30{ 31 UUID=`uuidgen` 32 33 PAGE_SIZE=`getconf PAGE_SIZE` 34 35 # Here get the size of the device and align it down to be the 36 # multiple of $PAGE_SIZE and use that as the size for testing. 37 real_size=`blockdev --getsize64 $TST_DEVICE` 38 DEVICE_SIZE=$((($real_size/$PAGE_SIZE * $PAGE_SIZE)/1024)) 39} 40 41wait_for_file() 42{ 43 local path="$1" 44 local retries=10 45 46 if [ -z "$path" ]; then 47 return 48 fi 49 50 while [ $retries -gt 0 ]; do 51 if [ -e "$path" ]; then 52 return 53 fi 54 tst_res TINFO "Waiting for $path to appear" 55 retries=$((retries - 1)) 56 tst_sleep 10ms 57 done 58 59 tst_res TINFO "The file $path haven't appeared" 60} 61 62mkswap_verify() 63{ 64 local mkswap_op="$1" 65 local op_arg="$2" 66 local swapfile="$3" 67 local dev_file="$5" 68 69 local before=`awk '/SwapTotal/ {print $2}' /proc/meminfo` 70 71 local swapsize=${4:-$DEVICE_SIZE} 72 73 if [ "$mkswap_op" = "-p" ]; then 74 local pagesize=$op_arg 75 else 76 local pagesize=$PAGE_SIZE 77 fi 78 79 wait_for_file "$dev_file" 80 81 swapon $swapfile 2>/dev/null 82 83 if [ $? -ne 0 ]; then 84 tst_res TINFO "Can not do swapon on $swapfile." 85 if [ $pagesize -ne $PAGE_SIZE ]; then 86 tst_res TINFO "Page size specified by 'mkswap -p' \ 87is not equal to system's page size." 88 tst_res TINFO "Swapon failed expectedly." 89 return 0 90 fi 91 92 if [ $swapsize -gt $DEVICE_SIZE ]; then 93 tst_res TINFO "Device size specified by 'mkswap' \ 94greater than real size." 95 tst_res TINFO "Swapon failed expectedly." 96 return 0 97 fi 98 99 tst_res TINFO "Swapon failed unexpectedly." 100 return 1 101 fi 102 103 local after=`awk '/SwapTotal/ {print $2}' /proc/meminfo` 104 105 local diff=$((after-before)) 106 local filesize=$((swapsize-pagesize/1024)) 107 108 local ret=0 109 110 # In general, the swap increment by doing swapon should be equal to 111 # the device size minus a page size, however for some kernels, the 112 # increment we get is not exactly equal to that value, but is equal 113 # to the value minus an extra page size, e.g. on RHEL5.11GA. 114 if [ $diff -ne $filesize ] && \ 115 [ $diff -ne $((filesize-pagesize/1024)) ]; then 116 ret=1 117 fi 118 119 swapoff $swapfile 2>/dev/null 120 if [ $? -ne 0 ]; then 121 tst_res TWARN "Can not do swapoff on $swapfile." 122 fi 123 124 return $ret 125} 126 127mkswap_test() 128{ 129 local mkswap_op="$1" 130 local op_arg="$2" 131 local device="$3" 132 local size="$4" 133 local dev_file="$5" 134 135 local mkswap_cmd="mkswap $mkswap_op $op_arg $TST_DEVICE $size" 136 137 ${mkswap_cmd} >temp 2>&1 138 if [ $? -ne 0 ]; then 139 grep -q -E "unknown option|invalid option|Usage" temp 140 if [ $? -eq 0 ]; then 141 tst_res TCONF "'${mkswap_cmd}' not supported." 142 return 143 fi 144 145 tst_res TFAIL "'${mkswap_cmd}' failed." 146 cat temp 147 return 148 fi 149 150 if [ -n "$device" ]; then 151 mkswap_verify "$mkswap_op" "$op_arg" "$device" "$size" "$dev_file" 152 if [ $? -ne 0 ]; then 153 tst_res TFAIL "'${mkswap_cmd}' failed, not expected." 154 return 155 fi 156 fi 157 158 tst_res TPASS "'${mkswap_cmd}' passed." 159} 160 161do_test() 162{ 163 case $1 in 164 1) mkswap_test "" "" "$TST_DEVICE";; 165 2) mkswap_test "" "" "$TST_DEVICE" "$((DEVICE_SIZE-PAGE_SIZE/1024))";; 166 3) mkswap_test "-f" "" "$TST_DEVICE" "$((DEVICE_SIZE+PAGE_SIZE/1024))";; 167 4) mkswap_test "-c" "" "$TST_DEVICE";; 168 5) mkswap_test "-p" "2048" "$TST_DEVICE";; 169 6) mkswap_test "-L" "ltp_testswap" "-L ltp_testswap" "" "/dev/disk/by-label/ltp_testswap";; 170 7) mkswap_test "-v1" "" "$TST_DEVICE";; 171 8) mkswap_test "-U" "$UUID" "-U $UUID" "" "/dev/disk/by-uuid/$UUID";; 172 9) mkswap_test "-V";; 173 10) mkswap_test "-h";; 174 esac 175} 176 177tst_run 178