Lines Matching +full:0 +full:a

27 #define CLONE_NEWNS 0x00020000
31 #define CLONE_NEWUSER 0x10000000
47 #define MOUNT_ATTR_RDONLY 0x00000001
51 #define MOUNT_ATTR_NOSUID 0x00000002
55 #define MOUNT_ATTR_NOEXEC 0x00000008
59 #define MOUNT_ATTR_NODIRATIME 0x00000080
63 #define MOUNT_ATTR__ATIME 0x00000070
67 #define MOUNT_ATTR_RELATIME 0x00000000
71 #define MOUNT_ATTR_NOATIME 0x00000010
75 #define MOUNT_ATTR_STRICTATIME 0x00000020
79 #define AT_RECURSIVE 0x8000
131 #define MOUNT_ATTR_IDMAP 0x00100000
135 #define MOUNT_ATTR_NOSYMFOLLOW 0x00200000
156 } while (ret < 0 && errno == EINTR); in write_nointr()
167 if (fd < 0) in write_file()
172 if (ret < 0 || (size_t)ret != count) in write_file()
175 return 0; in write_file()
194 snprintf(map, sizeof(map), "0 %d 1", uid); in create_and_enter_userns()
199 snprintf(map, sizeof(map), "0 %d 1", gid); in create_and_enter_userns()
203 if (setgid(0)) in create_and_enter_userns()
206 if (setuid(0)) in create_and_enter_userns()
209 return 0; in create_and_enter_userns()
220 if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0)) in prepare_unpriv_mountns()
223 return 0; in prepare_unpriv_mountns()
227 #define ST_NOSYMFOLLOW 0x2000 /* do not follow symlinks */
237 if (ret != 0) in read_mnt_flags()
245 mnt_flags = 0; in read_mnt_flags()
275 for (i = 0; i < nfields; i++) { in get_field()
292 *word = '\0'; in null_endofword()
297 size_t len = 0; in is_shared_mount()
318 if (strcmp(target, path) != 0) in is_shared_mount()
336 .attr_clr = 0, in mount_setattr_thread()
340 if (sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr))) in mount_setattr_thread()
343 pthread_exit(int_to_ptr(0)); in mount_setattr_thread()
355 ret = sys_mount_setattr(-EBADF, "", AT_EMPTY_PATH, NULL, 0); in mount_setattr_supported()
356 if (ret < 0 && errno == ENOSYS) in mount_setattr_supported()
365 #define NOSYMFOLLOW_TARGET "/mnt/A/AA/data"
366 #define NOSYMFOLLOW_SYMLINK "/mnt/A/AA/symlink"
375 ASSERT_EQ(prepare_unpriv_mountns(), 0); in FIXTURE_SETUP()
381 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
383 ASSERT_EQ(mkdir("/tmp/B", 0777), 0); in FIXTURE_SETUP()
386 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
388 ASSERT_EQ(mkdir("/tmp/B/BB", 0777), 0); in FIXTURE_SETUP()
390 ASSERT_EQ(mkdir("/tmp/target1", 0777), 0); in FIXTURE_SETUP()
392 ASSERT_EQ(mkdir("/tmp/target2", 0777), 0); in FIXTURE_SETUP()
395 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
398 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
400 ASSERT_EQ(mkdir("/mnt/A", 0777), 0); in FIXTURE_SETUP()
402 ASSERT_EQ(mount("testing", "/mnt/A", "tmpfs", MS_NOATIME | MS_NODEV, in FIXTURE_SETUP()
403 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
405 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in FIXTURE_SETUP()
407 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in FIXTURE_SETUP()
409 ASSERT_EQ(mkdir("/mnt/B", 0777), 0); in FIXTURE_SETUP()
412 MS_NOATIME | MS_NODEV | MS_NOSUID, 0), 0); in FIXTURE_SETUP()
414 ASSERT_EQ(mkdir("/mnt/B/BB", 0777), 0); in FIXTURE_SETUP()
417 MS_RELATIME | MS_NOEXEC | MS_RDONLY, 0), 0); in FIXTURE_SETUP()
420 ASSERT_GT(fd, 0); in FIXTURE_SETUP()
421 ASSERT_EQ(symlink(NOSYMFOLLOW_TARGET, NOSYMFOLLOW_SYMLINK), 0); in FIXTURE_SETUP()
422 ASSERT_EQ(close(fd), 0); in FIXTURE_SETUP()
430 (void)umount2("/mnt/A", MNT_DETACH); in FIXTURE_TEARDOWN()
443 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
444 sizeof(invalid_attr)), 0); in TEST_F()
446 invalid_attr.attr_set = 0; in TEST_F()
448 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
449 sizeof(invalid_attr)), 0); in TEST_F()
451 invalid_attr.attr_clr = 0; in TEST_F()
453 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
454 sizeof(invalid_attr)), 0); in TEST_F()
459 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
460 sizeof(invalid_attr)), 0); in TEST_F()
462 ASSERT_NE(sys_mount_setattr(-1, "mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
463 sizeof(invalid_attr)), 0); in TEST_F()
468 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
480 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
481 ASSERT_GT(old_flags, 0); in TEST_F()
483 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, NULL, in TEST_F()
484 sizeof(invalid_attr)), 0); in TEST_F()
487 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, (void *)s, in TEST_F()
488 sizeof(invalid_attr)), 0); in TEST_F()
491 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, 0), 0); in TEST_F()
494 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
495 sizeof(invalid_attr) / 2), 0); in TEST_F()
498 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &invalid_attr, in TEST_F()
499 sizeof(invalid_attr) / 2), 0); in TEST_F()
502 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
503 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
506 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
507 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
509 large_attr.attr3.attr_set = 0; in TEST_F()
511 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, in TEST_F()
512 (void *)&large_attr, sizeof(large_attr)), 0); in TEST_F()
517 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
520 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
523 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
526 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
532 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
541 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
542 ASSERT_GT(old_flags, 0); in TEST_F()
544 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", 0, &attr, sizeof(attr)), 0); in TEST_F()
552 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
555 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
558 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
561 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
568 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
577 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
578 ASSERT_GT(old_flags, 0); in TEST_F()
580 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
588 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
591 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
594 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
597 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
600 memset(&attr, 0, sizeof(attr)); in TEST_F()
603 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
606 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
609 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
611 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
614 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
616 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
619 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
621 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
624 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
626 fd = open("/mnt/A/AA/B/b", O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL, 0777); in TEST_F()
627 ASSERT_GE(fd, 0); in TEST_F()
630 * We're holding a fd open for writing so this needs to fail somewhere in TEST_F()
634 ASSERT_LT(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
636 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
639 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
641 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
644 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
646 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
649 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
651 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
654 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
656 EXPECT_EQ(close(fd), 0); in TEST_F()
662 unsigned int old_flags = 0, new_flags = 0; in TEST_F()
672 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
673 ASSERT_GT(old_flags, 0); in TEST_F()
675 fd = open("/mnt/A/AA/B/b", O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL, 0777); in TEST_F()
676 ASSERT_GE(fd, 0); in TEST_F()
679 * We're holding a fd open to a mount somwhere in the middle so this in TEST_F()
683 ASSERT_LT(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
685 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
688 ASSERT_EQ(is_shared_mount("/mnt/A"), false); in TEST_F()
690 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
693 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), false); in TEST_F()
695 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
698 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), false); in TEST_F()
700 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
703 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), false); in TEST_F()
705 dfd = open("/mnt/A/AA/B", O_DIRECTORY | O_CLOEXEC); in TEST_F()
706 ASSERT_GE(dfd, 0); in TEST_F()
707 EXPECT_EQ(fsync(dfd), 0); in TEST_F()
708 EXPECT_EQ(close(dfd), 0); in TEST_F()
710 EXPECT_EQ(fsync(fd), 0); in TEST_F()
711 EXPECT_EQ(close(fd), 0); in TEST_F()
714 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
719 unsigned int old_flags1 = 0, old_flags2 = 0, new_flags = 0, expected_flags = 0; in TEST_F()
729 ASSERT_GT(old_flags1, 0); in TEST_F()
732 ASSERT_GT(old_flags2, 0); in TEST_F()
734 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/B", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
753 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
761 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
764 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
767 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
771 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
773 attr.attr_set = 0; in TEST_F()
775 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
778 ASSERT_NE(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
780 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
781 ASSERT_GT(old_flags, 0); in TEST_F()
785 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
791 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
794 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
797 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
800 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
803 memset(&attr, 0, sizeof(attr)); in TEST_F()
807 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
812 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
815 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
818 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
821 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
824 memset(&attr, 0, sizeof(attr)); in TEST_F()
828 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
832 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
835 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
838 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
841 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
844 memset(&attr, 0, sizeof(attr)); in TEST_F()
848 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
851 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
854 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
857 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
860 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
863 memset(&attr, 0, sizeof(attr)); in TEST_F()
864 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
866 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
869 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
872 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
875 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
878 memset(&attr, 0, sizeof(attr)); in TEST_F()
880 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
884 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
887 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
890 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
893 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
899 int i, j, nthreads, ret = 0; in TEST_F()
900 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
907 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
908 ASSERT_GT(old_flags, 0); in TEST_F()
916 for (i = 0; i < nthreads; i++) in TEST_F()
917 ASSERT_EQ(pthread_create(&threads[i], &pattr, mount_setattr_thread, NULL), 0); in TEST_F()
919 for (j = 0; j < i; j++) { in TEST_F()
922 EXPECT_EQ(pthread_join(threads[j], &retptr), 0); in TEST_F()
925 EXPECT_EQ(ret, 0); in TEST_F()
929 ASSERT_EQ(ret, 0); in TEST_F()
934 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
937 ASSERT_EQ(is_shared_mount("/mnt/A"), true); in TEST_F()
939 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
942 ASSERT_EQ(is_shared_mount("/mnt/A/AA"), true); in TEST_F()
944 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
947 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B"), true); in TEST_F()
949 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
952 ASSERT_EQ(is_shared_mount("/mnt/A/AA/B/BB"), true); in TEST_F()
965 EXPECT_EQ(create_and_enter_userns(), 0); in TEST_F()
966 ret = sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)); in TEST_F()
967 ASSERT_LT(ret, 0); in TEST_F()
981 fd = open("/mnt/A", O_DIRECTORY | O_CLOEXEC); in TEST_F()
982 ASSERT_GE(fd, 0); in TEST_F()
984 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
987 ASSERT_LT(ret, 0); in TEST_F()
998 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in FIXTURE_SETUP()
1000 ASSERT_EQ(mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, 0), 0); in FIXTURE_SETUP()
1006 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1008 ASSERT_EQ(mkdir("/tmp/B", 0777), 0); in FIXTURE_SETUP()
1009 ASSERT_EQ(mknodat(-EBADF, "/tmp/B/b", S_IFREG | 0644, 0), 0); in FIXTURE_SETUP()
1010 ASSERT_EQ(chown("/tmp/B/b", 0, 0), 0); in FIXTURE_SETUP()
1013 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1015 ASSERT_EQ(mkdir("/tmp/B/BB", 0777), 0); in FIXTURE_SETUP()
1016 ASSERT_EQ(mknodat(-EBADF, "/tmp/B/BB/b", S_IFREG | 0644, 0), 0); in FIXTURE_SETUP()
1017 ASSERT_EQ(chown("/tmp/B/BB/b", 0, 0), 0); in FIXTURE_SETUP()
1020 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1023 "size=2m,mode=700"), 0); in FIXTURE_SETUP()
1025 ASSERT_EQ(mkdir("/mnt/A", 0777), 0); in FIXTURE_SETUP()
1027 ASSERT_EQ(mount("testing", "/mnt/A", "tmpfs", MS_NOATIME | MS_NODEV, in FIXTURE_SETUP()
1028 "size=100000,mode=700"), 0); in FIXTURE_SETUP()
1030 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in FIXTURE_SETUP()
1032 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in FIXTURE_SETUP()
1034 ASSERT_EQ(mkdir("/mnt/B", 0777), 0); in FIXTURE_SETUP()
1037 MS_NOATIME | MS_NODEV | MS_NOSUID, 0), 0); in FIXTURE_SETUP()
1039 ASSERT_EQ(mkdir("/mnt/B/BB", 0777), 0); in FIXTURE_SETUP()
1042 MS_RELATIME | MS_NOEXEC | MS_RDONLY, 0), 0); in FIXTURE_SETUP()
1044 ASSERT_EQ(mkdir("/mnt/C", 0777), 0); in FIXTURE_SETUP()
1045 ASSERT_EQ(mkdir("/mnt/D", 0777), 0); in FIXTURE_SETUP()
1047 ASSERT_GE(img_fd, 0); in FIXTURE_SETUP()
1048 ASSERT_EQ(ftruncate(img_fd, 2147483648 /* 2 GB */), 0); in FIXTURE_SETUP()
1049 ASSERT_EQ(system("mkfs.ext4 -q /mnt/C/ext4.img"), 0); in FIXTURE_SETUP()
1050 ASSERT_EQ(system("mount -o loop -t ext4 /mnt/C/ext4.img /mnt/D/"), 0); in FIXTURE_SETUP()
1051 ASSERT_EQ(close(img_fd), 0); in FIXTURE_SETUP()
1056 (void)umount2("/mnt/A", MNT_DETACH); in FIXTURE_TEARDOWN()
1073 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1091 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1110 ASSERT_GE(fd, 0); in TEST_F()
1111 ASSERT_GE(close(fd), 0); in TEST_F()
1114 ASSERT_NE(sys_mount_setattr(-1, "/", 0, &attr, sizeof(attr)), 0) { in TEST_F()
1136 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1139 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1140 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1142 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1143 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1162 return 0; in map_ids()
1191 ret = waitpid(pid, &status, 0); in wait_for_pid()
1212 if (pid < 0) in get_userns_fd()
1216 if (ret < 0) in get_userns_fd()
1246 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1248 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1249 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1250 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1252 * Make sure that open_tree_attr() without OPEN_TREE_CLONE is not a way in TEST_F()
1255 ASSERT_LT(sys_open_tree_attr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1257 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1258 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1262 * Validate that idmapping a mount is rejected if the mount's mount namespace
1282 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1284 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1286 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1287 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1289 sizeof(attr)), 0); in TEST_F()
1291 * Make sure that open_tree_attr() without OPEN_TREE_CLONE is not a way in TEST_F()
1294 ASSERT_LT(sys_open_tree_attr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1296 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1297 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1319 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1321 /* Changing mount properties on a detached mount. */ in TEST_F()
1322 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1323 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1325 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1326 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1327 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1331 * Validate that a detached mount not in our mount namespace can be idmapped.
1349 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1351 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1353 /* Changing mount properties on a detached mount. */ in TEST_F()
1354 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1355 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1357 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1358 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1359 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1369 if (ret < 0) in expected_uid_gid()
1385 ASSERT_TRUE(expected_uid_gid(-EBADF, "/mnt/D", 0, 0, 0)); in TEST_F()
1396 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1398 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1399 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1401 AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1402 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1404 EXPECT_FALSE(expected_uid_gid(open_tree_fd, ".", 0, 0, 0)); in TEST_F()
1405 EXPECT_TRUE(expected_uid_gid(open_tree_fd, ".", 0, 10000, 10000)); in TEST_F()
1407 /* Change idmapping on a detached mount that is already idmapped. */ in TEST_F()
1408 attr.userns_fd = get_userns_fd(0, 20000, 10000); in TEST_F()
1409 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1410 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1412 * Make sure that open_tree_attr() without OPEN_TREE_CLONE is not a way in TEST_F()
1415 EXPECT_LT(sys_open_tree_attr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1416 EXPECT_FALSE(expected_uid_gid(open_tree_fd, ".", 0, 20000, 20000)); in TEST_F()
1417 EXPECT_TRUE(expected_uid_gid(open_tree_fd, ".", 0, 10000, 10000)); in TEST_F()
1419 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1420 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1433 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/b", 0, 0, 0), 0); in TEST_F()
1434 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/BB/b", 0, 0, 0), 0); in TEST_F()
1436 ASSERT_EQ(mount("testing", "/mnt/A", "ramfs", MS_NOATIME | MS_NODEV, in TEST_F()
1437 "size=100000,mode=700"), 0); in TEST_F()
1439 ASSERT_EQ(mkdir("/mnt/A/AA", 0777), 0); in TEST_F()
1441 ASSERT_EQ(mount("/tmp", "/mnt/A/AA", NULL, MS_BIND | MS_REC, NULL), 0); in TEST_F()
1443 open_tree_fd = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
1450 ASSERT_GE(open_tree_fd, 0); in TEST_F()
1452 attr.userns_fd = get_userns_fd(0, 10000, 10000); in TEST_F()
1453 ASSERT_GE(attr.userns_fd, 0); in TEST_F()
1454 ASSERT_NE(sys_mount_setattr(open_tree_fd, "", AT_EMPTY_PATH, &attr, sizeof(attr)), 0); in TEST_F()
1455 ASSERT_EQ(close(attr.userns_fd), 0); in TEST_F()
1456 ASSERT_EQ(close(open_tree_fd), 0); in TEST_F()
1458 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/b", 0, 0, 0), 0); in TEST_F()
1459 ASSERT_EQ(expected_uid_gid(-EBADF, "/tmp/B/BB/b", 0, 0, 0), 0); in TEST_F()
1460 ASSERT_EQ(expected_uid_gid(open_tree_fd, "B/b", 0, 0, 0), 0); in TEST_F()
1461 ASSERT_EQ(expected_uid_gid(open_tree_fd, "B/BB/b", 0, 0, 0), 0); in TEST_F()
1463 (void)umount2("/mnt/A", MNT_DETACH); in TEST_F()
1469 unsigned int old_flags = 0, new_flags = 0, expected_flags = 0; in TEST_F()
1478 ASSERT_GT(fd, 0); in TEST_F()
1479 ASSERT_EQ(close(fd), 0); in TEST_F()
1481 old_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1482 ASSERT_GT(old_flags, 0); in TEST_F()
1484 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
1489 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1492 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
1495 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
1498 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
1502 ASSERT_LT(fd, 0); in TEST_F()
1508 ASSERT_EQ(sys_mount_setattr(-1, "/mnt/A", AT_RECURSIVE, &attr, sizeof(attr)), 0); in TEST_F()
1511 new_flags = read_mnt_flags("/mnt/A"); in TEST_F()
1514 new_flags = read_mnt_flags("/mnt/A/AA"); in TEST_F()
1517 new_flags = read_mnt_flags("/mnt/A/AA/B"); in TEST_F()
1520 new_flags = read_mnt_flags("/mnt/A/AA/B/BB"); in TEST_F()
1524 ASSERT_GT(fd, 0); in TEST_F()
1525 ASSERT_EQ(close(fd), 0); in TEST_F()
1537 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1540 * |-/mnt/A testing tmpfs in TEST_F()
1541 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1542 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1543 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1546 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1548 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1550 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1552 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1555 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1559 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1565 ASSERT_EQ(statx(fd_tree_subdir, "B", 0, 0, &stx), 0); in TEST_F()
1567 ASSERT_EQ(statx(fd_tree_subdir, "B/BB", 0, 0, &stx), 0); in TEST_F()
1570 ASSERT_EQ(move_mount(fd_tree_subdir, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1576 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0); in TEST_F()
1578 ASSERT_EQ(statx(-EBADF, "/tmp/target1/B", 0, 0, &stx), 0); in TEST_F()
1580 ASSERT_EQ(statx(-EBADF, "/tmp/target1/B/BB", 0, 0, &stx), 0); in TEST_F()
1583 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target2", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1586 * |-/tmp/target2/A testing tmpfs in TEST_F()
1587 * | `-/tmp/target2/A/AA testing tmpfs in TEST_F()
1588 * | `-/tmp/target2/A/AA/B testing tmpfs in TEST_F()
1589 * | `-/tmp/target2/A/AA/B/BB testing tmpfs in TEST_F()
1592 ASSERT_EQ(statx(-EBADF, "/tmp/target2", 0, 0, &stx), 0); in TEST_F()
1594 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A", 0, 0, &stx), 0); in TEST_F()
1596 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA", 0, 0, &stx), 0); in TEST_F()
1598 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B", 0, 0, &stx), 0); in TEST_F()
1600 ASSERT_EQ(statx(-EBADF, "/tmp/target2/A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1602 ASSERT_EQ(statx(-EBADF, "/tmp/target2/B", 0, 0, &stx), 0); in TEST_F()
1605 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1606 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1618 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1621 * |-/mnt/A testing tmpfs in TEST_F()
1622 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1623 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1624 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1627 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1629 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1631 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1633 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1636 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
1643 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1647 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1660 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1663 * |-/mnt/A testing tmpfs in TEST_F()
1664 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1665 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1666 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1669 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1671 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1673 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1675 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1678 EXPECT_EQ(create_and_enter_userns(), 0); in TEST_F()
1681 * The caller entered a new user namespace. They will have in TEST_F()
1683 * located in a mount namespace that is owned by an ancestor in TEST_F()
1684 * user namespace in which they hold no privilege. Creating a in TEST_F()
1687 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1691 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1704 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1707 * |-/mnt/A testing tmpfs in TEST_F()
1708 * | `-/mnt/A/AA testing tmpfs in TEST_F()
1709 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
1710 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1713 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1715 ASSERT_EQ(statx(fd_tree_base, "A/AA", 0, 0, &stx), 0); in TEST_F()
1717 ASSERT_EQ(statx(fd_tree_base, "A/AA/B", 0, 0, &stx), 0); in TEST_F()
1719 ASSERT_EQ(statx(fd_tree_base, "A/AA/B/BB", 0, 0, &stx), 0); in TEST_F()
1722 EXPECT_EQ(prepare_unpriv_mountns(), 0); in TEST_F()
1725 * The caller entered a new mount namespace. They will have in TEST_F()
1734 fd_tree_subdir = sys_open_tree(fd_tree_base, "A/AA", in TEST_F()
1738 ASSERT_LT(fd_tree_subdir, 0); in TEST_F()
1746 fd_context = sys_fsopen("tmpfs", 0); in TEST_F()
1747 ASSERT_GE(fd_context, 0); in TEST_F()
1749 ASSERT_EQ(sys_fsconfig(fd_context, FSCONFIG_CMD_CREATE, NULL, NULL, 0), 0); in TEST_F()
1751 fd_tmpfs = sys_fsmount(fd_context, 0, 0); in TEST_F()
1752 ASSERT_GE(fd_tmpfs, 0); in TEST_F()
1754 EXPECT_EQ(close(fd_context), 0); in TEST_F()
1756 ASSERT_EQ(mkdirat(fd_tmpfs, "subdir", 0755), 0); in TEST_F()
1762 ASSERT_GE(fd_tree, 0); in TEST_F()
1764 EXPECT_EQ(close(fd_tmpfs), 0); in TEST_F()
1766 ASSERT_EQ(mkdirat(-EBADF, "/mnt/open_tree_subfolder", 0755), 0); in TEST_F()
1768 …RT_EQ(sys_move_mount(fd_tree, "", -EBADF, "/mnt/open_tree_subfolder", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1770 EXPECT_EQ(close(fd_tree), 0); in TEST_F()
1772 ASSERT_EQ(umount2("/mnt/open_tree_subfolder", 0), 0); in TEST_F()
1774 EXPECT_EQ(rmdir("/mnt/open_tree_subfolder"), 0); in TEST_F()
1785 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1789 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1796 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1800 ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0); in TEST_F()
1807 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1808 ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, 0, &stx), 0); in TEST_F()
1811 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1813 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1814 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1821 __u64 mnt_id = 0; in TEST_F()
1826 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1830 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1837 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1841 ASSERT_EQ(statx(fd_tree_subdir, "A", 0, 0, &stx), 0); in TEST_F()
1848 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1849 ASSERT_EQ(statx(fd_tree_subdir, "", AT_EMPTY_PATH, STATX_MNT_ID_UNIQUE, &stx), 0); in TEST_F()
1854 …mount(fd_tree_subdir, "", fd_tree_base, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1856 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1857 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, STATX_MNT_ID_UNIQUE, &stx), 0); in TEST_F()
1862 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1863 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1874 ASSERT_GE(fd_tree_base, 0); in TEST_F()
1877 ASSERT_EQ(move_mount(fd_tree_base, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1879 ASSERT_EQ(statx(fd_tree_base, "A", 0, 0, &stx), 0); in TEST_F()
1885 ASSERT_GE(fd_tree_subdir, 0); in TEST_F()
1886 ASSERT_EQ(statx(fd_tree_subdir, "BB", 0, 0, &stx), 0); in TEST_F()
1889 /* Not allowed to move an attached mount to a detached mount. */ in TEST_F()
1890 …mount(fd_tree_base, "", fd_tree_subdir, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1893 EXPECT_EQ(close(fd_tree_base), 0); in TEST_F()
1894 EXPECT_EQ(close(fd_tree_subdir), 0); in TEST_F()
1906 ASSERT_GE(fd_tree, 0); in TEST_F()
1908 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx), 0); in TEST_F()
1909 /* We copied with AT_RECURSIVE so /mnt/A must be a mountpoint. */ in TEST_F()
1913 ASSERT_EQ(move_mount(fd_tree, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1915 ASSERT_EQ(statx(-EBADF, "/tmp/target1", 0, 0, &stx), 0); in TEST_F()
1918 ASSERT_EQ(umount2("/tmp/target1", MNT_DETACH), 0); in TEST_F()
1921 * This tests whether dissolve_on_fput() handles a NULL mount in TEST_F()
1924 EXPECT_EQ(close(fd_tree), 0); in TEST_F()
1932 * |-/mnt/A testing tmpfs in TEST_F()
1933 * `-/mnt/A/AA testing tmpfs in TEST_F()
1934 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
1935 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
1937 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
1941 ASSERT_GE(fd_tree1, 0); in TEST_F()
1950 ASSERT_GE(fd_tree2, 0); in TEST_F()
1967 …T_EQ(move_mount(fd_tree1, "", fd_tree2, "", MOVE_MOUNT_F_EMPTY_PATH | MOVE_MOUNT_T_EMPTY_PATH), 0); in TEST_F()
1971 * mount, i.e., it has a parent. Specifically, it now has the in TEST_F()
1978 ASSERT_NE(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
1986 EXPECT_EQ(close(fd_tree1), 0); in TEST_F()
1989 * Attach the mount tree to a non-anonymous mount namespace. in TEST_F()
1992 * be freed. If it did this will trigger a UAF which will be in TEST_F()
2001 ASSERT_EQ(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2002 EXPECT_EQ(close(fd_tree2), 0); in TEST_F()
2012 * |-/mnt/A testing tmpfs in TEST_F()
2013 * `-/mnt/A/AA testing tmpfs in TEST_F()
2014 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
2015 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2017 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
2021 ASSERT_GE(fd_tree1, 0); in TEST_F()
2024 * Create an O_PATH file descriptors with a separate struct file in TEST_F()
2030 ASSERT_GE(fd_tree2, 0); in TEST_F()
2040 ASSERT_EQ(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2046 ASSERT_NE(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2056 * |-/mnt/A testing tmpfs in TEST_F()
2057 * `-/mnt/A/AA testing tmpfs in TEST_F()
2058 * `-/mnt/A/AA/B testing tmpfs in TEST_F()
2059 * `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2061 fd_tree1 = sys_open_tree(-EBADF, "/mnt/A", in TEST_F()
2065 ASSERT_GE(fd_tree1, 0); in TEST_F()
2068 * Create an O_PATH file descriptors with a separate struct file that in TEST_F()
2069 * refers to a subtree of the same detached mount tree as @fd_tree1 in TEST_F()
2074 ASSERT_GE(fd_tree2, 0); in TEST_F()
2077 * This must fail as it is only possible to attach the root of a in TEST_F()
2080 ASSERT_NE(move_mount(fd_tree2, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2082 ASSERT_EQ(move_mount(fd_tree1, "", -EBADF, "/tmp/target1", MOVE_MOUNT_F_EMPTY_PATH), 0); in TEST_F()
2090 ASSERT_EQ(unshare(CLONE_NEWNS), 0); in TEST_F()
2091 ASSERT_EQ(mount(NULL, "/mnt", NULL, MS_REC | MS_SHARED, NULL), 0); in TEST_F()
2097 * |-/mnt/A testing tmpfs in TEST_F()
2098 * | `-/mnt/A/AA testing tmpfs in TEST_F()
2099 * | `-/mnt/A/AA/B testing tmpfs in TEST_F()
2100 * | `-/mnt/A/AA/B/BB testing tmpfs in TEST_F()
2107 ASSERT_GE(fd_tree, 0); in TEST_F()
2109 ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx1), 0); in TEST_F()
2110 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx2), 0); in TEST_F()
2116 * information to verify that. Note that tmpfs will have a 0 in TEST_F()
2121 /* Mount a tmpfs filesystem over /mnt/A. */ in TEST_F()
2122 ASSERT_EQ(mount(NULL, "/mnt/A", "tmpfs", 0, NULL), 0); in TEST_F()
2125 ASSERT_EQ(statx(-EBADF, "/mnt/A", 0, 0, &stx3), 0); in TEST_F()
2126 ASSERT_EQ(statx(fd_tree, "A", 0, 0, &stx4), 0); in TEST_F()
2129 * A new filesystem has been mounted on top of /mnt/A which in TEST_F()
2131 * statx() that was taken from /mnt/A before the mount compared in TEST_F()
2137 EXPECT_EQ(close(fd_tree), 0); in TEST_F()