xref: /linux/fs/tests/fdtable_kunit.c (revision a1d4585be12feb09b3e66d312ceb200234164660)
1501cbbd2SBill Wendling // SPDX-License-Identifier: GPL-2.0-only
2501cbbd2SBill Wendling #include <kunit/test.h>
3501cbbd2SBill Wendling #include <linux/fdtable.h>
4501cbbd2SBill Wendling #include <linux/file.h>
5501cbbd2SBill Wendling 
test_alloc_fdtable(struct kunit * test)6501cbbd2SBill Wendling static void test_alloc_fdtable(struct kunit *test)
7501cbbd2SBill Wendling {
8501cbbd2SBill Wendling 	struct fdtable *fdt;
9501cbbd2SBill Wendling 	unsigned int slots = 64;
10501cbbd2SBill Wendling 
11501cbbd2SBill Wendling 	fdt = alloc_fdtable(slots);
12501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
13501cbbd2SBill Wendling 
14501cbbd2SBill Wendling 	/* Check that max_fds is set correctly and is >= slots */
15501cbbd2SBill Wendling 	KUNIT_EXPECT_GE(test, fdt->max_fds, slots);
16501cbbd2SBill Wendling 
17501cbbd2SBill Wendling 	/* Check that fd is allocated */
18501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
19501cbbd2SBill Wendling 
20501cbbd2SBill Wendling 	/*
21501cbbd2SBill Wendling 	 * Check dynamic object size of fdt->fd if compiler supports
22501cbbd2SBill Wendling 	 * __counted_by_ptr.
23501cbbd2SBill Wendling 	 */
24501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
25*07d35cecSChristian Brauner 	KUNIT_EXPECT_EQ(test, __struct_size(fdt->fd),
26501cbbd2SBill Wendling 			fdt->max_fds * sizeof(struct file *));
27501cbbd2SBill Wendling #endif
28501cbbd2SBill Wendling 
29501cbbd2SBill Wendling 	__free_fdtable(fdt);
30501cbbd2SBill Wendling }
31501cbbd2SBill Wendling 
test_dup_fd(struct kunit * test)32501cbbd2SBill Wendling static void test_dup_fd(struct kunit *test)
33501cbbd2SBill Wendling {
34501cbbd2SBill Wendling 	struct files_struct *newf;
35501cbbd2SBill Wendling 	struct fdtable *fdt;
36501cbbd2SBill Wendling 
37501cbbd2SBill Wendling 	newf = dup_fd(&init_files, NULL);
38501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, newf);
39501cbbd2SBill Wendling 
40501cbbd2SBill Wendling 	fdt = rcu_dereference_raw(newf->fdt);
41501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
42501cbbd2SBill Wendling 
43501cbbd2SBill Wendling 	/* Check that max_fds is set correctly and is >= NR_OPEN_DEFAULT */
44501cbbd2SBill Wendling 	KUNIT_EXPECT_GE(test, fdt->max_fds, NR_OPEN_DEFAULT);
45501cbbd2SBill Wendling 
46501cbbd2SBill Wendling 	/* Check that fd is allocated */
47501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
48501cbbd2SBill Wendling 
49501cbbd2SBill Wendling 	/*
50501cbbd2SBill Wendling 	 * Check dynamic object size of fdt->fd if compiler supports
51501cbbd2SBill Wendling 	 * __counted_by_ptr.
52501cbbd2SBill Wendling 	 */
53501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
54*07d35cecSChristian Brauner 	KUNIT_EXPECT_EQ(test, __struct_size(fdt->fd),
55501cbbd2SBill Wendling 			fdt->max_fds * sizeof(struct file *));
56501cbbd2SBill Wendling #endif
57501cbbd2SBill Wendling 
58501cbbd2SBill Wendling 	put_files_struct(newf);
59501cbbd2SBill Wendling }
60501cbbd2SBill Wendling 
61501cbbd2SBill Wendling static struct kunit_case fdtable_test_cases[] = {
62501cbbd2SBill Wendling 	KUNIT_CASE(test_alloc_fdtable),
63501cbbd2SBill Wendling 	KUNIT_CASE(test_dup_fd),
64501cbbd2SBill Wendling 	{}
65501cbbd2SBill Wendling };
66501cbbd2SBill Wendling 
67501cbbd2SBill Wendling static struct kunit_suite fdtable_test_suite = {
68501cbbd2SBill Wendling 	.name = "fdtable",
69501cbbd2SBill Wendling 	.test_cases = fdtable_test_cases,
70501cbbd2SBill Wendling };
71501cbbd2SBill Wendling 
72501cbbd2SBill Wendling kunit_test_suite(fdtable_test_suite);
73