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));
+}