]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/namespaces: third listns() test
authorChristian Brauner <brauner@kernel.org>
Wed, 29 Oct 2025 12:20:54 +0000 (13:20 +0100)
committerChristian Brauner <brauner@kernel.org>
Mon, 3 Nov 2025 16:41:21 +0000 (17:41 +0100)
Test listns() pagination.
List namespaces in batches.

Link: https://patch.msgid.link/20251029-work-namespace-nstree-listns-v4-41-2e6f823ebdc0@kernel.org
Tested-by: syzbot@syzkaller.appspotmail.com
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
tools/testing/selftests/namespaces/listns_test.c

index 64249502ac499fbe84ccc0020bef3b907f62611c..7dff63a00263b663b8e295ee96c0c0a59840bcf5 100644 (file)
@@ -115,4 +115,57 @@ TEST(listns_filter_by_type)
        }
 }
 
+/*
+ * Test listns() pagination.
+ * List namespaces in batches.
+ */
+TEST(listns_pagination)
+{
+       struct ns_id_req req = {
+               .size = sizeof(req),
+               .spare = 0,
+               .ns_id = 0,
+               .ns_type = 0,
+               .spare2 = 0,
+               .user_ns_id = 0,
+       };
+       __u64 batch1[2], batch2[2];
+       ssize_t ret1, ret2;
+
+       /* Get first batch */
+       ret1 = sys_listns(&req, batch1, ARRAY_SIZE(batch1), 0);
+       if (ret1 < 0) {
+               if (errno == ENOSYS)
+                       SKIP(return, "listns() not supported");
+               TH_LOG("listns failed: %s (errno=%d)", strerror(errno), errno);
+               ASSERT_TRUE(false);
+       }
+       ASSERT_GE(ret1, 0);
+
+       if (ret1 == 0)
+               SKIP(return, "No namespaces found");
+
+       TH_LOG("First batch: %zd namespaces", ret1);
+
+       /* Get second batch using last ID from first batch */
+       if (ret1 == ARRAY_SIZE(batch1)) {
+               req.ns_id = batch1[ret1 - 1];
+               ret2 = sys_listns(&req, batch2, ARRAY_SIZE(batch2), 0);
+               ASSERT_GE(ret2, 0);
+
+               TH_LOG("Second batch: %zd namespaces (after ns_id=%llu)",
+                      ret2, (unsigned long long)req.ns_id);
+
+               /* If we got more results, verify IDs are monotonically increasing */
+               if (ret2 > 0) {
+                       ASSERT_GT(batch2[0], batch1[ret1 - 1]);
+                       TH_LOG("Pagination working: %llu > %llu",
+                              (unsigned long long)batch2[0],
+                              (unsigned long long)batch1[ret1 - 1]);
+               }
+       } else {
+               TH_LOG("All namespaces fit in first batch");
+       }
+}
+
 TEST_HARNESS_MAIN