swapon01.c revision 4bb656a129f7507823e9e6d6b98b1a02fd80ef89
1ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/*
2ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
3ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
4ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * This program is free software; you can redistribute it and/or modify it
5ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * under the terms of version 2 of the GNU General Public License as
6ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * published by the Free Software Foundation.
7ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
8ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * This program is distributed in the hope that it would be useful, but
9ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * WITHOUT ANY WARRANTY; without even the implied warranty of
10ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
12ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * You should have received a copy of the GNU General Public License along
13ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * with this program; if not, write the Free Software Foundation, Inc., 59
14ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Temple Place - Suite 330, Boston MA 02111-1307, USA.
15ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
16ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew */
17ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/**************************************************************************
184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
194bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *    TEST IDENTIFIER	: swapon1
204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
216b01d689606d971217ccb961f3c44db8c2024d08robbiew *    EXECUTED BY	: root / superuser
224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
236b01d689606d971217ccb961f3c44db8c2024d08robbiew *    TEST TITLE	: Basic test for swapon(2)
244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
256b01d689606d971217ccb961f3c44db8c2024d08robbiew *    TEST CASE TOTAL	: 1
264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
276b01d689606d971217ccb961f3c44db8c2024d08robbiew *    AUTHOR		: Aniruddha Marathe <aniruddha.marathe@wipro.com>
284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
29ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    SIGNALS
306b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	Uses SIGUSR1 to pause before test if option set.
316b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	(See the parse_opts(3) man page).
32ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
33ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    DESCRIPTION
34ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    This is a Phase I test for the swapon(2) system call.
35ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    It is intended to provide a limited exposure of the system call.
364bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
376b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	Setup:
386b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Setup signal handling.
396b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Pause for SIGUSR1 if option specified.
406b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Create a temporary directory.
416b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Create file of size 32Mb .
426b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Make this file as swap file using mkswap(8)
434bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
446b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	Test:
456b01d689606d971217ccb961f3c44db8c2024d08robbiew *	 Loop if the proper options are given.
466b01d689606d971217ccb961f3c44db8c2024d08robbiew *	 Turn on the swapfile to test the system call
476b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Execute system call
486b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Check return code, if system call failed (return=-1)
496b01d689606d971217ccb961f3c44db8c2024d08robbiew *		Log the errno and Issue a FAIL message.
506b01d689606d971217ccb961f3c44db8c2024d08robbiew *	  Otherwise, Issue a PASS message.
514bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
526b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	Cleanup:
536b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	  Print errno log and/or timing stats if options given
544bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *
55ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * USAGE:  <for command-line>
56ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * swapon01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p]
57ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * where:
586b01d689606d971217ccb961f3c44db8c2024d08robbiew * 	-c n : run n copies simultaneously.
596b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-e   : Turn on errno logging.
606b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-i n : Execute test n times.
616b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-I x : Execute test for x seconds.
626b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-p   : Pause for SIGUSR1 before starting
636b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-P x : Pause for x seconds between iterations.
646b01d689606d971217ccb961f3c44db8c2024d08robbiew *	-t   : Turn on syscall timing.
65ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
66ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *RESTRICTIONS:
67ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Not compatible with kernel versions below 2.1.35
68143090a9f7b93c011573dc044a58b2eea48e07e5robbiew *
69143090a9f7b93c011573dc044a58b2eea48e07e5robbiew *CHANGES:
70143090a9f7b93c011573dc044a58b2eea48e07e5robbiew * 2005/01/01  Add extra check to stop test if insufficient disk space in dir
71143090a9f7b93c011573dc044a58b2eea48e07e5robbiew *             -Ricky Ng-Adam (rngadam@yahoo.com)
72143090a9f7b93c011573dc044a58b2eea48e07e5robbiew * 2005/01/01  Add extra check to stop test if swap file is on tmpfs
73143090a9f7b93c011573dc044a58b2eea48e07e5robbiew *             -Ricky Ng-Adam (rngadam@yahoo.com)
74ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *****************************************************************************/
75ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
76ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <unistd.h>
77ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include "test.h"
78ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include "usctest.h"
79ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <errno.h>
80ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <sys/swap.h>
81ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <stdlib.h>
82ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
83ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewstatic void setup();
84ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewstatic void cleanup();
85ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
86ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewchar *TCID = "swapon01"; /* Test program identifier.    */
876b01d689606d971217ccb961f3c44db8c2024d08robbiewint TST_TOTAL = 1;	/* Total number of test cases. */
886b01d689606d971217ccb961f3c44db8c2024d08robbiewextern int Tst_count;	/* Test Case counter for tst_* routines */
89ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
90ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewint
91ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewmain(int ac, char **av)
92ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
93ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
946b01d689606d971217ccb961f3c44db8c2024d08robbiew	int lc;		/* loop counter */
956b01d689606d971217ccb961f3c44db8c2024d08robbiew	char *msg;	/* message returned from parse_opts */
966b01d689606d971217ccb961f3c44db8c2024d08robbiew
976b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* parse standard options */
986b01d689606d971217ccb961f3c44db8c2024d08robbiew	if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL))
996b01d689606d971217ccb961f3c44db8c2024d08robbiew		!= (char *)NULL) {
1006b01d689606d971217ccb961f3c44db8c2024d08robbiew		tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
1016b01d689606d971217ccb961f3c44db8c2024d08robbiew	}
1026b01d689606d971217ccb961f3c44db8c2024d08robbiew
1036b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* perform global setup for test */
1046b01d689606d971217ccb961f3c44db8c2024d08robbiew	setup();
1056b01d689606d971217ccb961f3c44db8c2024d08robbiew
1066b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* check looping state if -i option given */
1076b01d689606d971217ccb961f3c44db8c2024d08robbiew	for (lc = 0; TEST_LOOPING(lc); lc++) {
1086b01d689606d971217ccb961f3c44db8c2024d08robbiew
1096b01d689606d971217ccb961f3c44db8c2024d08robbiew		/* reset Tst_count in case we are looping. */
1106b01d689606d971217ccb961f3c44db8c2024d08robbiew		Tst_count = 0;
1116b01d689606d971217ccb961f3c44db8c2024d08robbiew
1126b01d689606d971217ccb961f3c44db8c2024d08robbiew		TEST(swapon("./swapfile01", 0));
1136b01d689606d971217ccb961f3c44db8c2024d08robbiew
1146b01d689606d971217ccb961f3c44db8c2024d08robbiew		/* check return code */
1156b01d689606d971217ccb961f3c44db8c2024d08robbiew		if (TEST_RETURN == -1) {
1166b01d689606d971217ccb961f3c44db8c2024d08robbiew			TEST_ERROR_LOG(TEST_ERRNO);
1176b01d689606d971217ccb961f3c44db8c2024d08robbiew			tst_resm(TFAIL, "swapon(2) Failed to turn on"
1186b01d689606d971217ccb961f3c44db8c2024d08robbiew				" swapfile.");
1196b01d689606d971217ccb961f3c44db8c2024d08robbiew		} else {
1206b01d689606d971217ccb961f3c44db8c2024d08robbiew			tst_resm(TPASS, "swapon(2) passed and turned on"
1216b01d689606d971217ccb961f3c44db8c2024d08robbiew					" swapfile");
1226b01d689606d971217ccb961f3c44db8c2024d08robbiew			/*we need to turn this swap file off for -i option */
1236b01d689606d971217ccb961f3c44db8c2024d08robbiew			if(swapoff("./swapfile01") != 0) {
1246b01d689606d971217ccb961f3c44db8c2024d08robbiew				tst_brkm(TBROK, cleanup, "Failed to turn off"
1256b01d689606d971217ccb961f3c44db8c2024d08robbiew							" swapfile. system"
1266b01d689606d971217ccb961f3c44db8c2024d08robbiew							" reboot after"
1276b01d689606d971217ccb961f3c44db8c2024d08robbiew							" execution of LTP"
1286b01d689606d971217ccb961f3c44db8c2024d08robbiew							" test suite is"
1296b01d689606d971217ccb961f3c44db8c2024d08robbiew							" recommended.");
1306b01d689606d971217ccb961f3c44db8c2024d08robbiew			}
1316b01d689606d971217ccb961f3c44db8c2024d08robbiew		}
1326b01d689606d971217ccb961f3c44db8c2024d08robbiew	}	/*End for TEST_LOOPING*/
1336b01d689606d971217ccb961f3c44db8c2024d08robbiew
1346b01d689606d971217ccb961f3c44db8c2024d08robbiew	/*Clean up and exit*/
1356b01d689606d971217ccb961f3c44db8c2024d08robbiew	cleanup();
1366b01d689606d971217ccb961f3c44db8c2024d08robbiew
1376b01d689606d971217ccb961f3c44db8c2024d08robbiew	/*NOTREACHED*/
1386b01d689606d971217ccb961f3c44db8c2024d08robbiew	return 0;
139ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew}
140ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
141ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/* setup() - performs all ONE TIME setup for this test */
142ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewvoid
143ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewsetup()
144ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
145143090a9f7b93c011573dc044a58b2eea48e07e5robbiew
1466b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* capture signals */
1476b01d689606d971217ccb961f3c44db8c2024d08robbiew	tst_sig(FORK, DEF_HANDLER, cleanup);
148ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
1496b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* Check whether we are root*/
1506b01d689606d971217ccb961f3c44db8c2024d08robbiew	if (geteuid() != 0) {
1516b01d689606d971217ccb961f3c44db8c2024d08robbiew		tst_brkm(TBROK, tst_exit, "Test must be run as root");
1526b01d689606d971217ccb961f3c44db8c2024d08robbiew	}
153ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
1546b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* Pause if that option was specified */
1556b01d689606d971217ccb961f3c44db8c2024d08robbiew	TEST_PAUSE;
156ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
1576b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* make a temp directory and cd to it */
1586b01d689606d971217ccb961f3c44db8c2024d08robbiew	tst_tmpdir();
159ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
160143090a9f7b93c011573dc044a58b2eea48e07e5robbiew	if(tst_is_cwd_tmpfs()) {
16104c009ed372517d4a2080052cb1ba41a07f993c7subrata_modak		tst_brkm(TCONF, cleanup, "Cannot do swapon on a file located on a tmpfs filesystem");
16204c009ed372517d4a2080052cb1ba41a07f993c7subrata_modak	}
16304c009ed372517d4a2080052cb1ba41a07f993c7subrata_modak
16404c009ed372517d4a2080052cb1ba41a07f993c7subrata_modak	if(tst_is_cwd_nfs()) {
16504c009ed372517d4a2080052cb1ba41a07f993c7subrata_modak		tst_brkm(TCONF, cleanup, "Cannot do swapon on a file located on a nfs filesystem");
166143090a9f7b93c011573dc044a58b2eea48e07e5robbiew	}
167143090a9f7b93c011573dc044a58b2eea48e07e5robbiew
168143090a9f7b93c011573dc044a58b2eea48e07e5robbiew	if(!tst_cwd_has_free(65536)) {
169143090a9f7b93c011573dc044a58b2eea48e07e5robbiew		tst_brkm(TBROK, cleanup, "Insufficient disk space to create swap file");
170143090a9f7b93c011573dc044a58b2eea48e07e5robbiew	}
171143090a9f7b93c011573dc044a58b2eea48e07e5robbiew
1726b01d689606d971217ccb961f3c44db8c2024d08robbiew	/*create file*/
1736b01d689606d971217ccb961f3c44db8c2024d08robbiew	if(system("dd if=/dev/zero of=swapfile01 bs=1024  count=65536 >"
1746b01d689606d971217ccb961f3c44db8c2024d08robbiew				" tmpfile 2>&1") != 0) {
1756b01d689606d971217ccb961f3c44db8c2024d08robbiew		tst_brkm(TBROK, cleanup, "Failed to create file for swap");
1766b01d689606d971217ccb961f3c44db8c2024d08robbiew	}
177ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
178143090a9f7b93c011573dc044a58b2eea48e07e5robbiew
1796b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* make above file a swap file*/
1806b01d689606d971217ccb961f3c44db8c2024d08robbiew	if( system("mkswap swapfile01 > tmpfile 2>&1") != 0) {
1816b01d689606d971217ccb961f3c44db8c2024d08robbiew		tst_brkm(TBROK, cleanup, "Failed to make swapfile");
1826b01d689606d971217ccb961f3c44db8c2024d08robbiew	}
1836b01d689606d971217ccb961f3c44db8c2024d08robbiew}	/* End setup() */
184ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
185ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/*
186ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * cleanup() - Performs one time cleanup for this test at
187ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * completion or premature exit
188ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew */
189ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewvoid
190ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewcleanup()
191ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
1926b01d689606d971217ccb961f3c44db8c2024d08robbiew	/*
1936b01d689606d971217ccb961f3c44db8c2024d08robbiew	* print timing stats if that option was specified.
1946b01d689606d971217ccb961f3c44db8c2024d08robbiew	* print errno log if that option was specified.
1956b01d689606d971217ccb961f3c44db8c2024d08robbiew	*/
1966b01d689606d971217ccb961f3c44db8c2024d08robbiew	TEST_CLEANUP;
1976b01d689606d971217ccb961f3c44db8c2024d08robbiew
1986b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* Remove tmp dir and all files inside it. */
1996b01d689606d971217ccb961f3c44db8c2024d08robbiew	tst_rmdir();
2006b01d689606d971217ccb961f3c44db8c2024d08robbiew
2016b01d689606d971217ccb961f3c44db8c2024d08robbiew	/* exit with return code appropriate for results */
2026b01d689606d971217ccb961f3c44db8c2024d08robbiew	tst_exit();
2036b01d689606d971217ccb961f3c44db8c2024d08robbiew}	/* End cleanup() */
204