t_builtin.c revision 302408
1139825Simp/* $NetBSD: t_builtin.c,v 1.2 2010/11/03 16:10:23 christos Exp $ */ 277957Sbenno 377957Sbenno/*- 477957Sbenno * Copyright (c) 2010 The NetBSD Foundation, Inc. All rights reserved. 577957Sbenno * 677957Sbenno * Redistribution and use in source and binary forms, with or without 777957Sbenno * modification, are permitted provided that the following conditions 877957Sbenno * are met: 977957Sbenno * 1. Redistributions of source code must retain the above copyright 1077957Sbenno * notice, this list of conditions and the following disclaimer. 1177957Sbenno * 2. Redistributions in binary form must reproduce the above copyright 1277957Sbenno * notice, this list of conditions and the following disclaimer in the 1377957Sbenno * documentation and/or other materials provided with the distribution. 1477957Sbenno * 1577957Sbenno * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 1677957Sbenno * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 1777957Sbenno * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1877957Sbenno * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1977957Sbenno * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 2077957Sbenno * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2177957Sbenno * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 2277957Sbenno * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2377957Sbenno * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2477957Sbenno * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2577957Sbenno * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2677957Sbenno * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2777957Sbenno */ 2877957Sbenno 2977957Sbenno#include <sys/types.h> 3077957Sbenno#include <sys/module.h> 3177957Sbenno#include <sys/mount.h> 3277957Sbenno 3377957Sbenno#include <atf-c.h> 3477957Sbenno#include <fcntl.h> 3577957Sbenno#include <stdbool.h> 3677957Sbenno 3777957Sbenno#include <miscfs/kernfs/kernfs.h> 38105014Smike 39105014Smike#include <rump/rump.h> 4077957Sbenno#include <rump/rump_syscalls.h> 4177957Sbenno 42109478Sgrehan#include "../h_macros.h" 4377957Sbenno 44105014Smike#define MYMP "/mnt" 4577957Sbenno#define HZFILE MYMP "/hz" 4677957Sbenno 4777957Sbennostatic char kernfs[] = "kernfs"; 4877957Sbenno 49105014Smikestatic bool 5077957Sbennocheck_kernfs(void) 51105014Smike{ 5277957Sbenno char buf[16]; 5377957Sbenno bool rv = true; 54 int fd; 55 56 fd = rump_sys_open(HZFILE, O_RDONLY); 57 if (fd == -1) 58 return false; 59 if (rump_sys_read(fd, buf, sizeof(buf)) < 1) 60 rv = false; 61 RL(rump_sys_close(fd)); 62 63 return rv; 64} 65 66ATF_TC(disable); 67ATF_TC_HEAD(disable, tc) 68{ 69 70 atf_tc_set_md_var(tc, "descr", "Tests that builtin modules can " 71 "be disabled"); 72} 73 74ATF_TC_BODY(disable, tc) 75{ 76 77 rump_init(); 78 RL(rump_sys_mkdir(MYMP, 0777)); 79 RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 80 ATF_REQUIRE(check_kernfs()); 81 RL(rump_sys_unmount(MYMP, 0)); 82 RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 83} 84 85ATF_TC(noauto); 86ATF_TC_HEAD(noauto, tc) 87{ 88 atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 89 "will not autoload"); 90} 91 92ATF_TC_BODY(noauto, tc) 93{ 94 95 rump_init(); 96 RL(rump_sys_mkdir(MYMP, 0777)); 97 98 RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 99 100 ATF_REQUIRE_ERRNO(ENODEV, 101 rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0) == -1); 102} 103 104ATF_TC(forcereload); 105ATF_TC_HEAD(forcereload, tc) 106{ 107 atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 108 "can be force-reloaded"); 109} 110 111ATF_TC_BODY(forcereload, tc) 112{ 113 struct modctl_load mod; 114 115 rump_init(); 116 RL(rump_sys_mkdir(MYMP, 0777)); 117 118 RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 119 ATF_REQUIRE_ERRNO(ENODEV, 120 rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0) == -1); 121 122 memset(&mod, 0, sizeof(mod)); 123 mod.ml_filename = kernfs; 124 mod.ml_flags = MODCTL_LOAD_FORCE; 125 126 RL(rump_sys_modctl(MODCTL_LOAD, &mod)); 127 128 RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 129 ATF_REQUIRE(check_kernfs()); 130 RL(rump_sys_unmount(MYMP, 0)); 131} 132 133ATF_TC(disabledstat); 134ATF_TC_HEAD(disabledstat, tc) 135{ 136 atf_tc_set_md_var(tc, "descr", "Tests that disabled builtin modules " 137 "show up in modstat with refcount -1"); 138} 139 140ATF_TC_BODY(disabledstat, tc) 141{ 142 struct modstat ms[128]; 143 struct iovec iov; 144 size_t i; 145 bool found = false; 146 147 rump_init(); 148 RL(rump_sys_mkdir(MYMP, 0777)); 149 150 RL(rump_sys_modctl(MODCTL_UNLOAD, kernfs)); 151 152 iov.iov_base = ms; 153 iov.iov_len = sizeof(ms); 154 RL(rump_sys_modctl(MODCTL_STAT, &iov)); 155 156 for (i = 0; i < __arraycount(ms); i++) { 157 if (strcmp(ms[i].ms_name, kernfs) == 0) { 158 ATF_REQUIRE_EQ(ms[i].ms_refcnt, (u_int)-1); 159 found = 1; 160 break; 161 } 162 } 163 ATF_REQUIRE(found); 164} 165 166ATF_TC(busydisable); 167ATF_TC_HEAD(busydisable, tc) 168{ 169 atf_tc_set_md_var(tc, "descr", "Tests that busy builtin modules " 170 "cannot be disabled"); 171} 172 173ATF_TC_BODY(busydisable, tc) 174{ 175 176 rump_init(); 177 RL(rump_sys_mkdir(MYMP, 0777)); 178 RL(rump_sys_mount(MOUNT_KERNFS, MYMP, 0, NULL, 0)); 179 ATF_REQUIRE(check_kernfs()); 180 ATF_REQUIRE_ERRNO(EBUSY, 181 rump_sys_modctl(MODCTL_UNLOAD, kernfs) == -1); 182} 183 184ATF_TP_ADD_TCS(tp) 185{ 186 187 ATF_TP_ADD_TC(tp, disable); 188 ATF_TP_ADD_TC(tp, noauto); 189 ATF_TP_ADD_TC(tp, forcereload); 190 ATF_TP_ADD_TC(tp, disabledstat); 191 ATF_TP_ADD_TC(tp, busydisable); 192 193 return atf_no_error(); 194} 195