From: Ackerley Tng <[email protected]> Add test coverage verifying that passing a regular file from tmpfs as a resource file fails with ENOTDIR. Only directory file descriptors representing the mount root are supported as resource pools.
Signed-off-by: Ackerley Tng <[email protected]> --- tools/testing/selftests/kvm/guest_memfd_test.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tools/testing/selftests/kvm/guest_memfd_test.c b/tools/testing/selftests/kvm/guest_memfd_test.c index 31bc74c4c26bd..a7a1b5470cb2c 100644 --- a/tools/testing/selftests/kvm/guest_memfd_test.c +++ b/tools/testing/selftests/kvm/guest_memfd_test.c @@ -457,6 +457,26 @@ static void test_resource_fd_unsupported_fs(struct kvm_vm *vm) close(file_fd); } +static void test_resource_fd_tmpfs_file(struct kvm_vm *vm) +{ + int fd, file_fd; + + /* + * Passing a regular file from tmpfs (e.g. via memfd) is rejected by + * the provider attach callback with ENOTDIR because only directory + * FDs representing the mount root are supported resource pools. + */ + file_fd = memfd_create("test_tmpfs_file", 0); + TEST_ASSERT(file_fd >= 0, "memfd_create 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 file fd should fail"); + TEST_ASSERT_EQ(errno, ENOTDIR); + close(file_fd); +} + #define ____gmem_test(__test, __vm, __flags, __gmem_size, args...) \ do { \ int fd = vm_create_guest_memfd(__vm, __gmem_size, __flags); \ @@ -517,6 +537,7 @@ static void test_guest_memfd(unsigned long vm_type) test_resource_fd_invalid(vm); test_resource_fd_unsupported_fs(vm); + test_resource_fd_tmpfs_file(vm); __test_guest_memfd(vm, 0); -- 2.56.0.rc1.315.gc6ed9934b7-goog

