[PATCH v2 2/2] selftests: liveupdate: add test for double preservation

Pasha Tatashin posted 2 patches 1 week, 3 days ago
There is a newer version of this series
[PATCH v2 2/2] selftests: liveupdate: add test for double preservation
Posted by Pasha Tatashin 1 week, 3 days ago
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.

Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
---
 .../testing/selftests/liveupdate/liveupdate.c | 41 +++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/tools/testing/selftests/liveupdate/liveupdate.c b/tools/testing/selftests/liveupdate/liveupdate.c
index c2878e3d5ef9..37c808fbe1e9 100644
--- a/tools/testing/selftests/liveupdate/liveupdate.c
+++ b/tools/testing/selftests/liveupdate/liveupdate.c
@@ -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
-- 
2.43.0
Re: [PATCH v2 2/2] selftests: liveupdate: add test for double preservation
Posted by Mike Rapoport 1 week, 2 days ago
On Mon, Mar 23, 2026 at 08:31:45PM +0000, Pasha Tatashin wrote:
> 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.
> 
> Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>

Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>

> ---
>  .../testing/selftests/liveupdate/liveupdate.c | 41 +++++++++++++++++++
>  1 file changed, 41 insertions(+)

-- 
Sincerely yours,
Mike.
Re: [PATCH v2 2/2] selftests: liveupdate: add test for double preservation
Posted by Samiullah Khawaja 1 week, 3 days ago
On Mon, Mar 23, 2026 at 08:31:45PM +0000, Pasha Tatashin wrote:
>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.
>
>Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
>---
> .../testing/selftests/liveupdate/liveupdate.c | 41 +++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
>diff --git a/tools/testing/selftests/liveupdate/liveupdate.c b/tools/testing/selftests/liveupdate/liveupdate.c
>index c2878e3d5ef9..37c808fbe1e9 100644
>--- a/tools/testing/selftests/liveupdate/liveupdate.c
>+++ b/tools/testing/selftests/liveupdate/liveupdate.c
>@@ -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
>-- 
>2.43.0
>

Reviewed-by: Samiullah Khawaja <skhawaja@google.com>