From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 11FD8255F33; Mon, 14 Jul 2025 14:12:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752502333; cv=none; b=RfsDDUMT1YkMTjDZUin3cdLCXtBVEbqn0E5eWyeikiIauyWVluXUOIWmk2pBNwLU80bkmu1/rA862+7q4gKIIBGK5EIEdxxM2Kd5h+6GRQgPR0nUnyODmxOihfQKGZg6dQQS+4gBxi/F8D+BSrSedSJm/FoEuiXmH1pMnKqccmg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752502333; c=relaxed/simple; bh=4LCta4AcPLkHFIbPLGXR+o9N2HzgQeovSeXRL839j+k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PazZ1KA1On/9D9t2EWimKVtYei+2ynkqLAH5SvfQVlySVZ+/joBl/VPT1QjPaNewQ8JNHzlXYM0AKmurRQNZkqHcV0/8smUIPY7UGATzEBaqEPXc79W8czOa0H84zIThsC0E7xMjign86IpY6QYI3FpisDj7/4DlnKPhzGwaZ4A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VIG4NKl/; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VIG4NKl/" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 68487C4CEED; Mon, 14 Jul 2025 14:12:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752502332; bh=4LCta4AcPLkHFIbPLGXR+o9N2HzgQeovSeXRL839j+k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VIG4NKl/nlGjqld3dthVXd37Cqr8FLwTXtFq0a8+kTp+e+mLjRbXltl6/27YFOSMl w3VOUstiBa5zYx/FbLoMKe+XWWLlfx8C3+hEuL+yySTD+HjIghxDSpxTSrUb+PQx8E O9PxH3QRaYwSDIjc5LW9t5m4JHKLAJNrxCVjmYIQ4zyBiK4aG+Y2mKZxgxNx00TOPp BPspFrAzZu+jPlic6BzeLuhE5yWX6rwbsmUUW3+j06I0fqlb7qCrohcKqW2tPnAPBc QjunBxdrWRKopNk6DqNCKMzTQLbZri5I/MXwvlrod/6PiZ44fmL6h/MhArjQ3gqcmL 5uzDS74xlgG9g== From: Mark Brown Date: Mon, 14 Jul 2025 15:03:35 +0100 Subject: [PATCH 1/2] selftests/fchmodat2: Clean up temporary files and directories Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-selftests-fchmodat2-v1-1-b74f3ee0d09c@kernel.org> References: <20250714-selftests-fchmodat2-v1-0-b74f3ee0d09c@kernel.org> In-Reply-To: <20250714-selftests-fchmodat2-v1-0-b74f3ee0d09c@kernel.org> To: Shuah Khan , Alexey Gladkov , Christian Brauner Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=7319; i=broonie@kernel.org; h=from:subject:message-id; bh=4LCta4AcPLkHFIbPLGXR+o9N2HzgQeovSeXRL839j+k=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBodRA3xVa8wlKFi2iGOj7QXYD6I6fmA4YDSy9QR 5BqD8zRbUCJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaHUQNwAKCRAk1otyXVSH 0KFCB/43PPT36yxbtn1JltjRV0VnGceR77jnZqzAhleO7YrEXq3c/NfcO00qFc4GvsQmXwFzrzB tncWBqynoKQ+JykE64n0SOralEt7WPPPm9m10M+LgN8J2IN3Sa4rKScL33fvloE8HqOmriPbckn 3wAKfaeQmwEb+bYzhlISkC/k6ukd/Ip3zo3kADCP/9P+UseMWdGNvSTMOlDXAmeo/By/CF8WiIl 286gwKFAmfLnsCmHYXjMsWy+Ypa+29QQO1gcUWdVz9P7VebNOAGZ4gRyhjtLLS3Dk9jo/AIIp+o 2QYou+1eY8GLIrZcKuPKxd55MZLN9HxiOQVRaxTolJFCn7+n X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB The fchmodat2() test program creates a temporary directory with a file and a symlink for every test it runs but never cleans these up, resulting in ${TMPDIR} getting left with stale files after every run. Restructure the program a bit to ensure that we clean these up, this is more invasive than it might otherwise be due to the extensive use of ksft_exit_fail_msg() in the program. As a side effect this also ensures that we report a consistent test name for the tests and always try both tests even if they are skipped. Signed-off-by: Mark Brown --- tools/testing/selftests/fchmodat2/fchmodat2_test.c | 161 ++++++++++++++---= ---- 1 file changed, 111 insertions(+), 50 deletions(-) diff --git a/tools/testing/selftests/fchmodat2/fchmodat2_test.c b/tools/tes= ting/selftests/fchmodat2/fchmodat2_test.c index e0319417124d..e977d942c00b 100644 --- a/tools/testing/selftests/fchmodat2/fchmodat2_test.c +++ b/tools/testing/selftests/fchmodat2/fchmodat2_test.c @@ -9,6 +9,11 @@ =20 #include "../kselftest.h" =20 +struct testdir { + char *dirname; + int dfd; +}; + int sys_fchmodat2(int dfd, const char *filename, mode_t mode, int flags) { int ret =3D syscall(__NR_fchmodat2, dfd, filename, mode, flags); @@ -16,9 +21,9 @@ int sys_fchmodat2(int dfd, const char *filename, mode_t m= ode, int flags) return ret >=3D 0 ? ret : -errno; } =20 -int setup_testdir(void) +static void setup_testdir(struct testdir *testdir) { - int dfd, ret; + int ret, dfd; char dirname[] =3D "/tmp/ksft-fchmodat2.XXXXXX"; =20 /* Make the top-level directory. */ @@ -26,21 +31,48 @@ int setup_testdir(void) ksft_exit_fail_msg("%s: failed to create tmpdir\n", __func__); =20 dfd =3D open(dirname, O_PATH | O_DIRECTORY); - if (dfd < 0) - ksft_exit_fail_msg("%s: failed to open tmpdir\n", __func__); + if (dfd < 0) { + ksft_perror("failed to open tmpdir"); + goto err; + } =20 ret =3D openat(dfd, "regfile", O_CREAT | O_WRONLY | O_TRUNC, 0644); - if (ret < 0) - ksft_exit_fail_msg("%s: failed to create file in tmpdir\n", - __func__); + if (ret < 0) { + ksft_perror("failed to create file in tmpdir"); + goto err; + } close(ret); =20 ret =3D symlinkat("regfile", dfd, "symlink"); - if (ret < 0) - ksft_exit_fail_msg("%s: failed to create symlink in tmpdir\n", - __func__); + if (ret < 0) { + ksft_perror("symlinkat() failed"); + goto err_regfile; + } + + testdir->dirname =3D strdup(dirname); + if (!testdir->dirname) { + ksft_perror("Out of memory"); + goto err_symlink; + } + testdir->dfd =3D dfd; + + return; + +err_symlink: + unlinkat(testdir->dfd, "symlink", 0); +err_regfile: + unlinkat(testdir->dfd, "regfile", 0); +err: + unlink(dirname); + ksft_exit_fail(); +} =20 - return dfd; +static void cleanup_testdir(struct testdir *testdir) +{ + unlinkat(testdir->dfd, "regfile", 0); + unlinkat(testdir->dfd, "symlink", 0); + rmdir(testdir->dirname); + free(testdir->dirname); } =20 int expect_mode(int dfd, const char *filename, mode_t expect_mode) @@ -48,61 +80,80 @@ int expect_mode(int dfd, const char *filename, mode_t e= xpect_mode) struct stat st; int ret =3D fstatat(dfd, filename, &st, AT_SYMLINK_NOFOLLOW); =20 - if (ret) - ksft_exit_fail_msg("%s: %s: fstatat failed\n", - __func__, filename); + if (ret) { + ksft_perror("fstatat() failed\n"); + return 0; + } =20 return (st.st_mode =3D=3D expect_mode); } =20 void test_regfile(void) { - int dfd, ret; - - dfd =3D setup_testdir(); + struct testdir testdir; + int ret; =20 - ret =3D sys_fchmodat2(dfd, "regfile", 0640, 0); + setup_testdir(&testdir); =20 - if (ret < 0) - ksft_exit_fail_msg("%s: fchmodat2(noflag) failed\n", __func__); - - if (!expect_mode(dfd, "regfile", 0100640)) - ksft_exit_fail_msg("%s: wrong file mode bits after fchmodat2\n", - __func__); + ret =3D sys_fchmodat2(testdir.dfd, "regfile", 0640, 0); =20 - ret =3D sys_fchmodat2(dfd, "regfile", 0600, AT_SYMLINK_NOFOLLOW); + if (ret < 0) { + ksft_perror("fchmodat2(noflag) failed"); + goto out; + } =20 - if (ret < 0) - ksft_exit_fail_msg("%s: fchmodat2(AT_SYMLINK_NOFOLLOW) failed\n", + if (!expect_mode(testdir.dfd, "regfile", 0100640)) { + ksft_print_msg("%s: wrong file mode bits after fchmodat2\n", __func__); - - if (!expect_mode(dfd, "regfile", 0100600)) - ksft_exit_fail_msg("%s: wrong file mode bits after fchmodat2 with nofoll= ow\n", - __func__); - - ksft_test_result_pass("fchmodat2(regfile)\n"); + ret =3D 1; + goto out; + } + + ret =3D sys_fchmodat2(testdir.dfd, "regfile", 0600, AT_SYMLINK_NOFOLLOW); + + if (ret < 0) { + ksft_perror("fchmodat2(AT_SYMLINK_NOFOLLOW) failed"); + goto out; + } + + if (!expect_mode(testdir.dfd, "regfile", 0100600)) { + ksft_print_msg("%s: wrong file mode bits after fchmodat2 with nofollow\n= ", + __func__); + ret =3D 1; + } + +out: + ksft_test_result(ret =3D=3D 0, "fchmodat2(regfile)\n"); + cleanup_testdir(&testdir); } =20 void test_symlink(void) { - int dfd, ret; + struct testdir testdir; + int ret; =20 - dfd =3D setup_testdir(); + setup_testdir(&testdir); =20 - ret =3D sys_fchmodat2(dfd, "symlink", 0640, 0); + ret =3D sys_fchmodat2(testdir.dfd, "symlink", 0640, 0); =20 - if (ret < 0) - ksft_exit_fail_msg("%s: fchmodat2(noflag) failed\n", __func__); + if (ret < 0) { + ksft_perror("fchmodat2(noflag) failed"); + goto err; + } =20 - if (!expect_mode(dfd, "regfile", 0100640)) - ksft_exit_fail_msg("%s: wrong file mode bits after fchmodat2\n", - __func__); + if (!expect_mode(testdir.dfd, "regfile", 0100640)) { + ksft_print_msg("%s: wrong file mode bits after fchmodat2\n", + __func__); + goto err; + } =20 - if (!expect_mode(dfd, "symlink", 0120777)) - ksft_exit_fail_msg("%s: wrong symlink mode bits after fchmodat2\n", - __func__); + if (!expect_mode(testdir.dfd, "symlink", 0120777)) { + ksft_print_msg("%s: wrong symlink mode bits after fchmodat2\n", + __func__); + goto err; + } =20 - ret =3D sys_fchmodat2(dfd, "symlink", 0600, AT_SYMLINK_NOFOLLOW); + ret =3D sys_fchmodat2(testdir.dfd, "symlink", 0600, AT_SYMLINK_NOFOLLOW); =20 /* * On certain filesystems (xfs or btrfs), chmod operation fails. So we @@ -111,18 +162,28 @@ void test_symlink(void) * * https://sourceware.org/legacy-ml/libc-alpha/2020-02/msg00467.html */ - if (ret =3D=3D 0 && !expect_mode(dfd, "symlink", 0120600)) - ksft_exit_fail_msg("%s: wrong symlink mode bits after fchmodat2 with nof= ollow\n", + if (ret =3D=3D 0 && !expect_mode(testdir.dfd, "symlink", 0120600)) { + ksft_print_msg("%s: wrong symlink mode bits after fchmodat2 with nofollo= w\n", __func__); + ret =3D 1; + goto err; + } =20 - if (!expect_mode(dfd, "regfile", 0100640)) - ksft_exit_fail_msg("%s: wrong file mode bits after fchmodat2 with nofoll= ow\n", - __func__); + if (!expect_mode(testdir.dfd, "regfile", 0100640)) { + ksft_print_msg("%s: wrong file mode bits after fchmodat2 with nofollow\n= ", + __func__); + } =20 if (ret !=3D 0) ksft_test_result_skip("fchmodat2(symlink)\n"); else ksft_test_result_pass("fchmodat2(symlink)\n"); + cleanup_testdir(&testdir); + return; + +err: + ksft_test_result_fail("fchmodat2(symlink)\n"); + cleanup_testdir(&testdir); } =20 #define NUM_TESTS 2 --=20 2.39.5 From nobody Tue Oct 7 05:24:04 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A63972571A5; Mon, 14 Jul 2025 14:12:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752502335; cv=none; b=qGc6r2C/G0MH67TkrYv72F9ZvQWhCOsYrI3xHaWDTybtiXzPx6Hy1ojFKJutN4ha7P1l8eHrKnD/aHbP13uRctOsGiz3qhgrFXJcqbbGUZWlYNl9+Enh1VGS43EuVB/eRRTfNv4eyoLaQoO/j2gdu0sN8LMxRhD6+FQ85uf0vyo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752502335; c=relaxed/simple; bh=4YMzC/UP5j9ONXIT+pgGQsuo5xL6W9saqp3GH+DFxd8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=m+52AoJLq+lDG7rGZnZ12hUoNPU6IseFlUp7TdQ7S+LHOewiGgUnIETE/+jwCvLnvCJn8w9T7V6UqkNmV+VN3DQd89Yzj+3EClnGTWZInz2ZwhHi2aeLdrYVfifn5RSXo+JpqCASG9pehcAEIomAO64qni0XNoJS/JeFop5adIc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CysqORFb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CysqORFb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 07797C4CEF0; Mon, 14 Jul 2025 14:12:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752502334; bh=4YMzC/UP5j9ONXIT+pgGQsuo5xL6W9saqp3GH+DFxd8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=CysqORFb3xC8ZG6E8HU1d/Sxvgowb2lCUs6fO4R7hhP1ApCHr0+97Ypuy1/ns6zEY CLw45FEWcShhxVrMhpBV9NddleL8HjTJqY34VE1frCH5mPKBSciUcEA++4vT67rI1y JvEzfBP45vAAJdzJK/Y3dnX9Fweq1wwxN3n21HvtBSFCuLK6sxBo9LmyBVuoA8FUzn t0GXG1x7M6hN4FcF5AHG4E7hmPmhFB/j2DkUfCpGOkE2O2B/cZgPCCSZHiv8uPj6mN GaKjZ9cD/bQfTCbkdmXgYc/ew5Ck8NaRs2OsIFyKbW9TIbfR7rWLfqZTRIcfVTJ2oW gkw6uDtosgxbA== From: Mark Brown Date: Mon, 14 Jul 2025 15:03:36 +0100 Subject: [PATCH 2/2] selftests/fchmodat2: Use ksft_finished() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250714-selftests-fchmodat2-v1-2-b74f3ee0d09c@kernel.org> References: <20250714-selftests-fchmodat2-v1-0-b74f3ee0d09c@kernel.org> In-Reply-To: <20250714-selftests-fchmodat2-v1-0-b74f3ee0d09c@kernel.org> To: Shuah Khan , Alexey Gladkov , Christian Brauner Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=780; i=broonie@kernel.org; h=from:subject:message-id; bh=4YMzC/UP5j9ONXIT+pgGQsuo5xL6W9saqp3GH+DFxd8=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBodRA3ok4ladySzTp+/5wpGWVhgh+6kUr2lRCTS u8Y2U7CQQyJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaHUQNwAKCRAk1otyXVSH 0HSLB/9IpFW9TNpPUNwBMo7mGE0IA+8mQNgdLfWpjIR2sCvuCiA7YYon9KnZ2yDd2IcBE5fCdiw n2Rm5fzKtC8nPfFZrU0S9aFsvmdu/bHVGugEuC9bEBmT9z7Il90Q9ybma1eVz8vvZAU/J3FQYjP WJ66fRtU1oY4RbJ4lOlNgiGPh/+4/zucdP2P3UwaedW2bGnQmd70SsZ1c4MgugFvs7FOelzWzwo ewAlVlYaoMVpfWiVIdoclgqlFGvqZXRSf0NyWnLcIctDQfKXdgW7sjWWG5l5rylXZfkmqJq7A0X 4eM1sUR5jXEIlslBwMJe0ufeNkt4TbNGvp534Ifl2oMCUpAk X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB The fchmodat2 test program open codes a version of ksft_finished(), use the standard version. Signed-off-by: Mark Brown --- tools/testing/selftests/fchmodat2/fchmodat2_test.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/testing/selftests/fchmodat2/fchmodat2_test.c b/tools/tes= ting/selftests/fchmodat2/fchmodat2_test.c index e977d942c00b..d3682ccd7cb8 100644 --- a/tools/testing/selftests/fchmodat2/fchmodat2_test.c +++ b/tools/testing/selftests/fchmodat2/fchmodat2_test.c @@ -196,8 +196,5 @@ int main(int argc, char **argv) test_regfile(); test_symlink(); =20 - if (ksft_get_fail_cnt() + ksft_get_error_cnt() > 0) - ksft_exit_fail(); - else - ksft_exit_pass(); + ksft_finished(); } --=20 2.39.5