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