query_module01.c revision 2c28215423293e443469a07ae7011135d058b671
15f30b5d78d6337a249724fb89888db68f23e711bplars/* 25f30b5d78d6337a249724fb89888db68f23e711bplars * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. 35f30b5d78d6337a249724fb89888db68f23e711bplars * 45f30b5d78d6337a249724fb89888db68f23e711bplars * This program is free software; you can redistribute it and/or modify it 55f30b5d78d6337a249724fb89888db68f23e711bplars * under the terms of version 2 of the GNU General Public License as 65f30b5d78d6337a249724fb89888db68f23e711bplars * published by the Free Software Foundation. 75f30b5d78d6337a249724fb89888db68f23e711bplars * 85f30b5d78d6337a249724fb89888db68f23e711bplars * This program is distributed in the hope that it would be useful, but 95f30b5d78d6337a249724fb89888db68f23e711bplars * WITHOUT ANY WARRANTY; without even the implied warranty of 105f30b5d78d6337a249724fb89888db68f23e711bplars * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 115f30b5d78d6337a249724fb89888db68f23e711bplars * 125f30b5d78d6337a249724fb89888db68f23e711bplars * You should have received a copy of the GNU General Public License along 135f30b5d78d6337a249724fb89888db68f23e711bplars * with this program; if not, write the Free Software Foundation, Inc., 59 145f30b5d78d6337a249724fb89888db68f23e711bplars * Temple Place - Suite 330, Boston MA 02111-1307, USA. 155f30b5d78d6337a249724fb89888db68f23e711bplars * 165f30b5d78d6337a249724fb89888db68f23e711bplars */ 175f30b5d78d6337a249724fb89888db68f23e711bplars/********************************************************** 184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 195f30b5d78d6337a249724fb89888db68f23e711bplars * TEST IDENTIFIER : query_module01 204bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 215f30b5d78d6337a249724fb89888db68f23e711bplars * EXECUTED BY : root / superuser 224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 235f30b5d78d6337a249724fb89888db68f23e711bplars * TEST TITLE : Checking functionality of query_module(2) 244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 255f30b5d78d6337a249724fb89888db68f23e711bplars * TEST CASE TOTAL : 6 264bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 275f30b5d78d6337a249724fb89888db68f23e711bplars * AUTHOR : Madhu T L <madhu.tarikere@wipro.com> 284bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 295f30b5d78d6337a249724fb89888db68f23e711bplars * SIGNALS 305f30b5d78d6337a249724fb89888db68f23e711bplars * Uses SIGUSR1 to pause before test if option set. 315f30b5d78d6337a249724fb89888db68f23e711bplars * (See the parse_opts(3) man page). 325f30b5d78d6337a249724fb89888db68f23e711bplars * 335f30b5d78d6337a249724fb89888db68f23e711bplars * DESCRIPTION 345f30b5d78d6337a249724fb89888db68f23e711bplars * Verify that, 355f30b5d78d6337a249724fb89888db68f23e711bplars * 1. query_module(2) is successful for NULL module name, which argument 365f30b5d78d6337a249724fb89888db68f23e711bplars * set to 0. 375f30b5d78d6337a249724fb89888db68f23e711bplars * 2. query_module(2) is successful for NULL module name, which argument 385f30b5d78d6337a249724fb89888db68f23e711bplars * set to QM_MODULES. 395f30b5d78d6337a249724fb89888db68f23e711bplars * 3. query_module(2) is successful for valid module name, which argument 405f30b5d78d6337a249724fb89888db68f23e711bplars * set to QM_DEPS. 415f30b5d78d6337a249724fb89888db68f23e711bplars * 4. query_module(2) is successful for valid module name, which argument 425f30b5d78d6337a249724fb89888db68f23e711bplars * set to QM_REFS. 435f30b5d78d6337a249724fb89888db68f23e711bplars * 5. query_module(2) is successful for valid module name, which argument 445f30b5d78d6337a249724fb89888db68f23e711bplars * set to QM_INFO. 455f30b5d78d6337a249724fb89888db68f23e711bplars * 6. query_module(2) is successful for valid module name, which argument 465f30b5d78d6337a249724fb89888db68f23e711bplars * set to QM_SYMBOLS. 474bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 485f30b5d78d6337a249724fb89888db68f23e711bplars * Setup: 495f30b5d78d6337a249724fb89888db68f23e711bplars * Setup signal handling. 505f30b5d78d6337a249724fb89888db68f23e711bplars * Test caller is superuser 515f30b5d78d6337a249724fb89888db68f23e711bplars * Initialize long module name 525f30b5d78d6337a249724fb89888db68f23e711bplars * Pause for SIGUSR1 if option specified. 534bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 545f30b5d78d6337a249724fb89888db68f23e711bplars * Test: 555f30b5d78d6337a249724fb89888db68f23e711bplars * Loop if the proper options are given. 565f30b5d78d6337a249724fb89888db68f23e711bplars * Execute system call 575f30b5d78d6337a249724fb89888db68f23e711bplars * Check return value and functionality, if success, 585f30b5d78d6337a249724fb89888db68f23e711bplars * Issue PASS message 595f30b5d78d6337a249724fb89888db68f23e711bplars * Otherwise, 605f30b5d78d6337a249724fb89888db68f23e711bplars * Issue FAIL message 614bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 625f30b5d78d6337a249724fb89888db68f23e711bplars * Cleanup: 635f30b5d78d6337a249724fb89888db68f23e711bplars * Print errno log and/or timing stats if options given 644bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 655f30b5d78d6337a249724fb89888db68f23e711bplars * USAGE: <for command-line> 665f30b5d78d6337a249724fb89888db68f23e711bplars * query_module01 [-c n] [-e] [-f] [-h] [-i n] [-I x] [-p] [-P x] [-t] 675f30b5d78d6337a249724fb89888db68f23e711bplars * where, -c n : Run n copies concurrently. 685f30b5d78d6337a249724fb89888db68f23e711bplars * -e : Turn on errno logging. 695f30b5d78d6337a249724fb89888db68f23e711bplars * -f : Turn off functional testing 705f30b5d78d6337a249724fb89888db68f23e711bplars * -h : Show help screen 715f30b5d78d6337a249724fb89888db68f23e711bplars * -i n : Execute test n times. 725f30b5d78d6337a249724fb89888db68f23e711bplars * -I x : Execute test for x seconds. 735f30b5d78d6337a249724fb89888db68f23e711bplars * -p : Pause for SIGUSR1 before starting 745f30b5d78d6337a249724fb89888db68f23e711bplars * -P x : Pause for x seconds between iterations. 755f30b5d78d6337a249724fb89888db68f23e711bplars * -t : Turn on syscall timing. 764bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 775f30b5d78d6337a249724fb89888db68f23e711bplars * RESTRICTIONS 784bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * -c option has no effect for this testcase, even if used allows only 795f30b5d78d6337a249724fb89888db68f23e711bplars * one instance to run at a time. 804bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 815f30b5d78d6337a249724fb89888db68f23e711bplars * CHANGES 825f30b5d78d6337a249724fb89888db68f23e711bplars * 835f30b5d78d6337a249724fb89888db68f23e711bplars * 12/03/02 Added "force" to insmod to ignore kernel version. 845f30b5d78d6337a249724fb89888db68f23e711bplars * -Robbie Williamson <robbiew@us.ibm.com> 854bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * 865f30b5d78d6337a249724fb89888db68f23e711bplars ****************************************************************/ 875f30b5d78d6337a249724fb89888db68f23e711bplars 885f30b5d78d6337a249724fb89888db68f23e711bplars#include <errno.h> 895f30b5d78d6337a249724fb89888db68f23e711bplars#include <pwd.h> 905f30b5d78d6337a249724fb89888db68f23e711bplars#include <sys/types.h> 91024988b73a0817c44be2a5a0675261c4425a3deasubrata_modak#include <unistd.h> 92024988b73a0817c44be2a5a0675261c4425a3deasubrata_modak#include <limits.h> 935f30b5d78d6337a249724fb89888db68f23e711bplars#include <asm/atomic.h> 945f30b5d78d6337a249724fb89888db68f23e711bplars#include <linux/module.h> 955f30b5d78d6337a249724fb89888db68f23e711bplars#include "test.h" 965f30b5d78d6337a249724fb89888db68f23e711bplars#include "usctest.h" 975f30b5d78d6337a249724fb89888db68f23e711bplars 984bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak#ifndef PAGE_SIZE 99024988b73a0817c44be2a5a0675261c4425a3deasubrata_modak#define PAGE_SIZE sysconf(_SC_PAGE_SIZE) 100024988b73a0817c44be2a5a0675261c4425a3deasubrata_modak#endif 101024988b73a0817c44be2a5a0675261c4425a3deasubrata_modak 1025f30b5d78d6337a249724fb89888db68f23e711bplars#define LONGMODNAMECHAR 'm' /* Arbitrarily selected */ 1035f30b5d78d6337a249724fb89888db68f23e711bplars#define MODNAMEMAX (PAGE_SIZE + 1) 1045f30b5d78d6337a249724fb89888db68f23e711bplars#define EXP_RET_VAL 0 1055f30b5d78d6337a249724fb89888db68f23e711bplars#define DUMMY_MOD "dummy_query_mod" 1065f30b5d78d6337a249724fb89888db68f23e711bplars#define DUMMY_MOD_DEP "dummy_query_mod_dep" 1075f30b5d78d6337a249724fb89888db68f23e711bplars#define QM_INVALID (QM_INFO + 100) 1085f30b5d78d6337a249724fb89888db68f23e711bplars 1095f30b5d78d6337a249724fb89888db68f23e711bplars/* Name of exported function in DUMMY_MOD */ 1105f30b5d78d6337a249724fb89888db68f23e711bplars#define EXP_FUNC_NAME "dummy_func_test" 1115f30b5d78d6337a249724fb89888db68f23e711bplars 1125f30b5d78d6337a249724fb89888db68f23e711bplarsextern int Tst_count; 1135f30b5d78d6337a249724fb89888db68f23e711bplars 1145f30b5d78d6337a249724fb89888db68f23e711bplarsstruct test_case_t { /* test case structure */ 1155f30b5d78d6337a249724fb89888db68f23e711bplars char *modname; 1165f30b5d78d6337a249724fb89888db68f23e711bplars int which; 1175f30b5d78d6337a249724fb89888db68f23e711bplars char *desc; 1185f30b5d78d6337a249724fb89888db68f23e711bplars int (*setup)(void); /* Individual setup routine */ 1195f30b5d78d6337a249724fb89888db68f23e711bplars void (*cleanup)(void); /* Individual cleanup routine */ 1205f30b5d78d6337a249724fb89888db68f23e711bplars}; 1215f30b5d78d6337a249724fb89888db68f23e711bplars 1225f30b5d78d6337a249724fb89888db68f23e711bplarschar *TCID = "query_module01"; 1235f30b5d78d6337a249724fb89888db68f23e711bplarsstatic char longmodname[MODNAMEMAX]; 1245f30b5d78d6337a249724fb89888db68f23e711bplarsstatic int testno; 1255f30b5d78d6337a249724fb89888db68f23e711bplarsstatic char out_buf[PAGE_SIZE]; 1265f30b5d78d6337a249724fb89888db68f23e711bplarsstatic size_t ret; 1275f30b5d78d6337a249724fb89888db68f23e711bplars 1285f30b5d78d6337a249724fb89888db68f23e711bplarsstatic int test_functionality(int, char *, size_t, size_t); 1295f30b5d78d6337a249724fb89888db68f23e711bplarsstatic void setup(void); 1305f30b5d78d6337a249724fb89888db68f23e711bplarsstatic void cleanup(void); 1315f30b5d78d6337a249724fb89888db68f23e711bplarsstatic int setup1(void); 1325f30b5d78d6337a249724fb89888db68f23e711bplarsstatic void cleanup1(void); 1335f30b5d78d6337a249724fb89888db68f23e711bplarsstatic int setup2(void); 1345f30b5d78d6337a249724fb89888db68f23e711bplarsstatic void cleanup2(void); 1355f30b5d78d6337a249724fb89888db68f23e711bplars 1365f30b5d78d6337a249724fb89888db68f23e711bplarsstatic struct test_case_t tdat[] = { 1375f30b5d78d6337a249724fb89888db68f23e711bplars { NULL, 0, "module name: NULL, which: 0", NULL, NULL}, 1385f30b5d78d6337a249724fb89888db68f23e711bplars 1394bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak { NULL, QM_MODULES, "NULL module name, which: QM_MODULES", 1405f30b5d78d6337a249724fb89888db68f23e711bplars setup1, cleanup1}, 1415f30b5d78d6337a249724fb89888db68f23e711bplars 1424bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak { DUMMY_MOD_DEP, QM_DEPS, "valid module name, which: QM_DEPS", 1435f30b5d78d6337a249724fb89888db68f23e711bplars setup2, cleanup2}, 1445f30b5d78d6337a249724fb89888db68f23e711bplars 1454bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak { DUMMY_MOD, QM_REFS, "valid module name, which: QM_REFS", 1465f30b5d78d6337a249724fb89888db68f23e711bplars setup2, cleanup2}, 1475f30b5d78d6337a249724fb89888db68f23e711bplars 1484bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak { DUMMY_MOD, QM_INFO, "valid module name, which: QM_INFO", 1495f30b5d78d6337a249724fb89888db68f23e711bplars setup1, cleanup1}, 1505f30b5d78d6337a249724fb89888db68f23e711bplars 1514bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak { DUMMY_MOD, QM_SYMBOLS, "valid module name, which: QM_SYMBOLS", 1525f30b5d78d6337a249724fb89888db68f23e711bplars setup1, cleanup1}, 1535f30b5d78d6337a249724fb89888db68f23e711bplars}; 1545f30b5d78d6337a249724fb89888db68f23e711bplars 1555f30b5d78d6337a249724fb89888db68f23e711bplarsint TST_TOTAL = sizeof(tdat) / sizeof(tdat[0]); 1565f30b5d78d6337a249724fb89888db68f23e711bplars 1575f30b5d78d6337a249724fb89888db68f23e711bplarsint 1585f30b5d78d6337a249724fb89888db68f23e711bplarsmain(int argc, char **argv) 1595f30b5d78d6337a249724fb89888db68f23e711bplars{ 1605f30b5d78d6337a249724fb89888db68f23e711bplars int lc; /* loop counter */ 1615f30b5d78d6337a249724fb89888db68f23e711bplars char *msg; /* message returned from parse_opts */ 1625f30b5d78d6337a249724fb89888db68f23e711bplars size_t buflen = sizeof(out_buf); 1635f30b5d78d6337a249724fb89888db68f23e711bplars 1645f30b5d78d6337a249724fb89888db68f23e711bplars /* parse standard options */ 165df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if ((msg = parse_opts(argc, argv, NULL, NULL)) != 1665f30b5d78d6337a249724fb89888db68f23e711bplars (char *)NULL) { 16753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 1685f30b5d78d6337a249724fb89888db68f23e711bplars } 1695f30b5d78d6337a249724fb89888db68f23e711bplars 170df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (STD_COPIES != 1) { 1715f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TINFO, "-c option has no effect for these testcases - " 1725f30b5d78d6337a249724fb89888db68f23e711bplars "doesn't allow running more than one instance " 1734bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak "at a time"); 1745f30b5d78d6337a249724fb89888db68f23e711bplars STD_COPIES = 1; 1755f30b5d78d6337a249724fb89888db68f23e711bplars } 1765f30b5d78d6337a249724fb89888db68f23e711bplars 1775f30b5d78d6337a249724fb89888db68f23e711bplars tst_tmpdir(); 1785f30b5d78d6337a249724fb89888db68f23e711bplars setup(); 1795f30b5d78d6337a249724fb89888db68f23e711bplars 1805f30b5d78d6337a249724fb89888db68f23e711bplars for (lc = 0; TEST_LOOPING(lc); lc++) { 1815f30b5d78d6337a249724fb89888db68f23e711bplars /* reset Tst_count in case we are looping */ 1825f30b5d78d6337a249724fb89888db68f23e711bplars Tst_count = 0; 1835f30b5d78d6337a249724fb89888db68f23e711bplars 1845f30b5d78d6337a249724fb89888db68f23e711bplars for (testno = 0; testno < TST_TOTAL; ++testno) { 1858fb1cdb0538640f295691929650408688537fb7fGarrett Cooper if ((tdat[testno].setup) && (tdat[testno].setup())) { 1865f30b5d78d6337a249724fb89888db68f23e711bplars /* setup() failed, skip this test */ 1875f30b5d78d6337a249724fb89888db68f23e711bplars continue; 1885f30b5d78d6337a249724fb89888db68f23e711bplars } 1895f30b5d78d6337a249724fb89888db68f23e711bplars 1905f30b5d78d6337a249724fb89888db68f23e711bplars TEST(query_module(tdat[testno].modname, 1915f30b5d78d6337a249724fb89888db68f23e711bplars tdat[testno].which, (void *)out_buf, buflen, 1925f30b5d78d6337a249724fb89888db68f23e711bplars &ret)); 1935f30b5d78d6337a249724fb89888db68f23e711bplars 194df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if ((TEST_RETURN == EXP_RET_VAL) && 1954bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak !test_functionality(tdat[testno].which, 1965f30b5d78d6337a249724fb89888db68f23e711bplars out_buf, buflen, ret) ) { 1975f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TPASS, "query_module() successful " 1985f30b5d78d6337a249724fb89888db68f23e711bplars "for %s", tdat[testno].desc); 1995f30b5d78d6337a249724fb89888db68f23e711bplars } else { 2005f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TFAIL, "query_module() failed for " 2015f30b5d78d6337a249724fb89888db68f23e711bplars "%s ; returned" 2025f30b5d78d6337a249724fb89888db68f23e711bplars " %d (expected %d), errno %d (expected" 2035f30b5d78d6337a249724fb89888db68f23e711bplars " 0)", tdat[testno].desc, 2045f30b5d78d6337a249724fb89888db68f23e711bplars TEST_RETURN, EXP_RET_VAL, TEST_ERRNO); 2055f30b5d78d6337a249724fb89888db68f23e711bplars } 206df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (tdat[testno].cleanup) { 2075f30b5d78d6337a249724fb89888db68f23e711bplars tdat[testno].cleanup(); 2085f30b5d78d6337a249724fb89888db68f23e711bplars } 2095f30b5d78d6337a249724fb89888db68f23e711bplars } 2105f30b5d78d6337a249724fb89888db68f23e711bplars } 2115f30b5d78d6337a249724fb89888db68f23e711bplars cleanup(); 21253740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_exit(); 2135f30b5d78d6337a249724fb89888db68f23e711bplars} 2145f30b5d78d6337a249724fb89888db68f23e711bplars 2155f30b5d78d6337a249724fb89888db68f23e711bplarsint 2165f30b5d78d6337a249724fb89888db68f23e711bplarstest_functionality(int which, char *buf, size_t bufsize, size_t ret) 2175f30b5d78d6337a249724fb89888db68f23e711bplars{ 2185f30b5d78d6337a249724fb89888db68f23e711bplars int i = 0; 2195f30b5d78d6337a249724fb89888db68f23e711bplars char *modname; 2205f30b5d78d6337a249724fb89888db68f23e711bplars unsigned long *vals; 2215f30b5d78d6337a249724fb89888db68f23e711bplars 2224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 2235f30b5d78d6337a249724fb89888db68f23e711bplars * Don't perform functional verification, if STD_FUNCTIONAL_TEST is 2244bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * turned off 2255f30b5d78d6337a249724fb89888db68f23e711bplars */ 226df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (STD_FUNCTIONAL_TEST == 0) { 2275f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 2285f30b5d78d6337a249724fb89888db68f23e711bplars } 2295f30b5d78d6337a249724fb89888db68f23e711bplars 2305f30b5d78d6337a249724fb89888db68f23e711bplars switch(which) { 2315f30b5d78d6337a249724fb89888db68f23e711bplars case 0: 2325f30b5d78d6337a249724fb89888db68f23e711bplars /* Always return SUCCESS */ 2335f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 2345f30b5d78d6337a249724fb89888db68f23e711bplars 2355f30b5d78d6337a249724fb89888db68f23e711bplars case QM_MODULES: 2365f30b5d78d6337a249724fb89888db68f23e711bplars case QM_DEPS: 2375f30b5d78d6337a249724fb89888db68f23e711bplars /* Return SUCCESS if found DUMMY_MOD entry */ 2385f30b5d78d6337a249724fb89888db68f23e711bplars modname = DUMMY_MOD; 2395f30b5d78d6337a249724fb89888db68f23e711bplars break; 2405f30b5d78d6337a249724fb89888db68f23e711bplars 2415f30b5d78d6337a249724fb89888db68f23e711bplars case QM_REFS: 2425f30b5d78d6337a249724fb89888db68f23e711bplars /* Return SUCCESS if found DUMMY_MOD_DEP entry */ 2435f30b5d78d6337a249724fb89888db68f23e711bplars modname = DUMMY_MOD_DEP; 2445f30b5d78d6337a249724fb89888db68f23e711bplars break; 2455f30b5d78d6337a249724fb89888db68f23e711bplars 2465f30b5d78d6337a249724fb89888db68f23e711bplars case QM_INFO: 2475f30b5d78d6337a249724fb89888db68f23e711bplars /* 2484bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * Since module is already loaded, flags should show 2494bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * MOD_RUNNING 2505f30b5d78d6337a249724fb89888db68f23e711bplars */ 251df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (((struct module_info *) buf) -> flags & 2525f30b5d78d6337a249724fb89888db68f23e711bplars MOD_RUNNING) { 2535f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 2545f30b5d78d6337a249724fb89888db68f23e711bplars } 2555f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 2565f30b5d78d6337a249724fb89888db68f23e711bplars 2575f30b5d78d6337a249724fb89888db68f23e711bplars case QM_SYMBOLS: 2585f30b5d78d6337a249724fb89888db68f23e711bplars vals = (unsigned long *)buf; 2595f30b5d78d6337a249724fb89888db68f23e711bplars 2604bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak /* 2615f30b5d78d6337a249724fb89888db68f23e711bplars * Find entry for atleast one symbol, checking for 2624bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak * EXP_FUNC_NAME symbol, if found return SUCCESS. 2635f30b5d78d6337a249724fb89888db68f23e711bplars */ 26453740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper for (i = 0; i < ret; i++, vals += 2) { 2655f30b5d78d6337a249724fb89888db68f23e711bplars 2665f30b5d78d6337a249724fb89888db68f23e711bplars /* buf + vals[1] - address of symbol name */ 267df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (!strcmp(buf + vals[1], EXP_FUNC_NAME)) { 2685f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 2695f30b5d78d6337a249724fb89888db68f23e711bplars } 2705f30b5d78d6337a249724fb89888db68f23e711bplars } 2715f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 2725f30b5d78d6337a249724fb89888db68f23e711bplars 2735f30b5d78d6337a249724fb89888db68f23e711bplars default: 2745f30b5d78d6337a249724fb89888db68f23e711bplars /* Unknown which type */ 2755f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 2765f30b5d78d6337a249724fb89888db68f23e711bplars } 2775f30b5d78d6337a249724fb89888db68f23e711bplars 2785f30b5d78d6337a249724fb89888db68f23e711bplars /* Return SUCCESS if found entry */ 279df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper for (i = 0; i != ret; i++) { 280df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (strcmp(buf, modname)) { 2815f30b5d78d6337a249724fb89888db68f23e711bplars buf += strlen(buf) + 1; 2825f30b5d78d6337a249724fb89888db68f23e711bplars } else{ 2835f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 2845f30b5d78d6337a249724fb89888db68f23e711bplars } 2855f30b5d78d6337a249724fb89888db68f23e711bplars } 2865f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 2875f30b5d78d6337a249724fb89888db68f23e711bplars 2885f30b5d78d6337a249724fb89888db68f23e711bplars} 2895f30b5d78d6337a249724fb89888db68f23e711bplars 2905f30b5d78d6337a249724fb89888db68f23e711bplars/* Insert a module of name mod */ 2915f30b5d78d6337a249724fb89888db68f23e711bplarsint 2925f30b5d78d6337a249724fb89888db68f23e711bplarsinsert_mod(char *mod) 2935f30b5d78d6337a249724fb89888db68f23e711bplars{ 2945f30b5d78d6337a249724fb89888db68f23e711bplars char cmd[80]; 295bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 296df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (sprintf(cmd, "cp `which %s.o` ./", mod) == -1) { 2975f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TBROK, "sprintf failed"); 2985f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 2995f30b5d78d6337a249724fb89888db68f23e711bplars } 3008fb1cdb0538640f295691929650408688537fb7fGarrett Cooper if (system(cmd) != 0) { 3015f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TBROK, "Failed to copy %s module", mod); 3025f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3035f30b5d78d6337a249724fb89888db68f23e711bplars } 304bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 3055f30b5d78d6337a249724fb89888db68f23e711bplars /* Should use force to ignore kernel version & insure loading */ 3065f30b5d78d6337a249724fb89888db68f23e711bplars /* -RW */ 307df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper /* if (sprintf(cmd, "insmod %s.o", mod) == -1) { */ 308df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (sprintf(cmd, "insmod --force -q %s.o >/dev/null 2>&1", mod) == -1) { 3095f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TBROK, "sprintf failed"); 3105f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3115f30b5d78d6337a249724fb89888db68f23e711bplars } 3128fb1cdb0538640f295691929650408688537fb7fGarrett Cooper if (system(cmd) != 0) { 3135f30b5d78d6337a249724fb89888db68f23e711bplars tst_resm(TBROK, "Failed to load %s module", mod); 3145f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3155f30b5d78d6337a249724fb89888db68f23e711bplars } 3165f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 3175f30b5d78d6337a249724fb89888db68f23e711bplars} 3185f30b5d78d6337a249724fb89888db68f23e711bplars 3195f30b5d78d6337a249724fb89888db68f23e711bplarsint 3205f30b5d78d6337a249724fb89888db68f23e711bplarssetup1(void) 3215f30b5d78d6337a249724fb89888db68f23e711bplars{ 322df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (insert_mod(DUMMY_MOD)) { 3235f30b5d78d6337a249724fb89888db68f23e711bplars /* Failed */ 3245f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3255f30b5d78d6337a249724fb89888db68f23e711bplars } else { 3265f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 3275f30b5d78d6337a249724fb89888db68f23e711bplars } 3285f30b5d78d6337a249724fb89888db68f23e711bplars} 3295f30b5d78d6337a249724fb89888db68f23e711bplars 3305f30b5d78d6337a249724fb89888db68f23e711bplarsint 3315f30b5d78d6337a249724fb89888db68f23e711bplarssetup2(void) 3325f30b5d78d6337a249724fb89888db68f23e711bplars{ 333df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (insert_mod(DUMMY_MOD)) { 3345f30b5d78d6337a249724fb89888db68f23e711bplars /* Failed */ 3355f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3365f30b5d78d6337a249724fb89888db68f23e711bplars } 337df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (insert_mod(DUMMY_MOD_DEP)) { 3385f30b5d78d6337a249724fb89888db68f23e711bplars /* Falied to load DUMMY_MOD_DEP, unload DUMMY_MOD */ 3395f30b5d78d6337a249724fb89888db68f23e711bplars cleanup1(); 3405f30b5d78d6337a249724fb89888db68f23e711bplars return 1; 3415f30b5d78d6337a249724fb89888db68f23e711bplars } 3425f30b5d78d6337a249724fb89888db68f23e711bplars return 0; 3435f30b5d78d6337a249724fb89888db68f23e711bplars} 3445f30b5d78d6337a249724fb89888db68f23e711bplars 3455f30b5d78d6337a249724fb89888db68f23e711bplarsvoid 3465f30b5d78d6337a249724fb89888db68f23e711bplarscleanup1(void) 3475f30b5d78d6337a249724fb89888db68f23e711bplars{ 3485f30b5d78d6337a249724fb89888db68f23e711bplars /* Remove the loadable module - DUMMY_MOD */ 349df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (system("rmmod "DUMMY_MOD) != 0) { 3504bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_brkm(TBROK, cleanup, "Failed to unload module %s", 3515f30b5d78d6337a249724fb89888db68f23e711bplars DUMMY_MOD); 3525f30b5d78d6337a249724fb89888db68f23e711bplars } 3535f30b5d78d6337a249724fb89888db68f23e711bplars} 3545f30b5d78d6337a249724fb89888db68f23e711bplars 3555f30b5d78d6337a249724fb89888db68f23e711bplarsvoid 3565f30b5d78d6337a249724fb89888db68f23e711bplarscleanup2(void) 3575f30b5d78d6337a249724fb89888db68f23e711bplars{ 3585f30b5d78d6337a249724fb89888db68f23e711bplars /* Remove the loadable module - DUMMY_MOD_DEP */ 359df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper if (system("rmmod "DUMMY_MOD_DEP) != 0) { 3604bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak tst_brkm(TBROK, cleanup, "Failed to unload module %s", 3615f30b5d78d6337a249724fb89888db68f23e711bplars DUMMY_MOD_DEP); 3625f30b5d78d6337a249724fb89888db68f23e711bplars } 3635f30b5d78d6337a249724fb89888db68f23e711bplars /* Remove the loadable module - DUMMY_MOD */ 3645f30b5d78d6337a249724fb89888db68f23e711bplars cleanup1(); 3655f30b5d78d6337a249724fb89888db68f23e711bplars} 3665f30b5d78d6337a249724fb89888db68f23e711bplars 3675f30b5d78d6337a249724fb89888db68f23e711bplars/* 3685f30b5d78d6337a249724fb89888db68f23e711bplars * setup() 3695f30b5d78d6337a249724fb89888db68f23e711bplars * performs all ONE TIME setup for this test 3705f30b5d78d6337a249724fb89888db68f23e711bplars */ 3715f30b5d78d6337a249724fb89888db68f23e711bplarsvoid 3725f30b5d78d6337a249724fb89888db68f23e711bplarssetup(void) 3735f30b5d78d6337a249724fb89888db68f23e711bplars{ 3742c28215423293e443469a07ae7011135d058b671Garrett Cooper 3755f30b5d78d6337a249724fb89888db68f23e711bplars tst_sig(FORK, DEF_HANDLER, cleanup); 3765f30b5d78d6337a249724fb89888db68f23e711bplars 37753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_require_root(NULL); 3785f30b5d78d6337a249724fb89888db68f23e711bplars 3795f30b5d78d6337a249724fb89888db68f23e711bplars if (tst_kvercmp(2,5,48) >= 0) 38053740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TCONF, NULL, "This test will not work on " 3815f30b5d78d6337a249724fb89888db68f23e711bplars "kernels after 2.5.48"); 3825f30b5d78d6337a249724fb89888db68f23e711bplars 3835f30b5d78d6337a249724fb89888db68f23e711bplars /* Initialize longmodname to LONGMODNAMECHAR character */ 3845f30b5d78d6337a249724fb89888db68f23e711bplars memset(longmodname, LONGMODNAMECHAR, MODNAMEMAX - 1); 3855f30b5d78d6337a249724fb89888db68f23e711bplars 3865f30b5d78d6337a249724fb89888db68f23e711bplars /* Pause if that option was specified 3875f30b5d78d6337a249724fb89888db68f23e711bplars * TEST_PAUSE contains the code to fork the test with the -c option. 3885f30b5d78d6337a249724fb89888db68f23e711bplars */ 3895f30b5d78d6337a249724fb89888db68f23e711bplars TEST_PAUSE; 3905f30b5d78d6337a249724fb89888db68f23e711bplars} 3915f30b5d78d6337a249724fb89888db68f23e711bplars 3925f30b5d78d6337a249724fb89888db68f23e711bplars/* 3935f30b5d78d6337a249724fb89888db68f23e711bplars * cleanup() 3945f30b5d78d6337a249724fb89888db68f23e711bplars * performs all ONE TIME cleanup for this test at 3955f30b5d78d6337a249724fb89888db68f23e711bplars * completion or premature exit 3965f30b5d78d6337a249724fb89888db68f23e711bplars */ 3975f30b5d78d6337a249724fb89888db68f23e711bplarsvoid 3985f30b5d78d6337a249724fb89888db68f23e711bplarscleanup(void) 3995f30b5d78d6337a249724fb89888db68f23e711bplars{ 4005f30b5d78d6337a249724fb89888db68f23e711bplars /* 4015f30b5d78d6337a249724fb89888db68f23e711bplars * print timing stats if that option was specified. 4025f30b5d78d6337a249724fb89888db68f23e711bplars * print errno log if that option was specified. 4035f30b5d78d6337a249724fb89888db68f23e711bplars */ 4045f30b5d78d6337a249724fb89888db68f23e711bplars 4055f30b5d78d6337a249724fb89888db68f23e711bplars TEST_CLEANUP; 4065f30b5d78d6337a249724fb89888db68f23e711bplars tst_rmdir(); 4072c28215423293e443469a07ae7011135d058b671Garrett Cooper}