• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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