From 254c0846118eb34914686c656b17aeb67bd5df33 Mon Sep 17 00:00:00 2001 From: Guenther Deschner Date: Thu, 5 Sep 2024 13:40:27 +0530 Subject: [PATCH] vfs_ceph_new: Populate function pointers with addresses Use dlysm() for assigning addresses to already declared libcephfs low-level API function pointers. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15703 Pair-Programmed-With: Anoop C S Signed-off-by: Guenther Deschner Signed-off-by: Anoop C S Reviewed-by: Guenther Deschner (cherry picked from commit e4fc1df4b4486f5eed095135f905bdbf10bb1793) --- source3/modules/vfs_ceph_new.c | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/source3/modules/vfs_ceph_new.c b/source3/modules/vfs_ceph_new.c index 046b22f06b3..0b3203ee9d7 100644 --- a/source3/modules/vfs_ceph_new.c +++ b/source3/modules/vfs_ceph_new.c @@ -316,6 +316,18 @@ static struct ceph_mount_info *cephmount_mount_fs( return mnt; } +#define CHECK_CEPH_FN(hnd, func) \ + do { \ + config->func ## _fn = dlsym(hnd, #func); \ + if (config->func ## _fn == NULL) { \ + if (dlclose(hnd)) { \ + DBG_ERR("%s\n", dlerror()); \ + } \ + errno = ENOSYS; \ + return false; \ + } \ + } while(0); + static bool vfs_cephfs_load_lib(struct vfs_ceph_config *config) { void *libhandle = NULL; @@ -346,6 +358,54 @@ static bool vfs_cephfs_load_lib(struct vfs_ceph_config *config) break; } + CHECK_CEPH_FN(libhandle, ceph_ll_lookup_inode); + CHECK_CEPH_FN(libhandle, ceph_ll_walk); + CHECK_CEPH_FN(libhandle, ceph_ll_getattr); + CHECK_CEPH_FN(libhandle, ceph_ll_setattr); + CHECK_CEPH_FN(libhandle, ceph_ll_releasedir); + CHECK_CEPH_FN(libhandle, ceph_ll_create); + CHECK_CEPH_FN(libhandle, ceph_ll_open); + CHECK_CEPH_FN(libhandle, ceph_ll_opendir); + CHECK_CEPH_FN(libhandle, ceph_ll_mkdir); + CHECK_CEPH_FN(libhandle, ceph_ll_rmdir); + CHECK_CEPH_FN(libhandle, ceph_ll_unlink); + CHECK_CEPH_FN(libhandle, ceph_ll_symlink); + CHECK_CEPH_FN(libhandle, ceph_ll_readlink); + CHECK_CEPH_FN(libhandle, ceph_ll_put); + CHECK_CEPH_FN(libhandle, ceph_ll_read); + CHECK_CEPH_FN(libhandle, ceph_ll_write); + CHECK_CEPH_FN(libhandle, ceph_ll_lseek); + CHECK_CEPH_FN(libhandle, ceph_ll_fsync); + CHECK_CEPH_FN(libhandle, ceph_ll_fallocate); + CHECK_CEPH_FN(libhandle, ceph_ll_link); + CHECK_CEPH_FN(libhandle, ceph_ll_rename); + CHECK_CEPH_FN(libhandle, ceph_ll_mknod); + CHECK_CEPH_FN(libhandle, ceph_ll_getxattr); + CHECK_CEPH_FN(libhandle, ceph_ll_setxattr); + CHECK_CEPH_FN(libhandle, ceph_ll_listxattr); + CHECK_CEPH_FN(libhandle, ceph_ll_removexattr); + CHECK_CEPH_FN(libhandle, ceph_ll_lookup); + CHECK_CEPH_FN(libhandle, ceph_ll_lookup_root); + CHECK_CEPH_FN(libhandle, ceph_ll_statfs); + CHECK_CEPH_FN(libhandle, ceph_ll_close); + + CHECK_CEPH_FN(libhandle, ceph_chdir); + CHECK_CEPH_FN(libhandle, ceph_conf_get); + CHECK_CEPH_FN(libhandle, ceph_conf_read_file); + CHECK_CEPH_FN(libhandle, ceph_conf_set); + CHECK_CEPH_FN(libhandle, ceph_create); + CHECK_CEPH_FN(libhandle, ceph_getcwd); + CHECK_CEPH_FN(libhandle, ceph_init); + CHECK_CEPH_FN(libhandle, ceph_mount); + CHECK_CEPH_FN(libhandle, ceph_release); + CHECK_CEPH_FN(libhandle, ceph_select_filesystem); + CHECK_CEPH_FN(libhandle, ceph_unmount); + CHECK_CEPH_FN(libhandle, ceph_userperm_destroy); + CHECK_CEPH_FN(libhandle, ceph_userperm_new); + CHECK_CEPH_FN(libhandle, ceph_version); + CHECK_CEPH_FN(libhandle, ceph_readdir); + CHECK_CEPH_FN(libhandle, ceph_rewinddir); + config->libhandle = libhandle; return true; -- 2.47.2