// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) 2013 Fujitsu Ltd. Dan Li
* Copyright (C) 2023 SUSE LLC Andrea Cervesato
*/
/*\
* [Description]
*
* Test for feature MS_MOVE of mount, which moves an existing mount point to
* a new location.
*/
#include "tst_test.h"
#include
#include
#ifndef MS_MOVE
#define MS_MOVE 8192
#endif
#ifndef MS_PRIVATE
#define MS_PRIVATE (1 << 18)
#endif
#define MNTPOINT_SRC "mntpoint1"
#define MNTPOINT_DST "mntpoint2"
static char *tmppath;
static char mntpoint_src[PATH_MAX];
static char mntpoint_dst[PATH_MAX];
static char tstfiles_src[PATH_MAX];
static char tstfiles_dst[PATH_MAX];
static void setup(void)
{
tmppath = tst_get_tmpdir();
/*
* Turn current dir into a private mount point being a parent
* mount which is required by move mount.
*/
SAFE_MOUNT(tmppath, tmppath, "none", MS_BIND, NULL);
SAFE_MOUNT("none", tmppath, "none", MS_PRIVATE, NULL);
snprintf(mntpoint_src, PATH_MAX, "%s/%s", tmppath, MNTPOINT_SRC);
snprintf(mntpoint_dst, PATH_MAX, "%s/%s", tmppath, MNTPOINT_DST);
snprintf(tstfiles_src, PATH_MAX, "%s/%s/testfile", tmppath, MNTPOINT_SRC);
snprintf(tstfiles_dst, PATH_MAX, "%s/%s/testfile", tmppath, MNTPOINT_DST);
SAFE_MKDIR(mntpoint_dst, 0750);
}
static void cleanup(void)
{
if (tst_is_mounted(mntpoint_src))
SAFE_UMOUNT(mntpoint_src);
if (tst_is_mounted(mntpoint_dst))
SAFE_UMOUNT(mntpoint_dst);
if (tst_is_mounted(tmppath))
SAFE_UMOUNT(tmppath);
SAFE_RMDIR(mntpoint_dst);
}
static void run(void)
{
SAFE_MOUNT(tst_device->dev, mntpoint_src, tst_device->fs_type, 0, NULL);
SAFE_FILE_PRINTF(tstfiles_src, "LTP TEST FILE");
SAFE_MOUNT(mntpoint_src, mntpoint_dst, tst_device->fs_type, MS_MOVE, NULL);
TST_EXP_FAIL(
access(tstfiles_src, F_OK),
ENOENT,
"File %s doesn't exist",
tstfiles_src);
TST_EXP_PASS(
access(tstfiles_dst, F_OK),
"File %s exists :",
tstfiles_dst);
if (tst_is_mounted(mntpoint_src))
SAFE_UMOUNT(mntpoint_src);
if (tst_is_mounted(mntpoint_dst))
SAFE_UMOUNT(mntpoint_dst);
}
static struct tst_test test = {
.setup = setup,
.cleanup = cleanup,
.test_all = run,
.needs_root = 1,
.format_device = 1,
.mntpoint = MNTPOINT_SRC,
.all_filesystems = 1,
.skip_filesystems = (const char *const []){
"exfat",
"vfat",
"ntfs",
NULL
},
};