[SCM] Samba Shared Repository - branch master updated
Günther Deschner
gd at samba.org
Thu Jan 4 21:10:01 UTC 2024
The branch, master has been updated
via 7e0a18acde8 vfs_ceph: use extra 'ceph_*at()' calls when available
from f2dbcea6f04 lib: Confine the copy_no_nl memcpy to debug_gpfs_log()
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 7e0a18acde8ea4801ad4f56a0b2d8daa2120f6e5
Author: Shachar Sharon <ssharon at redhat.com>
Date: Mon Nov 13 15:47:24 2023 +0200
vfs_ceph: use extra 'ceph_*at()' calls when available
As of libcephfs version-10.0.3 the high-level API has few more '*at()'
calls. Prefer those newer hooks over path-based when having an
appropriate directory fd (namely: ceph_mkdirat, ceph_openat,
cepth_unlinkat, ceph_symlinkat, ceph_readlinkat).
Ceph commit: https://github.com/ceph/ceph/commit/3831aa12f3067d8cc362f39f7136dd53cb946d22
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15516
Signed-off-by: Shachar Sharon <ssharon at redhat.com>
Reviewed-by: Gunther Deschner <gd at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Autobuild-User(master): Günther Deschner <gd at samba.org>
Autobuild-Date(master): Thu Jan 4 21:09:54 UTC 2024 on atb-devel-224
-----------------------------------------------------------------------
Summary of changes:
source3/modules/vfs_ceph.c | 132 +++++++++++++++++++++++++++++++++++++--------
source3/wscript | 10 ++++
2 files changed, 121 insertions(+), 21 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index b1039ee36ef..7f0bad8ae33 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -473,8 +473,22 @@ static int cephwrap_mkdirat(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
mode_t mode)
{
+ int result = -1;
+#ifdef HAVE_CEPH_MKDIRAT
+ int dirfd = fsp_get_pathref_fd(dirfsp);
+
+ DBG_DEBUG("[CEPH] mkdirat(%p, %d, %s)\n",
+ handle,
+ dirfd,
+ smb_fname->base_name);
+
+ result = ceph_mkdirat(handle->data, dirfd, smb_fname->base_name, mode);
+
+ DBG_DEBUG("[CEPH] mkdirat(...) = %d\n", result);
+
+ WRAP_RETURN(result);
+#else
struct smb_filename *full_fname = NULL;
- int result;
full_fname = full_path_from_dirfsp_atname(talloc_tos(),
dirfsp,
@@ -490,7 +504,8 @@ static int cephwrap_mkdirat(struct vfs_handle_struct *handle,
TALLOC_FREE(full_fname);
- return WRAP_RETURN(result);
+ WRAP_RETURN(result);
+#endif
}
static int cephwrap_closedir(struct vfs_handle_struct *handle, DIR *dirp)
@@ -517,15 +532,44 @@ static int cephwrap_openat(struct vfs_handle_struct *handle,
bool have_opath = false;
bool became_root = false;
int result = -ENOENT;
+#ifdef HAVE_CEPH_OPENAT
+ int dirfd = -1;
+#endif
if (how->resolve != 0) {
errno = ENOSYS;
return -1;
}
- /*
- * ceph doesn't have openat().
- */
+ if (smb_fname->stream_name) {
+ goto out;
+ }
+
+#ifdef O_PATH
+ have_opath = true;
+ if (fsp->fsp_flags.is_pathref) {
+ flags |= O_PATH;
+ }
+#endif
+
+#ifdef HAVE_CEPH_OPENAT
+ dirfd = fsp_get_pathref_fd(dirfsp);
+
+ DBG_DEBUG("[CEPH] openat(%p, %d, %p, %d, %d)\n",
+ handle, dirfd, fsp, flags, mode);
+
+ if (fsp->fsp_flags.is_pathref && !have_opath) {
+ become_root();
+ became_root = true;
+ }
+
+ result = ceph_openat(handle->data,
+ dirfd,
+ smb_fname->base_name,
+ flags,
+ mode);
+
+#else
if (fsp_get_pathref_fd(dirfsp) != AT_FDCWD) {
name = full_path_from_dirfsp_atname(talloc_tos(),
dirfsp,
@@ -539,28 +583,16 @@ static int cephwrap_openat(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] openat(%p, %s, %p, %d, %d)\n", handle,
smb_fname_str_dbg(smb_fname), fsp, flags, mode);
- if (smb_fname->stream_name) {
- goto out;
- }
-
-#ifdef O_PATH
- have_opath = true;
- if (fsp->fsp_flags.is_pathref) {
- flags |= O_PATH;
- }
-#endif
-
if (fsp->fsp_flags.is_pathref && !have_opath) {
become_root();
became_root = true;
}
result = ceph_open(handle->data, smb_fname->base_name, flags, mode);
-
+#endif
if (became_root) {
unbecome_root();
}
-
out:
TALLOC_FREE(name);
fsp->fsp_flags.have_proc_fds = false;
@@ -992,8 +1024,28 @@ static int cephwrap_unlinkat(struct vfs_handle_struct *handle,
const struct smb_filename *smb_fname,
int flags)
{
- struct smb_filename *full_fname = NULL;
int result = -1;
+#ifdef HAVE_CEPH_UNLINKAT
+ int dirfd = fsp_get_pathref_fd(dirfsp);
+
+ DBG_DEBUG("[CEPH] unlinkat(%p, %d, %s)\n",
+ handle,
+ dirfd,
+ smb_fname_str_dbg(smb_fname));
+
+ if (smb_fname->stream_name) {
+ errno = ENOENT;
+ return result;
+ }
+
+ result = ceph_unlinkat(handle->data,
+ dirfd,
+ smb_fname->base_name,
+ flags);
+ DBG_DEBUG("[CEPH] unlinkat(...) = %d\n", result);
+ WRAP_RETURN(result);
+#else
+ struct smb_filename *full_fname = NULL;
DBG_DEBUG("[CEPH] unlink(%p, %s)\n",
handle,
@@ -1019,6 +1071,7 @@ static int cephwrap_unlinkat(struct vfs_handle_struct *handle,
TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] unlink(...) = %d\n", result);
WRAP_RETURN(result);
+#endif
}
static int cephwrap_fchmod(struct vfs_handle_struct *handle, files_struct *fsp, mode_t mode)
@@ -1242,8 +1295,24 @@ static int cephwrap_symlinkat(struct vfs_handle_struct *handle,
struct files_struct *dirfsp,
const struct smb_filename *new_smb_fname)
{
- struct smb_filename *full_fname = NULL;
int result = -1;
+#ifdef HAVE_CEPH_SYMLINKAT
+ int dirfd = fsp_get_pathref_fd(dirfsp);
+
+ DBG_DEBUG("[CEPH] symlinkat(%p, %s, %d, %s)\n",
+ handle,
+ link_target->base_name,
+ dirfd,
+ new_smb_fname->base_name);
+
+ result = ceph_symlinkat(handle->data,
+ link_target->base_name,
+ dirfd,
+ new_smb_fname->base_name);
+ DBG_DEBUG("[CEPH] symlinkat(...) = %d\n", result);
+ WRAP_RETURN(result);
+#else
+ struct smb_filename *full_fname = NULL;
full_fname = full_path_from_dirfsp_atname(talloc_tos(),
dirfsp,
@@ -1262,6 +1331,7 @@ static int cephwrap_symlinkat(struct vfs_handle_struct *handle,
TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] symlink(...) = %d\n", result);
WRAP_RETURN(result);
+#endif
}
static int cephwrap_readlinkat(struct vfs_handle_struct *handle,
@@ -1270,8 +1340,27 @@ static int cephwrap_readlinkat(struct vfs_handle_struct *handle,
char *buf,
size_t bufsiz)
{
- struct smb_filename *full_fname = NULL;
int result = -1;
+#ifdef HAVE_CEPH_READLINKAT
+ int dirfd = fsp_get_pathref_fd(dirfsp);
+
+ DBG_DEBUG("[CEPH] readlinkat(%p, %d, %s, %p, %llu)\n",
+ handle,
+ dirfd,
+ smb_fname->base_name,
+ buf,
+ llu(bufsiz));
+
+ result = ceph_readlinkat(handle->data,
+ dirfd,
+ smb_fname->base_name,
+ buf,
+ bufsiz);
+
+ DBG_DEBUG("[CEPH] readlinkat(...) = %d\n", result);
+ WRAP_RETURN(result);
+#else
+ struct smb_filename *full_fname = NULL;
full_fname = full_path_from_dirfsp_atname(talloc_tos(),
dirfsp,
@@ -1287,6 +1376,7 @@ static int cephwrap_readlinkat(struct vfs_handle_struct *handle,
TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] readlink(...) = %d\n", result);
WRAP_RETURN(result);
+#endif
}
static int cephwrap_linkat(struct vfs_handle_struct *handle,
diff --git a/source3/wscript b/source3/wscript
index 2eaa21ae44d..42af1f44975 100644
--- a/source3/wscript
+++ b/source3/wscript
@@ -1679,6 +1679,16 @@ int main(void) {
conf.DEFINE('HAVE_CEPH', '1')
conf.CHECK_FUNCS_IN('ceph_select_filesystem', 'cephfs',
headers='cephfs/libcephfs.h')
+ conf.CHECK_FUNCS_IN('ceph_mkdirat', 'cephfs',
+ headers='cephfs/libcephfs.h')
+ conf.CHECK_FUNCS_IN('ceph_openat', 'cephfs',
+ headers='cephfs/libcephfs.h')
+ conf.CHECK_FUNCS_IN('ceph_unlinkat', 'cephfs',
+ headers='cephfs/libcephfs.h')
+ conf.CHECK_FUNCS_IN('ceph_symlinkat', 'cephfs',
+ headers='cephfs/libcephfs.h')
+ conf.CHECK_FUNCS_IN('ceph_readlinkat', 'cephfs',
+ headers='cephfs/libcephfs.h')
else:
Logs.warn('''Ceph support disabled due to --without-acl-support
or lack of ceph_statx support''')
--
Samba Shared Repository
More information about the samba-cvs
mailing list