[PATCH RFC v2 12/50] KVM: selftests: Test rejection of regular file in tmpfs mount
From: Ackerley Tng via B4 Relay
Date: Thu Oct 22 2026 - 19:30:42 EST
From: Ackerley Tng <ackerleytng@xxxxxxxxxx>
Add test coverage verifying that creating a regular file inside an
actual tmpfs mount and passing that file descriptor as resource_fd
fails with EOPNOTSUPP, because tmpfs regular files do not have
gmem_provider_ops defined on their file_operations.
Signed-off-by: Ackerley Tng <ackerleytng@xxxxxxxxxx>
---
tools/testing/selftests/kvm/guest_memfd_test.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c
index 541d8cdd0bbf7..bef1acead4a6d 100644
--- a/tools/testing/selftests/kvm/guest_memfd_test.c
+++ b/tools/testing/selftests/kvm/guest_memfd_test.c
@@ -613,6 +613,25 @@ static void __test_guest_memfd(struct kvm_vm *vm, u64 flags)
gmem_test_vm(invalid_binding, vm, flags);
}
+static void test_resource_fd_tmpfs_regular_file(struct kvm_vm *vm)
+{
+ int pool_fd, file_fd, fd;
+
+ pool_fd = create_tmpfs_pool_fd("never", true, page_size);
+
+ file_fd = openat(pool_fd, "regular_file", O_CREAT | O_RDWR | O_CLOEXEC, 0644);
+ TEST_ASSERT(file_fd >= 0, "openat regular_file in tmpfs pool failed");
+
+ fd = __vm_create_guest_memfd_resource(vm, page_size,
+ GUEST_MEMFD_FLAG_USE_RESOURCE,
+ file_fd);
+ TEST_ASSERT(fd < 0, "guest_memfd with tmpfs regular file should fail");
+ TEST_ASSERT_EQ(errno, EOPNOTSUPP);
+
+ close(file_fd);
+ close(pool_fd);
+}
+
static void test_guest_memfd(unsigned long vm_type)
{
struct kvm_vm *vm = vm_create_barebones_type(vm_type);
@@ -625,6 +644,7 @@ static void test_guest_memfd(unsigned long vm_type)
test_resource_fd_memfd(vm);
test_resource_fd_tmpfs_swap(vm);
test_resource_fd_tmpfs_huge(vm);
+ test_resource_fd_tmpfs_regular_file(vm);
__test_guest_memfd(vm, 0);
--
2.56.0.257.gf7497c7d27-goog