xref: /linux/fs/tests/fdtable_kunit.c (revision 501cbbd276b77d34af20ea3dd4f897c93630bac8)
1*501cbbd2SBill Wendling // SPDX-License-Identifier: GPL-2.0-only
2*501cbbd2SBill Wendling #include <kunit/test.h>
3*501cbbd2SBill Wendling #include <linux/fdtable.h>
4*501cbbd2SBill Wendling #include <linux/file.h>
5*501cbbd2SBill Wendling 
6*501cbbd2SBill Wendling static void test_alloc_fdtable(struct kunit *test)
7*501cbbd2SBill Wendling {
8*501cbbd2SBill Wendling 	struct fdtable *fdt;
9*501cbbd2SBill Wendling 	unsigned int slots = 64;
10*501cbbd2SBill Wendling 
11*501cbbd2SBill Wendling 	fdt = alloc_fdtable(slots);
12*501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
13*501cbbd2SBill Wendling 
14*501cbbd2SBill Wendling 	/* Check that max_fds is set correctly and is >= slots */
15*501cbbd2SBill Wendling 	KUNIT_EXPECT_GE(test, fdt->max_fds, slots);
16*501cbbd2SBill Wendling 
17*501cbbd2SBill Wendling 	/* Check that fd is allocated */
18*501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
19*501cbbd2SBill Wendling 
20*501cbbd2SBill Wendling 	/*
21*501cbbd2SBill Wendling 	 * Check dynamic object size of fdt->fd if compiler supports
22*501cbbd2SBill Wendling 	 * __counted_by_ptr.
23*501cbbd2SBill Wendling 	 */
24*501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
25*501cbbd2SBill Wendling 	KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0),
26*501cbbd2SBill Wendling 			fdt->max_fds * sizeof(struct file *));
27*501cbbd2SBill Wendling #endif
28*501cbbd2SBill Wendling 
29*501cbbd2SBill Wendling 	__free_fdtable(fdt);
30*501cbbd2SBill Wendling }
31*501cbbd2SBill Wendling 
32*501cbbd2SBill Wendling static void test_dup_fd(struct kunit *test)
33*501cbbd2SBill Wendling {
34*501cbbd2SBill Wendling 	struct files_struct *newf;
35*501cbbd2SBill Wendling 	struct fdtable *fdt;
36*501cbbd2SBill Wendling 
37*501cbbd2SBill Wendling 	newf = dup_fd(&init_files, NULL);
38*501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, newf);
39*501cbbd2SBill Wendling 
40*501cbbd2SBill Wendling 	fdt = rcu_dereference_raw(newf->fdt);
41*501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt);
42*501cbbd2SBill Wendling 
43*501cbbd2SBill Wendling 	/* Check that max_fds is set correctly and is >= NR_OPEN_DEFAULT */
44*501cbbd2SBill Wendling 	KUNIT_EXPECT_GE(test, fdt->max_fds, NR_OPEN_DEFAULT);
45*501cbbd2SBill Wendling 
46*501cbbd2SBill Wendling 	/* Check that fd is allocated */
47*501cbbd2SBill Wendling 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fdt->fd);
48*501cbbd2SBill Wendling 
49*501cbbd2SBill Wendling 	/*
50*501cbbd2SBill Wendling 	 * Check dynamic object size of fdt->fd if compiler supports
51*501cbbd2SBill Wendling 	 * __counted_by_ptr.
52*501cbbd2SBill Wendling 	 */
53*501cbbd2SBill Wendling #ifdef CONFIG_CC_HAS_COUNTED_BY_PTR
54*501cbbd2SBill Wendling 	KUNIT_EXPECT_EQ(test, __builtin_dynamic_object_size(fdt->fd, 0),
55*501cbbd2SBill Wendling 			fdt->max_fds * sizeof(struct file *));
56*501cbbd2SBill Wendling #endif
57*501cbbd2SBill Wendling 
58*501cbbd2SBill Wendling 	put_files_struct(newf);
59*501cbbd2SBill Wendling }
60*501cbbd2SBill Wendling 
61*501cbbd2SBill Wendling static struct kunit_case fdtable_test_cases[] = {
62*501cbbd2SBill Wendling 	KUNIT_CASE(test_alloc_fdtable),
63*501cbbd2SBill Wendling 	KUNIT_CASE(test_dup_fd),
64*501cbbd2SBill Wendling 	{}
65*501cbbd2SBill Wendling };
66*501cbbd2SBill Wendling 
67*501cbbd2SBill Wendling static struct kunit_suite fdtable_test_suite = {
68*501cbbd2SBill Wendling 	.name = "fdtable",
69*501cbbd2SBill Wendling 	.test_cases = fdtable_test_cases,
70*501cbbd2SBill Wendling };
71*501cbbd2SBill Wendling 
72*501cbbd2SBill Wendling kunit_test_suite(fdtable_test_suite);
73