From: Guenther Deschner Date: Thu, 5 Sep 2024 08:10:27 +0000 (+0530) Subject: vfs_ceph_new: Populate function pointers with addresses X-Git-Tag: samba-4.20.8~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a91d70044b78980b66ccd21072179a137e1f38d;p=thirdparty%2Fsamba.git 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) --- 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;