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