1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0-or-later 3# Copyright (c) 2015 Fujitsu Ltd. 4# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> 5# 6# Test mkswap command with some basic options. 7 8TST_CNT=10 9TST_SETUP=setup 10TST_TESTFUNC=do_test 11TST_NEEDS_ROOT=1 12TST_NEEDS_DEVICE=1 13TST_NEEDS_CMDS="uuidgen blkid blockdev mkswap" 14 15setup() 16{ 17 UUID=`uuidgen` 18 19 PAGE_SIZE=`tst_getconf PAGESIZE` 20 21 # Here get the size of the device and align it down to be the 22 # multiple of $PAGE_SIZE and use that as the size for testing. 23 real_size=`blockdev --getsize64 $TST_DEVICE` 24 DEVICE_SIZE=$((($real_size/$PAGE_SIZE * $PAGE_SIZE)/1024)) 25} 26 27check_for_file() 28{ 29 local path="$1" 30 31 if [ -z "$path" -o -e "$path" ]; then 32 return 33 fi 34 return 1 35} 36 37mkswap_verify() 38{ 39 local mkswap_op="$1" 40 local op_arg="$2" 41 local swapfile="$3" 42 local dev_file="$5" 43 44 local before=`awk '/SwapTotal/ {print $2}' /proc/meminfo` 45 46 local swapsize=${4:-$DEVICE_SIZE} 47 48 if [ "$mkswap_op" = "-p" ]; then 49 local pagesize=$op_arg 50 else 51 local pagesize=$PAGE_SIZE 52 fi 53 54 TST_RETRY_FUNC "check_for_file $dev_file" 0 55 56 swapon $swapfile 2>/dev/null 57 58 if [ $? -ne 0 ]; then 59 tst_res TINFO "Can not do swapon on $swapfile." 60 if [ $pagesize -ne $PAGE_SIZE ]; then 61 tst_res TINFO "Page size specified by 'mkswap -p' \ 62is not equal to system's page size." 63 tst_res TINFO "Swapon failed expectedly." 64 return 0 65 fi 66 67 if [ $swapsize -gt $DEVICE_SIZE ]; then 68 tst_res TINFO "Device size specified by 'mkswap' \ 69greater than real size." 70 tst_res TINFO "Swapon failed expectedly." 71 return 0 72 fi 73 74 tst_res TINFO "Swapon failed unexpectedly." 75 return 1 76 fi 77 78 local after=`awk '/SwapTotal/ {print $2}' /proc/meminfo` 79 80 local diff=$((after-before)) 81 local filesize=$((swapsize-pagesize/1024)) 82 83 local ret=0 84 85 # In general, the swap increment by doing swapon should be equal to 86 # the device size minus a page size, however for some kernels, the 87 # increment we get is not exactly equal to that value, but is equal 88 # to the value minus an extra page size, e.g. on RHEL5.11GA. 89 if [ $diff -ne $filesize ] && \ 90 [ $diff -ne $((filesize-pagesize/1024)) ]; then 91 ret=1 92 fi 93 94 swapoff $swapfile 2>/dev/null 95 if [ $? -ne 0 ]; then 96 tst_res TWARN "Can not do swapoff on $swapfile." 97 fi 98 99 return $ret 100} 101 102mkswap_test() 103{ 104 local mkswap_op="$1" 105 local op_arg="$2" 106 local device="$3" 107 local size="$4" 108 local dev_file="$5" 109 110 local mkswap_cmd="mkswap $mkswap_op $op_arg $TST_DEVICE $size" 111 112 ${mkswap_cmd} >temp 2>&1 113 if [ $? -ne 0 ]; then 114 grep -q -E "unknown option|invalid option|Usage" temp 115 if [ $? -eq 0 ]; then 116 tst_res TCONF "'${mkswap_cmd}' not supported." 117 return 118 fi 119 120 tst_res TFAIL "'${mkswap_cmd}' failed." 121 cat temp 122 return 123 fi 124 125 udevadm trigger --name-match=$TST_DEVICE 126 udevadm settle --exit-if-exists==$TST_DEVICE 127 128 if [ -n "$device" ]; then 129 mkswap_verify "$mkswap_op" "$op_arg" "$device" "$size" "$dev_file" 130 if [ $? -ne 0 ]; then 131 tst_res TFAIL "'${mkswap_cmd}' failed, not expected." 132 return 133 fi 134 fi 135 136 tst_res TPASS "'${mkswap_cmd}' passed." 137} 138 139do_test() 140{ 141 case $1 in 142 1) mkswap_test "" "" "$TST_DEVICE";; 143 2) mkswap_test "" "" "$TST_DEVICE" "$((DEVICE_SIZE-PAGE_SIZE/1024))";; 144 3) mkswap_test "-f" "" "$TST_DEVICE" "$((DEVICE_SIZE+PAGE_SIZE/1024))";; 145 4) mkswap_test "-c" "" "$TST_DEVICE";; 146 5) mkswap_test "-p" "2048" "$TST_DEVICE";; 147 6) mkswap_test "-L" "ltp_testswap" "-L ltp_testswap" "" "/dev/disk/by-label/ltp_testswap";; 148 7) mkswap_test "-v1" "" "$TST_DEVICE";; 149 8) mkswap_test "-U" "$UUID" "-U $UUID" "" "/dev/disk/by-uuid/$UUID";; 150 9) mkswap_test "-V";; 151 10) mkswap_test "-h";; 152 esac 153} 154 155. tst_test.sh 156tst_run 157