1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org> 4 * 5 * Basic open_tree() test. 6 */ 7#include "tst_test.h" 8#include "lapi/fsmount.h" 9 10#define MNTPOINT "mntpoint" 11#define OT_MNTPOINT "ot_mntpoint" 12 13#define TCASE_ENTRY(_flags) {.name = "Flag " #_flags, .flags = _flags} 14 15static struct tcase { 16 char *name; 17 unsigned int flags; 18} tcases[] = { 19 TCASE_ENTRY(OPEN_TREE_CLONE), 20 TCASE_ENTRY(OPEN_TREE_CLOEXEC) 21}; 22 23static int dir_created; 24 25static void cleanup(void) 26{ 27 if (dir_created) 28 SAFE_RMDIR(OT_MNTPOINT); 29} 30 31static void setup(void) 32{ 33 fsopen_supported_by_kernel(); 34 SAFE_MKDIR(OT_MNTPOINT, 0777); 35 dir_created = 1; 36} 37 38static void run(unsigned int n) 39{ 40 struct tcase *tc = &tcases[n]; 41 int otfd; 42 43 TEST(otfd = open_tree(AT_FDCWD, MNTPOINT, tc->flags | OPEN_TREE_CLONE)); 44 if (otfd == -1) { 45 tst_res(TFAIL | TTERRNO, "open_tree() failed"); 46 return; 47 } 48 49 TEST(move_mount(otfd, "", AT_FDCWD, OT_MNTPOINT, 50 MOVE_MOUNT_F_EMPTY_PATH)); 51 SAFE_CLOSE(otfd); 52 53 if (TST_RET == -1) { 54 tst_res(TFAIL | TTERRNO, "move_mount() failed"); 55 return; 56 } 57 58 if (tst_is_mounted_at_tmpdir(OT_MNTPOINT)) { 59 SAFE_UMOUNT(OT_MNTPOINT); 60 tst_res(TPASS, "%s: open_tree() passed", tc->name); 61 } 62} 63 64static struct tst_test test = { 65 .tcnt = ARRAY_SIZE(tcases), 66 .test = run, 67 .setup = setup, 68 .cleanup = cleanup, 69 .needs_root = 1, 70 .mount_device = 1, 71 .mntpoint = MNTPOINT, 72 .all_filesystems = 1, 73 .skip_filesystems = (const char *const []){"fuse", NULL}, 74}; 75