From: Avinesh Kumar via ltp <ltp@lists.linux.it>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH] syscalls: rename11: Convert test to new API
Date: Thu, 13 Aug 2026 21:26:48 +0200 [thread overview]
Message-ID: <20260813192649.192136-1-avinesh.kumar@suse.com> (raw)
From: Avinesh Kumar <avinesh.kumar@suse.com>
Signed-off-by: Avinesh Kumar <avinesh.kumar@suse.com>
---
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 <wangxg.fnst@cn.fujitsu.com>
- *
- * 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 <avinesh.kumar@suse.com>
*/
-/*
- * 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
next reply other threads:[~2026-08-13 19:27 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-13 19:26 Avinesh Kumar via ltp [this message]
2026-08-13 20:44 ` [LTP] syscalls: rename11: Convert test to new API linuxtestproject.agent
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260813192649.192136-1-avinesh.kumar@suse.com \
--to=ltp@lists.linux.it \
--cc=avinesh.kumar@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox