From: Dhairya Parmar Date: Tue, 25 Mar 2025 11:19:09 +0000 (+0530) Subject: qa: test unmount hang using high/low level APIs X-Git-Tag: testing/wip-jcollin-testing-20251001.024604-squid~4^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6c2d594b3547297eff509793f487c863e0d82823;p=ceph-ci.git qa: test unmount hang using high/low level APIs Fixes: https://tracker.ceph.com/issues/70553 Signed-off-by: Dhairya Parmar (cherry picked from commit cbf1c5bb39b146f2457fe9c30c91122bcc7d442f) --- diff --git a/src/test/libcephfs/test.cc b/src/test/libcephfs/test.cc index 946698f986e..c0041a31af2 100644 --- a/src/test/libcephfs/test.cc +++ b/src/test/libcephfs/test.cc @@ -4225,3 +4225,91 @@ TEST(LibCephFS, AsyncReadAndWriteMultiClient) { ceph_shutdown(w_cmount); ceph_shutdown(r_cmount); } + +TEST(LibCephFS, UmountHangAfterLlLookupFilePath) { + struct ceph_statx stx; + struct ceph_mount_info *cmount; + UserPerm *perms; + Inode *root, *file, *tmp; + Fh *fh; + + int mypid = getpid(); + char filename[NAME_MAX]; + + sprintf(filename, "test_umounthangafterlookup%u", mypid); + + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(0, ceph_conf_parse_env(cmount, NULL)); + ASSERT_EQ(0, ceph_mount(cmount, NULL)); + + perms = ceph_userperm_new(0, 0, 0, NULL); + + ASSERT_EQ(ceph_ll_lookup_root(cmount, &root), 0); + + ASSERT_EQ(ceph_ll_create(cmount, root, filename, 0777, + O_CREAT | O_TRUNC | O_RDWR, &file, &fh, &stx, + CEPH_STATX_INO, 0, perms), 0); + ASSERT_EQ(ceph_ll_close(cmount, fh), 0); + + ASSERT_EQ(ceph_ll_lookup(cmount, file, ".", &tmp, &stx, CEPH_STATX_INO, + 0 , perms), -ENOTDIR); + + ASSERT_EQ(ceph_ll_unlink(cmount, root, filename, perms), 0); + + ceph_ll_put(cmount, file); + ceph_ll_put(cmount, root); + + std::cout << "Before ceph_unmount()" << std::endl; + ASSERT_EQ(0, ceph_unmount(cmount)); + std::cout << "After ceph_unmount()" << std::endl; + + ceph_release(cmount); + ceph_userperm_destroy(perms); +} + +TEST(LibCephFS, UnmountHangAfterOpenatFilePath) { + pid_t mypid = getpid(); + struct ceph_mount_info *cmount; + ASSERT_EQ(ceph_create(&cmount, NULL), 0); + ASSERT_EQ(ceph_conf_read_file(cmount, NULL), 0); + ASSERT_EQ(ceph_conf_parse_env(cmount, NULL), 0); + ASSERT_EQ(ceph_mount(cmount, "/"), 0); + + char c_rel_dir[64]; + char c_dir[128]; + sprintf(c_rel_dir, "open_test_%d", mypid); + sprintf(c_dir, "/%s", c_rel_dir); + ASSERT_EQ(ceph_mkdir(cmount, c_dir, 0777), 0); + + int root_fd = ceph_open(cmount, "/", O_DIRECTORY, 0777); + ASSERT_GT(root_fd, 0); + + int dir_fd = ceph_openat(cmount, root_fd, c_rel_dir, O_DIRECTORY, 0777); + ASSERT_GT(dir_fd, 0); + + struct ceph_statx stx; + ASSERT_EQ(ceph_statxat(cmount, root_fd, c_rel_dir, &stx, 0, 0), 0); + + char c_rel_path[PATH_MAX]; + char c_path[PATH_MAX]; + sprintf(c_rel_path, "created_file_%d", mypid); + sprintf(c_path, "%s/%s", c_dir, c_rel_path); + int file_fd = ceph_openat(cmount, dir_fd, c_rel_path, O_RDONLY | O_CREAT, 0777); + ASSERT_GT(file_fd, 0); + int fd = ceph_openat(cmount, file_fd, ".", O_RDONLY, 0777); + ASSERT_EQ(fd, -ENOTDIR); + + ASSERT_EQ(ceph_close(cmount, file_fd), 0); + ASSERT_EQ(ceph_close(cmount, dir_fd), 0); + ASSERT_EQ(ceph_close(cmount, root_fd), 0); + + ASSERT_EQ(0, ceph_unlink(cmount, c_path)); + ASSERT_EQ(0, ceph_rmdir(cmount, c_dir)); + + std::cout << "Before ceph_unmount()" << std::endl; + ASSERT_EQ(0, ceph_unmount(cmount)); + std::cout << "After ceph_unmount()" << std::endl; + + ASSERT_EQ(0, ceph_release(cmount)); +}