[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Mon Mar 17 20:49:02 UTC 2025


The branch, master has been updated
       via  dbc48a4cda7 vfs_ceph_new: Add path based fallback for SMB_VFS_FNTIMES
       via  9c019ecf4ea vfs_ceph_new: Add path based fallback for SMB_VFS_FCHMOD
       via  abb97683902 vfs_ceph_new: Add path based fallback for SMB_VFS_FCHOWN
      from  6f912b811f1 ctdb/doc: document the newly added option to not register the helper

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit dbc48a4cda7489363688bb38f6fa678011fedfaf
Author: Anoop C S <anoopcs at samba.org>
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 <anoopcs at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>
    
    Autobuild-User(master): Günther Deschner <gd at samba.org>
    Autobuild-Date(master): Mon Mar 17 20:48:55 UTC 2025 on atb-devel-224

commit 9c019ecf4eae6e6bef48323a0b093e17b0708ee8
Author: Anoop C S <anoopcs at samba.org>
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 <anoopcs at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

commit abb97683902f50b2a57989f30c0fb53fd3492af9
Author: Anoop C S <anoopcs at samba.org>
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 <anoopcs at samba.org>
    Reviewed-by: Guenther Deschner <gd at samba.org>

-----------------------------------------------------------------------

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 4b784ea68ed..65a43b310ca 100644
--- a/source3/modules/vfs_ceph_new.c
+++ b/source3/modules/vfs_ceph_new.c
@@ -967,6 +967,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)
@@ -987,6 +1017,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)
@@ -998,22 +1089,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;
 	}
@@ -3075,18 +3151,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)) {
@@ -3141,16 +3231,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);
@@ -3163,15 +3267,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



More information about the samba-cvs mailing list