The branch, v4-21-test has been updated
via cd0b2f6df72 vfs_ceph_new: Add path based fallback for
SMB_VFS_FNTIMES
via 8f3bc967657 vfs_ceph_new: Add path based fallback for SMB_VFS_FCHMOD
via 997b4736797 vfs_ceph_new: Add path based fallback for SMB_VFS_FCHOWN
from 9d9998a528b s3/lib: fix matching interfaces with multiple assigned
IPs
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-21-test
- Log -----------------------------------------------------------------
commit cd0b2f6df728265f564723609fed80f3b51a8bd8
Author: Anoop C S <[email protected]>
Date: Mon Mar 17 19:52:10 2025 +0530
vfs_ceph_new: Add path based fallback for SMB_VFS_FNTIMES
Fallback mechanism was missing in vfs_ceph_fntimes() for path
based call.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15834
Signed-off-by: Anoop C S <[email protected]>
Reviewed-by: Guenther Deschner <[email protected]>
Autobuild-User(master): Günther Deschner <[email protected]>
Autobuild-Date(master): Mon Mar 17 20:48:55 UTC 2025 on atb-devel-224
(cherry picked from commit dbc48a4cda7489363688bb38f6fa678011fedfaf)
Autobuild-User(v4-21-test): Jule Anger <[email protected]>
Autobuild-Date(v4-21-test): Mon Mar 24 14:01:10 UTC 2025 on atb-devel-224
commit 8f3bc967657862d30ba3890b8b07b7c68790654e
Author: Anoop C S <[email protected]>
Date: Fri Mar 14 19:59:33 2025 +0530
vfs_ceph_new: Add path based fallback for SMB_VFS_FCHMOD
Fallback mechanism was missing in vfs_ceph_fchmod() for path based call.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15834
Signed-off-by: Anoop C S <[email protected]>
Reviewed-by: Guenther Deschner <[email protected]>
(cherry picked from commit 9c019ecf4eae6e6bef48323a0b093e17b0708ee8)
commit 997b47367971a3d73192c15748447fa482524d31
Author: Anoop C S <[email protected]>
Date: Fri Mar 14 19:47:42 2025 +0530
vfs_ceph_new: Add path based fallback for SMB_VFS_FCHOWN
Fallback mechanism was missing in vfs_ceph_fchown() for path based call.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=15834
Signed-off-by: Anoop C S <[email protected]>
Reviewed-by: Guenther Deschner <[email protected]>
(cherry picked from commit abb97683902f50b2a57989f30c0fb53fd3492af9)
-----------------------------------------------------------------------
Summary of changes:
source3/modules/vfs_ceph_new.c | 192 +++++++++++++++++++++++++++++++++--------
1 file changed, 157 insertions(+), 35 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/modules/vfs_ceph_new.c b/source3/modules/vfs_ceph_new.c
index dd7acbf1575..4622d8659cd 100644
--- a/source3/modules/vfs_ceph_new.c
+++ b/source3/modules/vfs_ceph_new.c
@@ -973,6 +973,36 @@ static int vfs_ceph_ll_fchown(struct vfs_handle_struct
*handle,
cfh->uperm);
}
+static int vfs_ceph_ll_chmod(const struct vfs_handle_struct *handle,
+ const struct vfs_ceph_iref *iref,
+ mode_t mode)
+{
+ struct ceph_statx stx = {.stx_mode = mode};
+ struct UserPerm *uperm = NULL;
+ int ret = -1;
+ struct vfs_ceph_config *config = NULL;
+
+ SMB_VFS_HANDLE_GET_DATA(handle, config, struct vfs_ceph_config,
+ return -ENOMEM);
+
+ DBG_DEBUG("[CEPH] ceph_ll_setattr: ino=%" PRIu64 " mode=%o\n",
iref->ino, mode);
+
+ uperm = vfs_ceph_userperm_new(config, handle->conn);
+ if (uperm == NULL) {
+ return -ENOMEM;
+ }
+
+ ret = config->ceph_ll_setattr_fn(config->mount,
+ iref->inode,
+ &stx,
+ CEPH_STATX_MODE,
+ uperm);
+
+ vfs_ceph_userperm_del(config, uperm);
+ DBG_DEBUG("[CEPH] ceph_ll_setattr: ret=%d\n", ret);
+ return ret;
+}
+
static int vfs_ceph_ll_fchmod(struct vfs_handle_struct *handle,
const struct vfs_ceph_fh *cfh,
mode_t mode)
@@ -993,6 +1023,67 @@ static int vfs_ceph_ll_fchmod(struct vfs_handle_struct
*handle,
cfh->uperm);
}
+static void vfs_ceph_fill_statx_mask_from_ft(const struct smb_file_time *ft,
+ struct ceph_statx *stx,
+ int *mask)
+{
+ if (!is_omit_timespec(&ft->atime)) {
+ stx->stx_atime = ft->atime;
+ *mask |= CEPH_SETATTR_ATIME;
+ }
+ if (!is_omit_timespec(&ft->mtime)) {
+ stx->stx_mtime = ft->mtime;
+ *mask |= CEPH_SETATTR_MTIME;
+ }
+ if (!is_omit_timespec(&ft->ctime)) {
+ stx->stx_ctime = ft->ctime;
+ *mask |= CEPH_SETATTR_CTIME;
+ }
+ if (!is_omit_timespec(&ft->create_time)) {
+ stx->stx_btime = ft->create_time;
+ *mask |= CEPH_SETATTR_BTIME;
+ }
+}
+
+static int vfs_ceph_ll_utimes(struct vfs_handle_struct *handle,
+ const struct vfs_ceph_iref *iref,
+ const struct smb_file_time *ft)
+{
+ struct ceph_statx stx = {0};
+ struct UserPerm *uperm = NULL;
+ int ret = -1;
+ int mask = 0;
+ struct vfs_ceph_config *config = NULL;
+
+ SMB_VFS_HANDLE_GET_DATA(handle, config, struct vfs_ceph_config,
+ return -ENOMEM);
+
+ vfs_ceph_fill_statx_mask_from_ft(ft, &stx, &mask);
+ if (!mask) {
+ return 0;
+ }
+
+ DBG_DEBUG("[CEPH] ceph_ll_setattr: ino=%" PRIu64 " mtime=%" PRIu64
+ " atime=%" PRIu64 " ctime=%" PRIu64 " btime=%" PRIu64 "\n",
+ iref->ino,
+ full_timespec_to_nt_time(&stx.stx_mtime),
+ full_timespec_to_nt_time(&stx.stx_atime),
+ full_timespec_to_nt_time(&stx.stx_ctime),
+ full_timespec_to_nt_time(&stx.stx_btime));
+
+ uperm = vfs_ceph_userperm_new(config, handle->conn);
+ if (uperm == NULL) {
+ return -ENOMEM;
+ }
+ ret = config->ceph_ll_setattr_fn(config->mount,
+ iref->inode,
+ &stx,
+ mask,
+ uperm);
+ vfs_ceph_userperm_del(config, uperm);
+ return ret;
+}
+
static int vfs_ceph_ll_futimes(struct vfs_handle_struct *handle,
const struct vfs_ceph_fh *cfh,
const struct smb_file_time *ft)
@@ -1004,22 +1095,7 @@ static int vfs_ceph_ll_futimes(struct vfs_handle_struct
*handle,
SMB_VFS_HANDLE_GET_DATA(handle, config, struct vfs_ceph_config,
return -ENOMEM);
- if (!is_omit_timespec(&ft->atime)) {
- stx.stx_atime = ft->atime;
- mask |= CEPH_SETATTR_ATIME;
- }
- if (!is_omit_timespec(&ft->mtime)) {
- stx.stx_mtime = ft->mtime;
- mask |= CEPH_SETATTR_MTIME;
- }
- if (!is_omit_timespec(&ft->ctime)) {
- stx.stx_ctime = ft->ctime;
- mask |= CEPH_SETATTR_CTIME;
- }
- if (!is_omit_timespec(&ft->create_time)) {
- stx.stx_btime = ft->create_time;
- mask |= CEPH_SETATTR_BTIME;
- }
+ vfs_ceph_fill_statx_mask_from_ft(ft, &stx, &mask);
if (!mask) {
return 0;
}
@@ -3074,18 +3150,32 @@ static int vfs_ceph_fntimes(struct vfs_handle_struct
*handle,
files_struct *fsp,
struct smb_file_time *ft)
{
- struct vfs_ceph_fh *cfh = NULL;
int result;
START_PROFILE(syscall_fntimes);
- result = vfs_ceph_fetch_fh(handle, fsp, &cfh);
- if (result != 0) {
- goto out;
- }
- result = vfs_ceph_ll_futimes(handle, cfh, ft);
- if (result != 0) {
- goto out;
+ if (!fsp->fsp_flags.is_pathref) {
+ struct vfs_ceph_fh *cfh = NULL;
+
+ result = vfs_ceph_fetch_io_fh(handle, fsp, &cfh);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_futimes(handle, cfh, ft);
+ } else {
+ struct vfs_ceph_iref iref = {0};
+
+ result = vfs_ceph_iget(handle,
+ fsp->fsp_name->base_name,
+ 0,
+ &iref);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_utimes(handle, &iref, ft);
+ vfs_ceph_iput(handle, &iref);
}
if (!is_omit_timespec(&ft->create_time)) {
@@ -3140,16 +3230,30 @@ static int vfs_ceph_fchmod(struct vfs_handle_struct
*handle,
mode_t mode)
{
int result;
- struct vfs_ceph_fh *cfh = NULL;
START_PROFILE(syscall_fchmod);
DBG_DEBUG("[CEPH] fchmod(%p, %p, %d)\n", handle, fsp, mode);
- result = vfs_ceph_fetch_io_fh(handle, fsp, &cfh);
- if (result != 0) {
- goto out;
- }
- result = vfs_ceph_ll_fchmod(handle, cfh, mode);
+ if (!fsp->fsp_flags.is_pathref) {
+ struct vfs_ceph_fh *cfh = NULL;
+
+ result = vfs_ceph_fetch_io_fh(handle, fsp, &cfh);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_fchmod(handle, cfh, mode);
+ } else {
+ struct vfs_ceph_iref iref = {0};
+
+ result = vfs_ceph_iget(handle, fsp->fsp_name->base_name, 0,
&iref);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_chmod(handle, &iref, mode);
+ vfs_ceph_iput(handle, &iref);
+ }
out:
DBG_DEBUG("[CEPH] fchmod(...) = %d\n", result);
END_PROFILE(syscall_fchmod);
@@ -3162,15 +3266,33 @@ static int vfs_ceph_fchown(struct vfs_handle_struct
*handle,
gid_t gid)
{
int result;
- struct vfs_ceph_fh *cfh = NULL;
START_PROFILE(syscall_fchown);
DBG_DEBUG("[CEPH] fchown(%p, %p, %d, %d)\n", handle, fsp, uid, gid);
- result = vfs_ceph_fetch_io_fh(handle, fsp, &cfh);
- if (result != 0) {
- goto out;
+
+ if (!fsp->fsp_flags.is_pathref) {
+ struct vfs_ceph_fh *cfh = NULL;
+
+ result = vfs_ceph_fetch_io_fh(handle, fsp, &cfh);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_fchown(handle, cfh, uid, gid);
+ } else {
+ struct vfs_ceph_iref iref = {0};
+
+ result = vfs_ceph_iget(handle,
+ fsp->fsp_name->base_name,
+ 0,
+ &iref);
+ if (result != 0) {
+ goto out;
+ }
+
+ result = vfs_ceph_ll_chown(handle, &iref, uid, gid);
+ vfs_ceph_iput(handle, &iref);
}
- result = vfs_ceph_ll_fchown(handle, cfh, uid, gid);
out:
DBG_DEBUG("[CEPH] fchown(...) = %d\n", result);
END_PROFILE(syscall_fchown);
--
Samba Shared Repository