12f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka/* Copyright (c) 2014 Red Hat, Inc. 22f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 32f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * This program is free software: you can redistribute it and/or modify 42f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * it under the terms of version 2 the GNU General Public License as 52f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * published by the Free Software Foundation. 62f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 72f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * This program is distributed in the hope that it will be useful, 82f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * but WITHOUT ANY WARRANTY; without even the implied warranty of 92f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 102f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * GNU General Public License for more details. 112f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 122f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * You should have received a copy of the GNU General Public License 132f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * along with this program. If not, see <http://www.gnu.org/licenses/>. 142f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *********************************************************************** 152f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * File: mountns02.c 162f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 172f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Tests a private mount: private mount does not forward or receive 182f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * propagation. 192f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Description: 202f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 1. Creates directories "A", "B" and files "A/A", "B/B" 212f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 2. Unshares mount namespace and makes it private (so mounts/umounts 222f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * have no effect on a real system) 232f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 3. Bind mounts directory "A" to "A" 242f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 4. Makes directory "A" private 252f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 5. Clones a new child process with CLONE_NEWNS flag 262f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 6. There are two test cases (where X is parent namespace and Y child 272f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * namespace): 282f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 1) 292f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * X: bind mounts "B" to "A" 302f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Y: must see "A/A" and must not see "A/B" 312f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * X: umounts "A" 322f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 2) 332f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Y: bind mounts "B" to "A" 342f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * X: must see "A/A" and must not see "A/B" 352f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Y: umounts A 362f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka ***********************************************************************/ 372f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 382f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#define _GNU_SOURCE 392f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <sys/wait.h> 402f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <sys/mount.h> 412f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <stdio.h> 422f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <errno.h> 432f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "test.h" 442f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "libclone.h" 452f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "safe_macros.h" 462f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "mountns_helper.h" 472f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 482f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 492f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkachar *TCID = "mountns02"; 502f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint TST_TOTAL = 2; 512f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 522f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 532f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#if defined(MS_SHARED) && defined(MS_PRIVATE) && defined(MS_REC) 542f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 55c9ddd863ffe872e0cde48f73ddf48bb6ad18d554Xiao Yangint child_func(void *arg LTP_ATTRIBUTE_UNUSED) 562f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{ 572f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka int ret = 0; 582f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 599f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAIT(NULL, 0); 602f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 612f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if ((access(DIRA"/A", F_OK) != 0) || (access(DIRA"/B", F_OK) == 0)) 622f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka ret = 2; 632f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 649f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0); 652f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 662f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* bind mounts DIRB to DIRA making contents of DIRB visible 672f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * in DIRA */ 682f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if (mount(DIRB, DIRA, "none", MS_BIND, NULL) == -1) { 692f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka perror("mount"); 702f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka return 1; 712f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka } 722f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 739f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0); 742f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 752f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka umount(DIRA); 762f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka return ret; 772f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka} 782f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 792f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkastatic void test(void) 802f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{ 812f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka int status; 822f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 832f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* unshares the mount ns */ 842f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if (unshare(CLONE_NEWNS) == -1) 852f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup, "unshare failed"); 862f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* makes sure parent mounts/umounts have no effect on a real system */ 872f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_MOUNT(cleanup, "none", "/", "none", MS_REC|MS_PRIVATE, NULL); 882f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 892f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* bind mounts DIRA to itself */ 902f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_MOUNT(cleanup, DIRA, DIRA, "none", MS_BIND, NULL); 912f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 922f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* makes mount DIRA private */ 932f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_MOUNT(cleanup, "none", DIRA, "none", MS_PRIVATE, NULL); 942f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 952f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if (do_clone_tests(CLONE_NEWNS, child_func, NULL, NULL, NULL) == -1) 962f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_brkm(TBROK | TERRNO, cleanup, "clone failed"); 972f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 982f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka /* bind mounts DIRB to DIRA making contents of DIRB visible 992f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * in DIRA */ 1002f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_MOUNT(cleanup, DIRB, DIRA, "none", MS_BIND, NULL); 1012f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1029f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(cleanup, 0); 1032f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1042f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_UMOUNT(cleanup, DIRA); 1052f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1069f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(cleanup, 0); 1072f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1082f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if ((access(DIRA"/A", F_OK) != 0) || (access(DIRA"/B", F_OK) == 0)) 1092f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_resm(TFAIL, "private mount in child failed"); 1102f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka else 1112f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_resm(TPASS, "private mount in child passed"); 1122f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1139f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis TST_SAFE_CHECKPOINT_WAKE(cleanup, 0); 1142f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1152f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1162f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_WAIT(cleanup, &status); 1172f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if (WIFEXITED(status)) { 1182f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if ((WEXITSTATUS(status) == 0)) 1192f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_resm(TPASS, "private mount in parent passed"); 1202f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka else 1212f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_resm(TFAIL, "private mount in parent failed"); 1222f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka } 1232f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka if (WIFSIGNALED(status)) { 1242f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_resm(TBROK, "child was killed with signal %s", 1252f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_strsig(WTERMSIG(status))); 1262f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka return; 1272f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka } 1282f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1292f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka SAFE_UMOUNT(cleanup, DIRA); 1302f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka} 1312f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1322f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint main(int argc, char *argv[]) 1332f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{ 1342f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka int lc; 1352f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 136d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(argc, argv, NULL, NULL); 1372f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1382f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka setup(); 1392f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1402f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka for (lc = 0; TEST_LOOPING(lc); lc++) 1412f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka test(); 1422f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1432f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka cleanup(); 1442f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_exit(); 1452f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka} 1462f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka 1472f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#else 1482f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint main(void) 1492f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{ 1502f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka tst_brkm(TCONF, NULL, "needed mountflags are not defined"); 1512f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka} 1522f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#endif 153