]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: liveupdate: add test for double preservation
authorPasha Tatashin <pasha.tatashin@soleen.com>
Thu, 26 Mar 2026 16:39:43 +0000 (16:39 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 18 Apr 2026 07:10:49 +0000 (00:10 -0700)
Verify that a file can only be preserved once across all active sessions.
Attempting to preserve it a second time, whether in the same or a
different session, should fail with EBUSY.

Link: https://lore.kernel.org/20260326163943.574070-4-pasha.tatashin@soleen.com
Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Samiullah Khawaja <skhawaja@google.com>
Cc: David Matlack <dmatlack@google.com>
Cc: Pratyush Yadav <pratyush@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Christian Brauner <brauner@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/liveupdate/liveupdate.c

index c2878e3d5ef90c825de5c27fbe9f259a207843fa..37c808fbe1e92e8477a9f3e266f0f2fe062d7f55 100644 (file)
@@ -345,4 +345,45 @@ TEST_F(liveupdate_device, preserve_unsupported_fd)
        ASSERT_EQ(close(session_fd), 0);
 }
 
+/*
+ * Test Case: Prevent Double Preservation
+ *
+ * Verifies that a file (memfd) can only be preserved once across all active
+ * sessions. Attempting to preserve it a second time, whether in the same or
+ * a different session, should fail with EBUSY.
+ */
+TEST_F(liveupdate_device, prevent_double_preservation)
+{
+       int session_fd1, session_fd2, mem_fd;
+       int ret;
+
+       self->fd1 = open(LIVEUPDATE_DEV, O_RDWR);
+       if (self->fd1 < 0 && errno == ENOENT)
+               SKIP(return, "%s does not exist", LIVEUPDATE_DEV);
+       ASSERT_GE(self->fd1, 0);
+
+       session_fd1 = create_session(self->fd1, "double-preserve-session-1");
+       ASSERT_GE(session_fd1, 0);
+       session_fd2 = create_session(self->fd1, "double-preserve-session-2");
+       ASSERT_GE(session_fd2, 0);
+
+       mem_fd = memfd_create("test-memfd", 0);
+       ASSERT_GE(mem_fd, 0);
+
+       /* First preservation should succeed */
+       ASSERT_EQ(preserve_fd(session_fd1, mem_fd, 0x1111), 0);
+
+       /* Second preservation in a different session should fail with EBUSY */
+       ret = preserve_fd(session_fd2, mem_fd, 0x2222);
+       EXPECT_EQ(ret, -EBUSY);
+
+       /* Second preservation in the same session (different token) should fail with EBUSY */
+       ret = preserve_fd(session_fd1, mem_fd, 0x3333);
+       EXPECT_EQ(ret, -EBUSY);
+
+       ASSERT_EQ(close(mem_fd), 0);
+       ASSERT_EQ(close(session_fd1), 0);
+       ASSERT_EQ(close(session_fd2), 0);
+}
+
 TEST_HARNESS_MAIN