[LTP] [PATCH] syscalls: rename11: Convert test to new API
Avinesh Kumar via ltp <[email protected]>
| Newsgroups | it.linux.lists.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Avinesh Kumar <[email protected]> Signed-off-by: Avinesh Kumar <[email protected]> --- testcases/kernel/syscalls/rename/rename11.c | 215 +++++++------------- 1 file changed, 71 insertions(+), 144 deletions(-) diff --git a/testcases/kernel/syscalls/rename/rename11.c b/testcases/kernel/syscalls/rename/rename11.c index 26e324d646db..88dd7e2a86c7 100644 --- a/testcases/kernel/syscalls/rename/rename11.c +++ b/testcases/kernel/syscalls/rename/rename11.c @@ -1,187 +1,114 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2014 Fujitsu Ltd. * Author: Xiaoguang Wang <[email protected]> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See - * the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (c) 2026 Avinesh Kumar <[email protected]> */ -/* - * Test Description: - * Verify that, - * 1. rename() fails with -1 return value and sets errno to ELOOP, if too - * many symbolic links were encountered in resolving oldpath or newpath. - * 2. rename() fails with -1 return value and sets errno to EROFS, - * if the file is on a read-only file system. - * 3. rename() fails with -1 return value and sets errno to EMLINK, - * if the file named by old is a directory and the link count of - * the parent directory of new would exceed {LINK_MAX}. +/*\ + * Verify that :manpage:`rename(2)` fails with: + * + * - ``ELOOP`` when too many symbolic links are encountered while resolving + * oldpath or newpath. + * - ``EROFS`` when the file is on a read-only file system. + * - ``EMLINK`` when oldpath is a directory and the link count of the parent + * directory of newpath would exceed ``LINK_MAX``. */ -#include <stdio.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> #include <sys/mount.h> -#include "test.h" -#include "tso_safe_macros.h" - -char *TCID = "rename11"; +#include "tst_test.h" #define MNTPOINT "mntpoint" -#define TEST_EROFS "mntpoint/test_erofs" -#define TEST_NEW_EROFS "mntpoint/new_test_erofs" +#define TEST_EROFS MNTPOINT "/test_erofs" +#define TEST_NEW_EROFS MNTPOINT "/new_test_erofs" #define TEST_EMLINK "test_emlink" #define TEST_NEW_EMLINK "emlink_dir/testdir" #define TEST_NEW_ELOOP "new_test_eloop" -#define ELOPFILE "/test_eloop" -static char elooppathname[sizeof(ELOPFILE) * 43] = "."; -static int max_subdirs; +#define ELOOPFILE "/test_eloop" -static const char *device; -static const char *fs_type; -static int mount_flag; - -static void cleanup(void); -static void setup(void); -static void test_eloop(void); -static void test_erofs(void); -static void test_emlink(void); - -static void (*testfunc[])(void) = { test_eloop, test_erofs, test_emlink }; - -int TST_TOTAL = ARRAY_SIZE(testfunc); +static char elooppathname[sizeof(ELOOPFILE) * 43] = "."; +static int max_subdirs; -int main(int ac, char **av) +static void test_eloop(void) { - int lc, i; - - tst_parse_opts(ac, av, NULL, NULL); + TST_EXP_FAIL(rename(elooppathname, TEST_NEW_ELOOP), ELOOP); - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - tst_count = 0; - - for (i = 0; i < TST_TOTAL; i++) - (*testfunc[i])(); - } - - cleanup(); - tst_exit(); + if (!TST_RET) + SAFE_UNLINK(TEST_NEW_ELOOP); } -static void setup(void) +static void test_erofs(void) { - int i; - - tst_sig(FORK, DEF_HANDLER, cleanup); - - tst_require_root(); - - tst_tmpdir(); - - TEST_PAUSE; - - fs_type = tst_dev_fs_type(); - device = tst_acquire_device(cleanup); - - if (!device) - tst_brkm(TCONF, cleanup, "Failed to obtain block device"); + SAFE_MOUNT(tst_device->dev, MNTPOINT, tst_device->fs_type, + MS_REMOUNT | MS_RDONLY, NULL); - tst_mkfs(cleanup, device, fs_type, NULL, NULL); + TST_EXP_FAIL(rename(TEST_EROFS, TEST_NEW_EROFS), EROFS); - SAFE_MKDIR(cleanup, MNTPOINT, 0755); - SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL); - mount_flag = 1; - SAFE_TOUCH(cleanup, TEST_EROFS, 0644, NULL); + if (!TST_RET) + SAFE_UNLINK(TEST_NEW_EROFS); - SAFE_MKDIR(cleanup, TEST_EMLINK, 0755); - max_subdirs = tst_fs_fill_subdirs(cleanup, "emlink_dir"); - /* - * NOTE: the ELOOP test is written based on that the consecutive - * symlinks limits in kernel is hardwired to 40. - */ - SAFE_MKDIR(cleanup, "test_eloop", 0644); - SAFE_SYMLINK(cleanup, "../test_eloop", "test_eloop/test_eloop"); - for (i = 0; i < 43; i++) - strcat(elooppathname, ELOPFILE); + SAFE_MOUNT(tst_device->dev, MNTPOINT, tst_device->fs_type, + MS_REMOUNT, NULL); } -static void check_and_print(int expected_errno) +static void test_emlink(void) { - if (TEST_RETURN == -1) { - if (TEST_ERRNO == expected_errno) { - tst_resm(TPASS | TTERRNO, "failed as expected"); - } else { - tst_resm(TFAIL | TTERRNO, - "failed unexpectedly; expected - %d : %s", - expected_errno, strerror(expected_errno)); - } - } else { - tst_resm(TFAIL, "rename succeeded unexpectedly"); + if (!max_subdirs) { + tst_res(TCONF, "EMLINK test is not appropriate"); + return; } -} -static void test_eloop(void) -{ - TEST(rename(elooppathname, TEST_NEW_ELOOP)); - check_and_print(ELOOP); + TST_EXP_FAIL(rename(TEST_EMLINK, TEST_NEW_EMLINK), EMLINK); - if (TEST_RETURN == 0) - SAFE_UNLINK(cleanup, TEST_NEW_ELOOP); + if (!TST_RET) + SAFE_RMDIR(TEST_NEW_EMLINK); } -static void test_erofs(void) -{ - SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, MS_REMOUNT | MS_RDONLY, - NULL); - - TEST(rename(TEST_EROFS, TEST_NEW_EROFS)); - check_and_print(EROFS); - - if (TEST_RETURN == 0) - SAFE_UNLINK(cleanup, TEST_NEW_EROFS); +static struct tcase { + void (*run)(void); + const char *tname; +} tcases[] = { + {test_eloop, "eloop"}, + {test_erofs, "erofs"}, + {test_emlink, "emlink"}, +}; - SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, MS_REMOUNT, NULL); -} - -static void test_emlink(void) +static void run(unsigned int n) { - if (max_subdirs == 0) { - tst_resm(TCONF, "EMLINK test is not appropriate"); - return; - } - - TEST(rename(TEST_EMLINK, TEST_NEW_EMLINK)); - check_and_print(EMLINK); + struct tcase *tc = &tcases[n]; - if (TEST_RETURN == 0) - SAFE_RMDIR(cleanup, TEST_NEW_EMLINK); + tst_res(TINFO, "Testing %s", tc->tname); + tc->run(); } -static void cleanup(void) +static void setup(void) { - if (mount_flag && tst_umount(MNTPOINT) < 0) - tst_resm(TWARN | TERRNO, "umount device:%s failed", device); + unsigned int i; + + SAFE_TOUCH(TEST_EROFS, 0644, NULL); - if (device) - tst_release_device(device); + SAFE_MKDIR(TEST_EMLINK, 0755); + max_subdirs = tst_fs_fill_subdirs("emlink_dir"); - tst_rmdir(); + /* + * The ELOOP test assumes the kernel's consecutive symlink resolution + * limit (MAXSYMLINKS) is hardcoded to 40. + */ + SAFE_MKDIR("test_eloop", 0644); + SAFE_SYMLINK("../test_eloop", "test_eloop/test_eloop"); + for (i = 0; i < 43; i++) + strcat(elooppathname, ELOOPFILE); } + +static struct tst_test test = { + .test = run, + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, + .needs_root = 1, + .needs_tmpdir = 1, + .mount_device = 1, + .mntpoint = MNTPOINT +}; -- 2.55.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp