1*653f037eSmartin /* $NetBSD: t_pr.c,v 1.13 2019/07/16 17:29:17 martin Exp $ */
273a09406Spooka
373a09406Spooka #include <sys/types.h>
473a09406Spooka #include <sys/mount.h>
573a09406Spooka
673a09406Spooka #include <atf-c.h>
773a09406Spooka #include <err.h>
873a09406Spooka #include <errno.h>
973a09406Spooka #include <fcntl.h>
1073a09406Spooka #include <stdio.h>
1173a09406Spooka #include <unistd.h>
1273a09406Spooka #include <string.h>
1373a09406Spooka #include <stdlib.h>
1473a09406Spooka
1573a09406Spooka #include <rump/rump.h>
1673a09406Spooka #include <rump/rump_syscalls.h>
1773a09406Spooka
1873a09406Spooka #include <miscfs/union/union.h>
1973a09406Spooka
20c54cb811Schristos #include "h_macros.h"
2173a09406Spooka
2273a09406Spooka ATF_TC(multilayer);
ATF_TC_HEAD(multilayer,tc)2373a09406Spooka ATF_TC_HEAD(multilayer, tc)
2473a09406Spooka {
2573a09406Spooka atf_tc_set_md_var(tc, "descr", "mount_union -b twice");
2673a09406Spooka }
2773a09406Spooka
ATF_TC_BODY(multilayer,tc)2873a09406Spooka ATF_TC_BODY(multilayer, tc)
2973a09406Spooka {
3073a09406Spooka struct union_args unionargs;
3173a09406Spooka
3273a09406Spooka rump_init();
3373a09406Spooka
3473a09406Spooka if (rump_sys_mkdir("/Tunion", 0777) == -1)
3573a09406Spooka atf_tc_fail_errno("mkdir mp1");
3673a09406Spooka if (rump_sys_mkdir("/Tunion2", 0777) == -1)
3773a09406Spooka atf_tc_fail_errno("mkdir mp2");
3873a09406Spooka if (rump_sys_mkdir("/Tunion2/A", 0777) == -1)
3973a09406Spooka atf_tc_fail_errno("mkdir A");
4073a09406Spooka if (rump_sys_mkdir("/Tunion2/B", 0777) == -1)
4173a09406Spooka atf_tc_fail_errno("mkdir B");
4273a09406Spooka
4373a09406Spooka unionargs.target = __UNCONST("/Tunion2/A");
4473a09406Spooka unionargs.mntflags = UNMNT_BELOW;
4573a09406Spooka
4673a09406Spooka if (rump_sys_mount(MOUNT_UNION, "/Tunion", 0,
4773a09406Spooka &unionargs, sizeof(unionargs)) == -1)
4873a09406Spooka atf_tc_fail_errno("union mount");
4973a09406Spooka
5073a09406Spooka unionargs.target = __UNCONST("/Tunion2/B");
5173a09406Spooka unionargs.mntflags = UNMNT_BELOW;
5273a09406Spooka
5373a09406Spooka rump_sys_mount(MOUNT_UNION, "/Tunion", 0,&unionargs,sizeof(unionargs));
5473a09406Spooka }
5573a09406Spooka
56daa85584Smaya ATF_TC(multilayer2);
ATF_TC_HEAD(multilayer2,tc)57daa85584Smaya ATF_TC_HEAD(multilayer2, tc)
58daa85584Smaya {
59daa85584Smaya atf_tc_set_md_var(tc, "descr", "mount_union twice then unmount");
60daa85584Smaya }
61daa85584Smaya
ATF_TC_BODY(multilayer2,tc)62daa85584Smaya ATF_TC_BODY(multilayer2, tc)
63daa85584Smaya {
64daa85584Smaya struct union_args unionargs;
65daa85584Smaya
66460f0e63Sriastradh atf_tc_expect_signal(-1, "PR kern/2423");
67de4f8ca0Sriastradh
68daa85584Smaya rump_init();
69daa85584Smaya
70daa85584Smaya if (rump_sys_mkdir("/Tunion", 0777) == -1)
71daa85584Smaya atf_tc_fail_errno("mkdir mp1");
72daa85584Smaya if (rump_sys_mkdir("/Tunion2", 0777) == -1)
73daa85584Smaya atf_tc_fail_errno("mkdir mp2");
74daa85584Smaya if (rump_sys_mkdir("/Tunion2/A", 0777) == -1)
75daa85584Smaya atf_tc_fail_errno("mkdir A");
76daa85584Smaya if (rump_sys_mkdir("/Tunion2/B", 0777) == -1)
77daa85584Smaya atf_tc_fail_errno("mkdir B");
78daa85584Smaya
79daa85584Smaya unionargs.target = __UNCONST("/Tunion2/A");
80daa85584Smaya unionargs.mntflags = UNMNT_ABOVE;
81daa85584Smaya
82daa85584Smaya if (rump_sys_mount(MOUNT_UNION, "/Tunion", 0,
83daa85584Smaya &unionargs, sizeof(unionargs)) == -1)
84daa85584Smaya atf_tc_fail_errno("union mount");
85daa85584Smaya if (rump_sys_mkdir("/Tunion2/A/A", 0777) == -1)
86daa85584Smaya atf_tc_fail_errno("mkdir A/A");
87daa85584Smaya
88daa85584Smaya unionargs.target = __UNCONST("/Tunion2/A/A");
89daa85584Smaya unionargs.mntflags = UNMNT_ABOVE;
90daa85584Smaya
91daa85584Smaya rump_sys_mount(MOUNT_UNION, "/Tunion", 0,&unionargs,sizeof(unionargs));
92daa85584Smaya
93daa85584Smaya rump_sys_unmount("/Tunion/A", 0);
94daa85584Smaya }
95daa85584Smaya
96daa85584Smaya ATF_TC(cyclic);
ATF_TC_HEAD(cyclic,tc)97daa85584Smaya ATF_TC_HEAD(cyclic, tc)
98daa85584Smaya {
99daa85584Smaya atf_tc_set_md_var(tc, "descr", "cyclic mount_union");
100daa85584Smaya }
101daa85584Smaya
ATF_TC_BODY(cyclic,tc)102daa85584Smaya ATF_TC_BODY(cyclic, tc)
103daa85584Smaya {
104daa85584Smaya struct union_args unionargs;
105daa85584Smaya
106460f0e63Sriastradh atf_tc_expect_signal(-1, "PR kern/3645");
107de4f8ca0Sriastradh
108daa85584Smaya rump_init();
109daa85584Smaya
110daa85584Smaya if (rump_sys_mkdir("/Tunion", 0777) == -1)
111daa85584Smaya atf_tc_fail_errno("mkdir mp1");
112daa85584Smaya if (rump_sys_mkdir("/Tunion/A", 0777) == -1)
113daa85584Smaya atf_tc_fail_errno("mkdir mp2");
114daa85584Smaya
115daa85584Smaya unionargs.target = __UNCONST("/Tunion/A");
116daa85584Smaya unionargs.mntflags = UNMNT_ABOVE;
117daa85584Smaya
118daa85584Smaya if (rump_sys_mount(MOUNT_UNION, "/Tunion/A", 0,
119daa85584Smaya &unionargs, sizeof(unionargs)) == -1)
120daa85584Smaya atf_tc_fail_errno("union mount");
121daa85584Smaya
122daa85584Smaya if (rump_sys_mkdir("/Tunion/A/A", 0777) == -1)
123daa85584Smaya atf_tc_fail_errno("mkdir failed");
124daa85584Smaya }
125daa85584Smaya
126daa85584Smaya ATF_TC(cyclic2);
ATF_TC_HEAD(cyclic2,tc)127daa85584Smaya ATF_TC_HEAD(cyclic2, tc)
128daa85584Smaya {
129daa85584Smaya atf_tc_set_md_var(tc, "descr", "cyclic mount_union");
130daa85584Smaya }
131daa85584Smaya
ATF_TC_BODY(cyclic2,tc)132daa85584Smaya ATF_TC_BODY(cyclic2, tc)
133daa85584Smaya {
134daa85584Smaya struct union_args unionargs;
135daa85584Smaya
136460f0e63Sriastradh atf_tc_expect_signal(-1, "PR kern/4597");
137de4f8ca0Sriastradh
138daa85584Smaya rump_init();
139daa85584Smaya
140daa85584Smaya if (rump_sys_mkdir("/Tunion", 0777) == -1)
141daa85584Smaya atf_tc_fail_errno("mkdir mp1");
142daa85584Smaya if (rump_sys_mkdir("/Tunion/A", 0777) == -1)
143daa85584Smaya atf_tc_fail_errno("mkdir mp2");
144daa85584Smaya if (rump_sys_mkdir("/Tunion/B", 0777) == -1)
145daa85584Smaya atf_tc_fail_errno("mkdir mp3");
146daa85584Smaya
147daa85584Smaya unionargs.target = __UNCONST("/Tunion/A");
148daa85584Smaya unionargs.mntflags = UNMNT_ABOVE;
149daa85584Smaya
150daa85584Smaya if (rump_sys_mount(MOUNT_UNION, "/Tunion/B", 0,
151daa85584Smaya &unionargs, sizeof(unionargs)) == -1)
152daa85584Smaya atf_tc_fail_errno("union mount");
153daa85584Smaya
154daa85584Smaya unionargs.target = __UNCONST("/Tunion/B");
155daa85584Smaya unionargs.mntflags = UNMNT_ABOVE;
156daa85584Smaya
157daa85584Smaya if (rump_sys_mount(MOUNT_UNION, "/Tunion/A", 0,
158daa85584Smaya &unionargs, sizeof(unionargs)) == -1)
159daa85584Smaya atf_tc_fail_errno("union mount2");
160daa85584Smaya
161daa85584Smaya if (rump_sys_mkdir("/Tunion/A/A", 0777) == -1)
162daa85584Smaya atf_tc_fail_errno("mkdir failed");
163daa85584Smaya }
164daa85584Smaya
1654fbc0204Spooka ATF_TC(devnull1);
ATF_TC_HEAD(devnull1,tc)1664fbc0204Spooka ATF_TC_HEAD(devnull1, tc)
1674fbc0204Spooka {
1684fbc0204Spooka atf_tc_set_md_var(tc, "descr", "mount_union -b and "
1694fbc0204Spooka "'echo x > /un/null'");
1704fbc0204Spooka }
1714fbc0204Spooka
ATF_TC_BODY(devnull1,tc)1724fbc0204Spooka ATF_TC_BODY(devnull1, tc)
1734fbc0204Spooka {
1744fbc0204Spooka struct union_args unionargs;
175b80057eeShannken int fd, res;
1764fbc0204Spooka
1774fbc0204Spooka rump_init();
1784fbc0204Spooka
1794fbc0204Spooka if (rump_sys_mkdir("/mp", 0777) == -1)
1804fbc0204Spooka atf_tc_fail_errno("mkdir mp");
1814fbc0204Spooka
1824fbc0204Spooka unionargs.target = __UNCONST("/dev");
1834fbc0204Spooka unionargs.mntflags = UNMNT_BELOW;
1844fbc0204Spooka
1854fbc0204Spooka if (rump_sys_mount(MOUNT_UNION, "/mp", 0,
1864fbc0204Spooka &unionargs, sizeof(unionargs)) == -1)
1874fbc0204Spooka atf_tc_fail_errno("union mount");
1884fbc0204Spooka
189*653f037eSmartin fd = rump_sys_open("/mp/null", O_WRONLY | O_CREAT | O_TRUNC, 0600);
1904fbc0204Spooka
191b80057eeShannken if (fd == -1)
192b80057eeShannken atf_tc_fail_errno("open");
19344307e8dSpooka
194b80057eeShannken res = rump_sys_write(fd, &fd, sizeof(fd));
195b80057eeShannken if (res != sizeof(fd))
196b80057eeShannken atf_tc_fail("write");
1974fbc0204Spooka }
1984fbc0204Spooka
1994fbc0204Spooka ATF_TC(devnull2);
ATF_TC_HEAD(devnull2,tc)2004fbc0204Spooka ATF_TC_HEAD(devnull2, tc)
2014fbc0204Spooka {
2024fbc0204Spooka atf_tc_set_md_var(tc, "descr", "mount_union -b and "
2034fbc0204Spooka "'echo x >> /un/null'");
2044fbc0204Spooka }
2054fbc0204Spooka
ATF_TC_BODY(devnull2,tc)2064fbc0204Spooka ATF_TC_BODY(devnull2, tc)
2074fbc0204Spooka {
2084fbc0204Spooka struct union_args unionargs;
209b80057eeShannken int fd, res;
2104fbc0204Spooka
2114fbc0204Spooka rump_init();
2124fbc0204Spooka
2134fbc0204Spooka if (rump_sys_mkdir("/mp", 0777) == -1)
2144fbc0204Spooka atf_tc_fail_errno("mkdir mp");
2154fbc0204Spooka
2164fbc0204Spooka unionargs.target = __UNCONST("/dev");
2174fbc0204Spooka unionargs.mntflags = UNMNT_BELOW;
2184fbc0204Spooka
2194fbc0204Spooka if (rump_sys_mount(MOUNT_UNION, "/mp", 0,
2204fbc0204Spooka &unionargs, sizeof(unionargs)) == -1)
2214fbc0204Spooka atf_tc_fail_errno("union mount");
2224fbc0204Spooka
223*653f037eSmartin fd = rump_sys_open("/mp/null", O_WRONLY | O_CREAT | O_APPEND, 0600);
2244fbc0204Spooka if (fd == -1)
2254fbc0204Spooka atf_tc_fail_errno("open");
2264fbc0204Spooka
227b80057eeShannken res = rump_sys_write(fd, &fd, sizeof(fd));
228b80057eeShannken if (res != sizeof(fd))
229b80057eeShannken atf_tc_fail("write");
2304fbc0204Spooka }
2314fbc0204Spooka
ATF_TP_ADD_TCS(tp)23273a09406Spooka ATF_TP_ADD_TCS(tp)
23373a09406Spooka {
23473a09406Spooka ATF_TP_ADD_TC(tp, multilayer);
235daa85584Smaya ATF_TP_ADD_TC(tp, multilayer2);
236daa85584Smaya ATF_TP_ADD_TC(tp, cyclic);
237daa85584Smaya ATF_TP_ADD_TC(tp, cyclic2);
2384fbc0204Spooka ATF_TP_ADD_TC(tp, devnull1);
2394fbc0204Spooka ATF_TP_ADD_TC(tp, devnull2);
24073a09406Spooka
24173a09406Spooka return atf_no_error();
24273a09406Spooka }
243