xref: /netbsd-src/tests/fs/puffs/t_basic.c (revision c54cb81102ced2313cb40993fe05548aca9933a1)
1*c54cb811Schristos /*	$NetBSD: t_basic.c,v 1.14 2017/01/13 21:30:40 christos Exp $	*/
281a57dd0Spooka 
381a57dd0Spooka #include <sys/types.h>
481a57dd0Spooka #include <sys/mount.h>
581a57dd0Spooka #include <sys/socket.h>
681a57dd0Spooka 
781a57dd0Spooka #include <assert.h>
881a57dd0Spooka #include <atf-c.h>
981a57dd0Spooka #include <err.h>
1081a57dd0Spooka #include <errno.h>
1181a57dd0Spooka #include <fcntl.h>
125544227eSpooka #include <pthread.h>
1381a57dd0Spooka #include <puffs.h>
14a4360455Spooka #include <puffsdump.h>
1581a57dd0Spooka #include <stdio.h>
1681a57dd0Spooka #include <unistd.h>
1781a57dd0Spooka #include <string.h>
1881a57dd0Spooka #include <stdlib.h>
1981a57dd0Spooka 
2081a57dd0Spooka #include <rump/rump.h>
2181a57dd0Spooka #include <rump/rump_syscalls.h>
2281a57dd0Spooka 
23*c54cb811Schristos #include "h_macros.h"
24272fb16eSpooka #include "../common/h_fsmacros.h"
25a4360455Spooka 
26a4360455Spooka /*
27a4360455Spooka  * Do a synchronous operation.  When this returns, all FAF operations
28a4360455Spooka  * have at least been delivered to the file system.
29a4360455Spooka  *
30a4360455Spooka  * XXX: is this really good enough considering puffs(9)-issued
31a4360455Spooka  * callback operations?
32a4360455Spooka  */
33a4360455Spooka static void
syncbar(const char * fs)34a4360455Spooka syncbar(const char *fs)
35a4360455Spooka {
36a4360455Spooka 	struct statvfs svb;
37a4360455Spooka 
38272fb16eSpooka 	if (rump_sys_statvfs1(fs, &svb, ST_WAIT) == -1)
39272fb16eSpooka 		atf_tc_fail_errno("statvfs");
40a4360455Spooka }
41a4360455Spooka 
42370326ddSplunky #ifdef PUFFSDUMP
43373c282cSpooka static void __unused
dumpopcount(struct puffstestargs * args)44272fb16eSpooka dumpopcount(struct puffstestargs *args)
45a4360455Spooka {
46a4360455Spooka 	size_t i;
47a4360455Spooka 
48a4360455Spooka 	printf("VFS OPS:\n");
49a4360455Spooka 	for (i = 0; i < MIN(puffsdump_vfsop_count, PUFFS_VFS_MAX); i++) {
50a4360455Spooka 		printf("\t%s: %d\n",
51272fb16eSpooka 		    puffsdump_vfsop_revmap[i], args->pta_vfs_toserv_ops[i]);
52a4360455Spooka 	}
53a4360455Spooka 
54a4360455Spooka 	printf("VN OPS:\n");
55a4360455Spooka 	for (i = 0; i < MIN(puffsdump_vnop_count, PUFFS_VN_MAX); i++) {
56a4360455Spooka 		printf("\t%s: %d\n",
57272fb16eSpooka 		    puffsdump_vnop_revmap[i], args->pta_vn_toserv_ops[i]);
58a4360455Spooka 	}
59a4360455Spooka }
60370326ddSplunky #endif
6181a57dd0Spooka 
625544227eSpooka ATF_TC(mount);
ATF_TC_HEAD(mount,tc)635544227eSpooka ATF_TC_HEAD(mount, tc)
645544227eSpooka {
655544227eSpooka 
665544227eSpooka 	atf_tc_set_md_var(tc, "descr", "puffs+dtfs un/mount test");
675544227eSpooka }
685544227eSpooka 
ATF_TC_BODY(mount,tc)695544227eSpooka ATF_TC_BODY(mount, tc)
705544227eSpooka {
71272fb16eSpooka 	void *args;
725544227eSpooka 
73272fb16eSpooka 	FSTEST_CONSTRUCTOR(tc, puffs, args);
74272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
755544227eSpooka }
765544227eSpooka 
775544227eSpooka ATF_TC(root_reg);
ATF_TC_HEAD(root_reg,tc)785544227eSpooka ATF_TC_HEAD(root_reg, tc)
795544227eSpooka {
805544227eSpooka 	atf_tc_set_md_var(tc, "descr", "root is a regular file");
815544227eSpooka }
825544227eSpooka 
83272fb16eSpooka #define MAKEOPTS(...) \
84272fb16eSpooka     char *theopts[] = {NULL, "-s", __VA_ARGS__, "dtfs", "n/a", NULL}
85272fb16eSpooka 
ATF_TC_BODY(root_reg,tc)865544227eSpooka ATF_TC_BODY(root_reg, tc)
875544227eSpooka {
88272fb16eSpooka 	MAKEOPTS("-r", "reg");
89272fb16eSpooka 	void *args;
905544227eSpooka 	int fd, rv;
915544227eSpooka 
92272fb16eSpooka 	FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts);
935544227eSpooka 
94272fb16eSpooka 	fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR);
955544227eSpooka 	if (fd == -1)
965544227eSpooka 		atf_tc_fail_errno("open root");
975544227eSpooka 	if (rump_sys_write(fd, &fd, sizeof(fd)) != sizeof(fd))
985544227eSpooka 		atf_tc_fail_errno("write to root");
99272fb16eSpooka 	rv = rump_sys_mkdir(FSTEST_MNTNAME "/test", 0777);
1005544227eSpooka 	ATF_REQUIRE(errno == ENOTDIR);
1015544227eSpooka 	ATF_REQUIRE(rv == -1);
1025544227eSpooka 	rump_sys_close(fd);
1035544227eSpooka 
104272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
1055544227eSpooka }
1065544227eSpooka 
1075544227eSpooka ATF_TC(root_lnk);
ATF_TC_HEAD(root_lnk,tc)1085544227eSpooka ATF_TC_HEAD(root_lnk, tc)
1095544227eSpooka {
1105544227eSpooka 
1115544227eSpooka 	atf_tc_set_md_var(tc, "descr", "root is a symbolic link");
1125544227eSpooka }
1135544227eSpooka 
1145544227eSpooka #define LINKSTR "/path/to/nowhere"
ATF_TC_BODY(root_lnk,tc)1155544227eSpooka ATF_TC_BODY(root_lnk, tc)
1165544227eSpooka {
117272fb16eSpooka 	MAKEOPTS("-r", "lnk " LINKSTR);
118272fb16eSpooka 	void *args;
1195544227eSpooka 	char buf[PATH_MAX];
1205544227eSpooka 	ssize_t len;
1215544227eSpooka 
122272fb16eSpooka 	FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts);
1235544227eSpooka 
124272fb16eSpooka 	if ((len = rump_sys_readlink(FSTEST_MNTNAME, buf, sizeof(buf)-1)) == -1)
1255544227eSpooka 		atf_tc_fail_errno("readlink");
1265544227eSpooka 	buf[len] = '\0';
1275544227eSpooka 
1285544227eSpooka 	ATF_REQUIRE_STREQ(buf, LINKSTR);
1295544227eSpooka 
1305544227eSpooka #if 0 /* XXX: unmount uses FOLLOW */
1315544227eSpooka 	if (rump_sys_unmount("/mp", 0) == -1)
1325544227eSpooka 		atf_tc_fail_errno("unmount");
1335544227eSpooka #endif
1345544227eSpooka }
1355544227eSpooka 
1365544227eSpooka ATF_TC(root_fifo);
ATF_TC_HEAD(root_fifo,tc)1375544227eSpooka ATF_TC_HEAD(root_fifo, tc)
1385544227eSpooka {
1395544227eSpooka 
1405544227eSpooka 	atf_tc_set_md_var(tc, "descr", "root is a symbolic link");
1415544227eSpooka }
1425544227eSpooka 
1435544227eSpooka #define MAGICSTR "nakit ja muusiperunat maustevoilla"
1445544227eSpooka static void *
dofifow(void * arg)1455544227eSpooka dofifow(void *arg)
1465544227eSpooka {
1475544227eSpooka 	int fd = (int)(uintptr_t)arg;
1485544227eSpooka 	char buf[512];
1495544227eSpooka 
1505544227eSpooka 	printf("writing\n");
1515544227eSpooka 	strcpy(buf, MAGICSTR);
1525544227eSpooka 	if (rump_sys_write(fd, buf, strlen(buf)+1) != strlen(buf)+1)
1535544227eSpooka 		atf_tc_fail_errno("write to fifo");
1545544227eSpooka 
1555544227eSpooka 	return NULL;
1565544227eSpooka }
1575544227eSpooka 
ATF_TC_BODY(root_fifo,tc)1585544227eSpooka ATF_TC_BODY(root_fifo, tc)
1595544227eSpooka {
160272fb16eSpooka 	MAKEOPTS("-r", "fifo");
161272fb16eSpooka 	void *args;
1625544227eSpooka 	pthread_t pt;
1635544227eSpooka 	char buf[512];
1645544227eSpooka 	int fd;
1655544227eSpooka 
166272fb16eSpooka 	FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts);
167272fb16eSpooka 
168272fb16eSpooka 	fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR);
1695544227eSpooka 	if (fd == -1)
1705544227eSpooka 		atf_tc_fail_errno("open fifo");
1715544227eSpooka 
1725544227eSpooka 	pthread_create(&pt, NULL, dofifow, (void *)(uintptr_t)fd);
1735544227eSpooka 
1745544227eSpooka 	memset(buf, 0, sizeof(buf));
1755544227eSpooka 	if (rump_sys_read(fd, buf, sizeof(buf)) == -1)
1765544227eSpooka 		atf_tc_fail_errno("read fifo");
1775544227eSpooka 
1785544227eSpooka 	ATF_REQUIRE_STREQ(buf, MAGICSTR);
1795544227eSpooka 	rump_sys_close(fd);
180272fb16eSpooka 
181272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
1825544227eSpooka }
1835544227eSpooka 
1845544227eSpooka ATF_TC(root_chrdev);
ATF_TC_HEAD(root_chrdev,tc)1855544227eSpooka ATF_TC_HEAD(root_chrdev, tc)
1865544227eSpooka {
1875544227eSpooka 
1885544227eSpooka 	atf_tc_set_md_var(tc, "descr", "root is /dev/null");
1895544227eSpooka }
1905544227eSpooka 
ATF_TC_BODY(root_chrdev,tc)1915544227eSpooka ATF_TC_BODY(root_chrdev, tc)
1925544227eSpooka {
1939285c5ccSpooka 	MAKEOPTS("-r", "chr 2 2");
194272fb16eSpooka 	void *args;
1955544227eSpooka 	ssize_t rv;
1965544227eSpooka 	char buf[512];
1975544227eSpooka 	int fd;
1985544227eSpooka 
199272fb16eSpooka 	FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts);
200272fb16eSpooka 
201272fb16eSpooka 	fd = rump_sys_open(FSTEST_MNTNAME, O_RDWR);
2025544227eSpooka 	if (fd == -1)
2035544227eSpooka 		atf_tc_fail_errno("open null");
2045544227eSpooka 
2055544227eSpooka 	rv = rump_sys_write(fd, buf, sizeof(buf));
2065544227eSpooka 	ATF_REQUIRE(rv == sizeof(buf));
2075544227eSpooka 
2085544227eSpooka 	rv = rump_sys_read(fd, buf, sizeof(buf));
2095544227eSpooka 	ATF_REQUIRE(rv == 0);
2105544227eSpooka 
2115544227eSpooka 	rump_sys_close(fd);
212272fb16eSpooka 
213272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
21481a57dd0Spooka }
21581a57dd0Spooka 
216a4360455Spooka /*
217a4360455Spooka  * Inactive/reclaim tests
218a4360455Spooka  */
219a4360455Spooka 
220a4360455Spooka ATF_TC(inactive_basic);
ATF_TC_HEAD(inactive_basic,tc)221a4360455Spooka ATF_TC_HEAD(inactive_basic, tc)
222a4360455Spooka {
223a4360455Spooka 
224a4360455Spooka 	atf_tc_set_md_var(tc, "descr", "inactive gets called");
225a4360455Spooka }
226a4360455Spooka 
ATF_TC_BODY(inactive_basic,tc)227a4360455Spooka ATF_TC_BODY(inactive_basic, tc)
228a4360455Spooka {
229272fb16eSpooka 	struct puffstestargs *pargs;
230272fb16eSpooka 	void *args;
231a4360455Spooka 	int fd;
232a4360455Spooka 
233272fb16eSpooka 	FSTEST_CONSTRUCTOR(tc, puffs, args);
234272fb16eSpooka 	FSTEST_ENTER();
235272fb16eSpooka 	pargs = args;
236272fb16eSpooka 
237272fb16eSpooka 	fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777);
238a4360455Spooka 	if (fd == -1)
239a4360455Spooka 		atf_tc_fail_errno("create");
240a4360455Spooka 
241272fb16eSpooka 	/* none yet */
242272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0);
243a4360455Spooka 
244a4360455Spooka 	rump_sys_close(fd);
245a4360455Spooka 
246272fb16eSpooka 	/* one for file */
247272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 1);
248a4360455Spooka 
249272fb16eSpooka 	FSTEST_EXIT();
250a4360455Spooka 
251272fb16eSpooka 	/* another for the mountpoint */
252272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 2);
253272fb16eSpooka 
254272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
255a4360455Spooka }
256a4360455Spooka 
257a4360455Spooka ATF_TC(inactive_reclaim);
ATF_TC_HEAD(inactive_reclaim,tc)258a4360455Spooka ATF_TC_HEAD(inactive_reclaim, tc)
259a4360455Spooka {
260a4360455Spooka 
261a4360455Spooka 	atf_tc_set_md_var(tc, "descr", "inactive/reclaim gets called");
262a4360455Spooka }
263a4360455Spooka 
ATF_TC_BODY(inactive_reclaim,tc)264a4360455Spooka ATF_TC_BODY(inactive_reclaim, tc)
265a4360455Spooka {
266272fb16eSpooka 	struct puffstestargs *pargs;
267272fb16eSpooka 	void *args;
268a4360455Spooka 	int fd;
269a4360455Spooka 
270272fb16eSpooka 	FSTEST_CONSTRUCTOR(tc, puffs, args);
271272fb16eSpooka 	FSTEST_ENTER();
272272fb16eSpooka 	pargs = args;
273272fb16eSpooka 
274272fb16eSpooka 	fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777);
275a4360455Spooka 	if (fd == -1)
276a4360455Spooka 		atf_tc_fail_errno("create");
277a4360455Spooka 
278272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0);
279a4360455Spooka 
280272fb16eSpooka 	if (rump_sys_unlink("file") == -1)
281a4360455Spooka 		atf_tc_fail_errno("remove");
282a4360455Spooka 
283272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE], 0);
284272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0);
285a4360455Spooka 
286a4360455Spooka 	rump_sys_close(fd);
287272fb16eSpooka 	syncbar(FSTEST_MNTNAME);
288a4360455Spooka 
289f3e32599Shannken 	ATF_REQUIRE(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE] > 0);
290272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1);
291a4360455Spooka 
292272fb16eSpooka 	FSTEST_EXIT();
293272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
294a4360455Spooka }
295a4360455Spooka 
296a4360455Spooka ATF_TC(reclaim_hardlink);
ATF_TC_HEAD(reclaim_hardlink,tc)297a4360455Spooka ATF_TC_HEAD(reclaim_hardlink, tc)
298a4360455Spooka {
299a4360455Spooka 
300a4360455Spooka 	atf_tc_set_md_var(tc, "descr", "reclaim gets called only after "
301a4360455Spooka 	    "final link is gone");
302a4360455Spooka }
303a4360455Spooka 
ATF_TC_BODY(reclaim_hardlink,tc)304a4360455Spooka ATF_TC_BODY(reclaim_hardlink, tc)
305a4360455Spooka {
306272fb16eSpooka 	struct puffstestargs *pargs;
307272fb16eSpooka 	void *args;
308a4360455Spooka 	int fd;
309a4360455Spooka 	int ianow;
310a4360455Spooka 
311272fb16eSpooka 	FSTEST_CONSTRUCTOR(tc, puffs, args);
312272fb16eSpooka 	FSTEST_ENTER();
313272fb16eSpooka 	pargs = args;
314272fb16eSpooka 
315272fb16eSpooka 	fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777);
316a4360455Spooka 	if (fd == -1)
317a4360455Spooka 		atf_tc_fail_errno("create");
318a4360455Spooka 
319272fb16eSpooka 	if (rump_sys_link("file", "anotherfile") == -1)
320a4360455Spooka 		atf_tc_fail_errno("create link");
321a4360455Spooka 	rump_sys_close(fd);
322a4360455Spooka 
323272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0);
324a4360455Spooka 
325a4360455Spooka 	/* unlink first hardlink */
326272fb16eSpooka 	if (rump_sys_unlink("file") == -1)
327a4360455Spooka 		atf_tc_fail_errno("unlink 1");
328a4360455Spooka 
329272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0);
330272fb16eSpooka 	ianow = pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE];
331a4360455Spooka 
332a4360455Spooka 	/* unlink second hardlink */
333272fb16eSpooka 	if (rump_sys_unlink("anotherfile") == -1)
334a4360455Spooka 		atf_tc_fail_errno("unlink 2");
335a4360455Spooka 
336272fb16eSpooka 	syncbar(FSTEST_MNTNAME);
337a4360455Spooka 
338272fb16eSpooka 	ATF_REQUIRE(ianow < pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE]);
339272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1);
340a4360455Spooka 
341272fb16eSpooka 	FSTEST_EXIT();
342272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
343a4360455Spooka }
344a4360455Spooka 
345a4360455Spooka ATF_TC(unlink_accessible);
ATF_TC_HEAD(unlink_accessible,tc)346a4360455Spooka ATF_TC_HEAD(unlink_accessible, tc)
347a4360455Spooka {
348a4360455Spooka 
349a4360455Spooka 	atf_tc_set_md_var(tc, "descr", "open file is accessible after "
350a4360455Spooka 	    "having been unlinked");
351a4360455Spooka }
352a4360455Spooka 
ATF_TC_BODY(unlink_accessible,tc)353a4360455Spooka ATF_TC_BODY(unlink_accessible, tc)
354a4360455Spooka {
355272fb16eSpooka 	MAKEOPTS("-i", "-o", "nopagecache");
356272fb16eSpooka 	struct puffstestargs *pargs;
357272fb16eSpooka 	void *args;
358a4360455Spooka 	char buf[512];
359a4360455Spooka 	int fd, ianow;
360a4360455Spooka 
361a4360455Spooka 	assert(sizeof(buf) > sizeof(MAGICSTR));
362a4360455Spooka 
363272fb16eSpooka 	FSTEST_CONSTRUCTOR_FSPRIV(tc, puffs, args, theopts);
364272fb16eSpooka 	FSTEST_ENTER();
365272fb16eSpooka 	pargs = args;
366272fb16eSpooka 
367272fb16eSpooka 	fd = rump_sys_open("file", O_CREAT | O_RDWR, 0777);
368a4360455Spooka 	if (fd == -1)
369a4360455Spooka 		atf_tc_fail_errno("create");
370a4360455Spooka 
371a4360455Spooka 	if (rump_sys_write(fd, MAGICSTR, sizeof(MAGICSTR)) != sizeof(MAGICSTR))
372a4360455Spooka 		atf_tc_fail_errno("write");
373272fb16eSpooka 	if (rump_sys_unlink("file") == -1)
374a4360455Spooka 		atf_tc_fail_errno("unlink");
375a4360455Spooka 
376272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 0);
377272fb16eSpooka 	ianow = pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE];
378a4360455Spooka 
379a4360455Spooka 	if (rump_sys_pread(fd, buf, sizeof(buf), 0) == -1)
380a4360455Spooka 		atf_tc_fail_errno("read");
381a4360455Spooka 	rump_sys_close(fd);
382a4360455Spooka 
383272fb16eSpooka 	syncbar(FSTEST_MNTNAME);
384a4360455Spooka 
385272fb16eSpooka 	ATF_REQUIRE_EQ(pargs->pta_vn_toserv_ops[PUFFS_VN_RECLAIM], 1);
386f3e32599Shannken 	ATF_REQUIRE(pargs->pta_vn_toserv_ops[PUFFS_VN_INACTIVE] > ianow);
387a4360455Spooka 
388a4360455Spooka 	ATF_REQUIRE_STREQ(buf, MAGICSTR);
389a4360455Spooka 
390272fb16eSpooka 	FSTEST_EXIT();
391272fb16eSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
392a4360455Spooka }
393a4360455Spooka 
3947bdde1baSpooka ATF_TC(signals);
ATF_TC_HEAD(signals,tc)3957bdde1baSpooka ATF_TC_HEAD(signals, tc)
3967bdde1baSpooka {
3977bdde1baSpooka 
3987bdde1baSpooka 	atf_tc_set_md_var(tc, "descr", "Checks that sending a signal can "
3997bdde1baSpooka 	    "cause an interrupt to puffs wait");
4007bdde1baSpooka }
4017bdde1baSpooka 
4027bdde1baSpooka extern struct proc *rumpns_initproc;
4037bdde1baSpooka extern void rumpns_psignal(struct proc *, int);
4047bdde1baSpooka extern void rumpns_sigclearall(struct proc *, void *, void *);
ATF_TC_BODY(signals,tc)4057bdde1baSpooka ATF_TC_BODY(signals, tc)
4067bdde1baSpooka {
4077bdde1baSpooka 	struct stat sb;
4087bdde1baSpooka 	void *args;
4097bdde1baSpooka 
4107bdde1baSpooka 	rump_boot_setsigmodel(RUMP_SIGMODEL_RECORD);
4117bdde1baSpooka 
4127bdde1baSpooka 	FSTEST_CONSTRUCTOR(tc, puffs, args);
4137bdde1baSpooka 	FSTEST_ENTER();
4147bdde1baSpooka 	RL(rump_sys_stat(".", &sb));
4157bdde1baSpooka 
4167bdde1baSpooka 	/* send SIGUSR1, should not affect puffs ops */
4177bdde1baSpooka 	rump_schedule();
4187bdde1baSpooka 	rumpns_psignal(rumpns_initproc, SIGUSR1);
4197bdde1baSpooka 	rump_unschedule();
4207bdde1baSpooka 	RL(rump_sys_stat(".", &sb));
4217bdde1baSpooka 
4227bdde1baSpooka 	/* send SIGTERM, should get EINTR */
4237bdde1baSpooka 	rump_schedule();
4247bdde1baSpooka 	rumpns_psignal(rumpns_initproc, SIGTERM);
4257bdde1baSpooka 	rump_unschedule();
4267bdde1baSpooka 	ATF_REQUIRE_ERRNO(EINTR, rump_sys_stat(".", &sb) == -1);
4277bdde1baSpooka 
4287bdde1baSpooka 	/* clear sigmask so that we can unmount */
4297bdde1baSpooka 	rump_schedule();
4307bdde1baSpooka 	rumpns_sigclearall(rumpns_initproc, NULL, NULL);
4317bdde1baSpooka 	rump_unschedule();
4327bdde1baSpooka 
4337bdde1baSpooka 	FSTEST_EXIT();
4347bdde1baSpooka 	FSTEST_DESTRUCTOR(tc, puffs, args);
4357bdde1baSpooka }
4367bdde1baSpooka 
ATF_TP_ADD_TCS(tp)43781a57dd0Spooka ATF_TP_ADD_TCS(tp)
43881a57dd0Spooka {
4395544227eSpooka 
44081a57dd0Spooka 	ATF_TP_ADD_TC(tp, mount);
44181a57dd0Spooka 
4425544227eSpooka 	ATF_TP_ADD_TC(tp, root_fifo);
4435544227eSpooka 	ATF_TP_ADD_TC(tp, root_lnk);
4445544227eSpooka 	ATF_TP_ADD_TC(tp, root_reg);
4455544227eSpooka 	ATF_TP_ADD_TC(tp, root_chrdev);
4465544227eSpooka 
447a4360455Spooka 	ATF_TP_ADD_TC(tp, inactive_basic);
448a4360455Spooka 	ATF_TP_ADD_TC(tp, inactive_reclaim);
449a4360455Spooka 	ATF_TP_ADD_TC(tp, reclaim_hardlink);
450a4360455Spooka 	ATF_TP_ADD_TC(tp, unlink_accessible);
451a4360455Spooka 
4527bdde1baSpooka 	ATF_TP_ADD_TC(tp, signals);
4537bdde1baSpooka 
45481a57dd0Spooka 	return atf_no_error();
45581a57dd0Spooka }
456