This adds a KUnit test suite for fdtable to verify correct allocation,
max_fds initialization, and dynamic object size of the fd array under
__counted_by_ptr when CONFIG_CC_HAS_COUNTED_BY_PTR is enabled.

This patch was generated by CodeMender and checked by submitter.

Cc: [email protected]
Signed-off-by: Bill Wendling <[email protected]>
---
Cc: Alexander Viro <[email protected]>
Cc: Christian Brauner <[email protected]>
Cc: Jan Kara <[email protected]>
Cc: Kees Cook <[email protected]>
Cc: "Gustavo A. R. Silva" <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
 fs/Kconfig               |  8 ++++++++
 fs/file.c                |  4 ++++
 fs/tests/.kunitconfig    |  2 ++
 fs/tests/fdtable_kunit.c | 40 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 54 insertions(+)
 create mode 100644 fs/tests/.kunitconfig
 create mode 100644 fs/tests/fdtable_kunit.c

diff --git a/fs/Kconfig b/fs/Kconfig
index cf6ae64776e6..f4b9235ab883 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -423,4 +423,12 @@ source "fs/unicode/Kconfig"
 config IO_WQ
        bool
 
+config FDTABLE_KUNIT_TEST
+       bool "KUnit test for fdtable" if !KUNIT_ALL_TESTS
+       depends on KUNIT=y
+       default KUNIT_ALL_TESTS
+       help
+         This builds the fdtable KUnit tests, which tests various aspects
+         of the fdtable structure and allocation.
+
 endmenu
diff --git a/fs/file.c b/fs/file.c
index 628ca07dc4b1..9c7001b901cf 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -1529,3 +1529,7 @@ int iterate_fd(struct files_struct *files, unsigned n,
        return res;
 }
 EXPORT_SYMBOL(iterate_fd);
+
+#ifdef CONFIG_FDTABLE_KUNIT_TEST
+#include "tests/fdtable_kunit.c"
+#endif
diff --git a/fs/tests/.kunitconfig b/fs/tests/.kunitconfig
new file mode 100644
index 000000000000..de67125a9421
--- /dev/null
+++ b/fs/tests/.kunitconfig
@@ -0,0 +1,2 @@
+CONFIG_KUNIT=y
+CONFIG_FDTABLE_KUNIT_TEST=y
diff --git a/fs/tests/fdtable_kunit.c b/fs/tests/fdtable_kunit.c
new file mode 100644
index 000000000000..41bae6b7400f
--- /dev/null
+++ b/fs/tests/fdtable_kunit.c
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <kunit/test.h>
+#include <linux/fdtable.h>
+#include <linux/file.h>
+
+static void fdtable_test_alloc(struct kunit *test)
+{
+       struct fdtable *fdt;
+       unsigned int slots = 64;
+
+       fdt = alloc_fdtable(slots);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
+
+       /* Check that max_fds is set correctly and is >= slots */
+       KUNIT_EXPECT_GE(test, fdt->max_fds, slots);
+
+       /* Check that fd is allocated */
+       KUNIT_EXPECT_NOT_ERR_OR_NULL(test, fdt->fd);
+
+       /* Check dynamic object size of fdt->fd if compiler supports 
__counted_by_ptr */
+#ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
+       KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0),
+                       fdt->max_fds * sizeof(struct file *));
+#endif
+
+       /* Free the fdtable */
+       __free_fdtable(fdt);
+}
+
+static struct kunit_case fdtable_test_cases[] = {
+       KUNIT_CASE(fdtable_test_alloc),
+       {}
+};
+
+static struct kunit_suite fdtable_test_suite = {
+       .name = "fdtable",
+       .test_cases = fdtable_test_cases,
+};
+
+kunit_test_suite(fdtable_test_suite);
-- 
2.55.0.679.g6767b8d81c-goog


Reply via email to