From: Ackerley Tng 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 --- 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