[SCM] Samba Shared Repository - branch master updated

[email protected] (Jeremy Allison)
Newsgroups gmane.network.samba.cvs
Message-ID <[email protected]>
The branch, master has been updated
       via  2b80014 vfs: ceph: convert to new DBG_* macros
       via  a9c5be3 VFS: convert to using ceph_statx structures and functions, when available
      from  b1ade58 s4:torture: Add tortue test for AddPrinterDriverEx with COPY_FROM_DIRECTORY

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


- Log -----------------------------------------------------------------
commit 2b8001475bc87e4e0e2057dc31cf34f4d61331c7
Author: Jeff Layton <[email protected]>
Date:   Fri Nov 18 07:31:21 2016 -0500

    vfs: ceph: convert to new DBG_* macros
    
    ...per Jeremy's recommendation.
    
    Signed-off-by: Jeff Layton <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Mon Nov 21 03:34:26 CET 2016 on sn-devel-144

commit a9c5be394da4f20bcfea7f6d4f5919d5c0f90219
Author: Jeff Layton <[email protected]>
Date:   Thu Nov 17 13:13:57 2016 -0500

    VFS: convert to using ceph_statx structures and functions, when available
    
    Add a configure test for the ceph_statx function, and use that to
    determine whether to compile in new functions that use it and its
    variants, or whether to use a the older code that fetches birthtimes
    from an xattr.
    
    For cephwrap_lstat, we can use ceph_statx with the AT_SYMLINK_NOFOLLOW
    flag to get the right lookup semantics.
    
    For setting the times via cephwrap_ntimes, We can just use ceph_setattrx
    and pass them all in at the same time.
    
    Signed-off-by: Jeff Layton <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

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

Summary of changes:
 source3/modules/vfs_ceph.c | 431 +++++++++++++++++++++++++++++----------------
 source3/wscript            |   2 +
 2 files changed, 284 insertions(+), 149 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 8e02683..75233ef 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -96,30 +96,30 @@ static int cephwrap_connect(struct vfs_handle_struct *handle,  const char *servi
 
 	conf_file = lp_parm_const_string(SNUM(handle->conn), "ceph", "config_file", NULL);
 
-	DEBUG(2, ( "[CEPH] calling: ceph_create\n" ));
+	DBG_DEBUG( "[CEPH] calling: ceph_create\n" );
 	ret = ceph_create(&cmount, NULL);
 	if (ret)
 		goto err_out;
 
 	if (conf_file) {
 		/* Override the config file */
-		DEBUG(2, ( "[CEPH] calling: ceph_conf_read_file\n" ));
+		DBG_DEBUG( "[CEPH] calling: ceph_conf_read_file\n" );
 		ret = ceph_conf_read_file(cmount, conf_file);
 	} else {
 
-		DEBUG(2, ( "[CEPH] calling: ceph_conf_read_file with %s\n", conf_file));
+		DBG_DEBUG( "[CEPH] calling: ceph_conf_read_file with %s\n", conf_file);
 		ret = ceph_conf_read_file(cmount, NULL);
 	}
 
 	if (ret)
 		goto err_out;
 
-	DEBUG(2, ( "[CEPH] calling: ceph_conf_get\n" ));
+	DBG_DEBUG( "[CEPH] calling: ceph_conf_get\n" );
 	ret = ceph_conf_get(cmount, "log file", buf, sizeof(buf));
 	if (ret < 0)
 		goto err_out;
 
-	DEBUG(2, ("[CEPH] calling: ceph_mount\n"));
+	DBG_DEBUG("[CEPH] calling: ceph_mount\n");
 	ret = ceph_mount(cmount, NULL);
 	if (ret < 0)
 		goto err_out;
@@ -138,20 +138,20 @@ err_out:
 	/*
 	 * Handle the error correctly. Ceph returns -errno.
 	 */
-	DEBUG(2, ("[CEPH] Error return: %s\n", strerror(-ret)));
+	DBG_DEBUG("[CEPH] Error return: %s\n", strerror(-ret));
 	WRAP_RETURN(ret);
 }
 
 static void cephwrap_disconnect(struct vfs_handle_struct *handle)
 {
 	if (!cmount) {
-		DEBUG(0, ("[CEPH] Error, ceph not mounted\n"));
+		DBG_ERR("[CEPH] Error, ceph not mounted\n");
 		return;
 	}
 
 	/* Should we unmount/shutdown? Only if the last disconnect? */
 	if (--cmount_cnt) {
-		DEBUG(10, ("[CEPH] Not shuting down CEPH because still more connections\n"));
+		DBG_DEBUG("[CEPH] Not shuting down CEPH because still more connections\n");
 		return;
 	}
 
@@ -176,11 +176,11 @@ static uint64_t cephwrap_disk_free(struct vfs_handle_struct *handle,
 		*bsize = statvfs_buf.f_bsize;
 		*dfree = statvfs_buf.f_bavail;
 		*dsize = statvfs_buf.f_blocks;
-		DEBUG(10, ("[CEPH] bsize: %llu, dfree: %llu, dsize: %llu\n",
-			llu(*bsize), llu(*dfree), llu(*dsize)));
+		DBG_DEBUG("[CEPH] bsize: %llu, dfree: %llu, dsize: %llu\n",
+			llu(*bsize), llu(*dfree), llu(*dsize));
 		return *dfree;
 	} else {
-		DEBUG(10, ("[CEPH] ceph_statfs returned %d\n", ret));
+		DBG_DEBUG("[CEPH] ceph_statfs returned %d\n", ret);
 		WRAP_RETURN(ret);
 	}
 }
@@ -244,9 +244,9 @@ static int cephwrap_statvfs(struct vfs_handle_struct *handle,  const char *path,
 		statbuf->TotalFileNodes = statvfs_buf.f_files;
 		statbuf->FreeFileNodes = statvfs_buf.f_ffree;
 		statbuf->FsIdentifier = statvfs_buf.f_fsid;
-		DEBUG(10, ("[CEPH] f_bsize: %ld, f_blocks: %ld, f_bfree: %ld, f_bavail: %ld\n",
+		DBG_DEBUG("[CEPH] f_bsize: %ld, f_blocks: %ld, f_bfree: %ld, f_bavail: %ld\n",
 			(long int)statvfs_buf.f_bsize, (long int)statvfs_buf.f_blocks,
-			(long int)statvfs_buf.f_bfree, (long int)statvfs_buf.f_bavail));
+			(long int)statvfs_buf.f_bfree, (long int)statvfs_buf.f_bavail);
 	}
 	return ret;
 }
@@ -259,7 +259,7 @@ static DIR *cephwrap_opendir(struct vfs_handle_struct *handle,
 {
 	int ret = 0;
 	struct ceph_dir_result *result;
-	DEBUG(10, ("[CEPH] opendir(%p, %s)\n", handle, smb_fname->base_name));
+	DBG_DEBUG("[CEPH] opendir(%p, %s)\n", handle, smb_fname->base_name);
 
 	/* Returns NULL if it does not exist or there are problems ? */
 	ret = ceph_opendir(handle->data, smb_fname->base_name, &result);
@@ -268,7 +268,7 @@ static DIR *cephwrap_opendir(struct vfs_handle_struct *handle,
 		errno = -ret; /* We return result which is NULL in this case */
 	}
 
-	DEBUG(10, ("[CEPH] opendir(...) = %d\n", ret));
+	DBG_DEBUG("[CEPH] opendir(...) = %d\n", ret);
 	return (DIR *) result;
 }
 
@@ -279,7 +279,7 @@ static DIR *cephwrap_fdopendir(struct vfs_handle_struct *handle,
 {
 	int ret = 0;
 	struct ceph_dir_result *result;
-	DEBUG(10, ("[CEPH] fdopendir(%p, %p)\n", handle, fsp));
+	DBG_DEBUG("[CEPH] fdopendir(%p, %p)\n", handle, fsp);
 
 	ret = ceph_opendir(handle->data, fsp->fsp_name->base_name, &result);
 	if (ret < 0) {
@@ -287,7 +287,7 @@ static DIR *cephwrap_fdopendir(struct vfs_handle_struct *handle,
 		errno = -ret; /* We return result which is NULL in this case */
 	}
 
-	DEBUG(10, ("[CEPH] fdopendir(...) = %d\n", ret));
+	DBG_DEBUG("[CEPH] fdopendir(...) = %d\n", ret);
 	return (DIR *) result;
 }
 
@@ -297,9 +297,9 @@ static struct dirent *cephwrap_readdir(struct vfs_handle_struct *handle,
 {
 	struct dirent *result;
 
-	DEBUG(10, ("[CEPH] readdir(%p, %p)\n", handle, dirp));
+	DBG_DEBUG("[CEPH] readdir(%p, %p)\n", handle, dirp);
 	result = ceph_readdir(handle->data, (struct ceph_dir_result *) dirp);
-	DEBUG(10, ("[CEPH] readdir(...) = %p\n", result));
+	DBG_DEBUG("[CEPH] readdir(...) = %p\n", result);
 
 	/* Default Posix readdir() does not give us stat info.
 	 * Set to invalid to indicate we didn't return this info. */
@@ -310,22 +310,22 @@ static struct dirent *cephwrap_readdir(struct vfs_handle_struct *handle,
 
 static void cephwrap_seekdir(struct vfs_handle_struct *handle, DIR *dirp, long offset)
 {
-	DEBUG(10, ("[CEPH] seekdir(%p, %p, %ld)\n", handle, dirp, offset));
+	DBG_DEBUG("[CEPH] seekdir(%p, %p, %ld)\n", handle, dirp, offset);
 	ceph_seekdir(handle->data, (struct ceph_dir_result *) dirp, offset);
 }
 
 static long cephwrap_telldir(struct vfs_handle_struct *handle, DIR *dirp)
 {
 	long ret;
-	DEBUG(10, ("[CEPH] telldir(%p, %p)\n", handle, dirp));
+	DBG_DEBUG("[CEPH] telldir(%p, %p)\n", handle, dirp);
 	ret = ceph_telldir(handle->data, (struct ceph_dir_result *) dirp);
-	DEBUG(10, ("[CEPH] telldir(...) = %ld\n", ret));
+	DBG_DEBUG("[CEPH] telldir(...) = %ld\n", ret);
 	WRAP_RETURN(ret);
 }
 
 static void cephwrap_rewinddir(struct vfs_handle_struct *handle, DIR *dirp)
 {
-	DEBUG(10, ("[CEPH] rewinddir(%p, %p)\n", handle, dirp));
+	DBG_DEBUG("[CEPH] rewinddir(%p, %p)\n", handle, dirp);
 	ceph_rewinddir(handle->data, (struct ceph_dir_result *) dirp);
 }
 
@@ -338,7 +338,7 @@ static int cephwrap_mkdir(struct vfs_handle_struct *handle,
 	char *parent = NULL;
 	const char *path = smb_fname->base_name;
 
-	DEBUG(10, ("[CEPH] mkdir(%p, %s)\n", handle, path));
+	DBG_DEBUG("[CEPH] mkdir(%p, %s)\n", handle, path);
 
 	if (lp_inherit_acls(SNUM(handle->conn))
 	    && parent_dirname(talloc_tos(), path, &parent, NULL)
@@ -377,9 +377,9 @@ static int cephwrap_rmdir(struct vfs_handle_struct *handle,
 {
 	int result;
 
-	DEBUG(10, ("[CEPH] rmdir(%p, %s)\n", handle, smb_fname->base_name));
+	DBG_DEBUG("[CEPH] rmdir(%p, %s)\n", handle, smb_fname->base_name);
 	result = ceph_rmdir(handle->data, smb_fname->base_name);
-	DEBUG(10, ("[CEPH] rmdir(...) = %d\n", result));
+	DBG_DEBUG("[CEPH] rmdir(...) = %d\n", result);
 	WRAP_RETURN(result);
 }
 
@@ -387,9 +387,9 @@ static int cephwrap_closedir(struct vfs_handle_struct *handle, DIR *dirp)
 {
 	int result;
 
-	DEBUG(10, ("[CEPH] closedir(%p, %p)\n", handle, dirp));
+	DBG_DEBUG("[CEPH] closedir(%p, %p)\n", handle, dirp);
 	result = ceph_closedir(handle->data, (struct ceph_dir_result *) dirp);
-	DEBUG(10, ("[CEPH] closedir(...) = %d\n", result));
+	DBG_DEBUG("[CEPH] closedir(...) = %d\n", result);
 	WRAP_RETURN(result);
 }
 
@@ -400,7 +400,8 @@ static int cephwrap_open(struct vfs_handle_struct *handle,
 			files_struct *fsp, int flags, mode_t mode)
 {
 	int result = -ENOENT;
-	DEBUG(10, ("[CEPH] open(%p, %s, %p, %d, %d)\n", handle, smb_fname_str_dbg(smb_fname), fsp, flags, mode));
+	DBG_DEBUG("[CEPH] open(%p, %s, %p, %d, %d)\n", handle,
+		  smb_fname_str_dbg(smb_fname), fsp, flags, mode);
 
 	if (smb_fname->stream_name) {
 		goto out;
@@ -408,7 +409,7 @@ static int cephwrap_open(struct vfs_handle_struct *handle,
 
 	result = ceph_open(handle->data, smb_fname->base_name, flags, mode);
 out:
-	DEBUG(10, ("[CEPH] open(...) = %d\n", result));
+	DBG_DEBUG("[CEPH] open(...) = %d\n", result);
 	WRAP_RETURN(result);
 }
 
@@ -416,9 +417,9 @@ static int cephwrap_close(struct vfs_handle_struct *handle, files_struct *fsp)
 {
 	int result;
 
-	DEBUG(10, ("[CEPH] close(%p, %p)\n", handle, fsp));
+	DBG_DEBUG("[CEPH] close(%p, %p)\n", handle, fsp);
 	result = ceph_close(handle->data, fsp->fh->fd);
-	DEBUG(10, ("[CEPH] close(...) = %d\n", result));
+	DBG_DEBUG("[CEPH] close(...) = %d\n", result);
 
 	WRAP_RETURN(result);
 }
@@ -427,11 +428,11 @@ static ssize_t cephwrap_read(struct vfs_handle_struct *handle, files_struct *fsp
 {
 	ssize_t result;
 
-	DEBUG(10, ("[CEPH] read(%p, %p, %p, %llu)\n", handle, fsp, data, llu(n)));
+	DBG_DEBUG("[CEPH] read(%p, %p, %p, %llu)\n", handle, fsp, data, llu(n));
 
 	/* Using -1 for the offset means read/write rather than pread/pwrite */
 	result = ceph_read(handle->data, fsp->fh->fd, data, n, -1);
-	DEBUG(10, ("[CEPH] read(...) = %llu\n", llu(result)));
+	DBG_DEBUG("[CEPH] read(...) = %llu\n", llu(result));
 	WRAP_RETURN(result);
 }
 
@@ -440,10 +441,10 @@ static ssize_t cephwrap_pread(struct vfs_handle_struct *handle, files_struct *fs
 {
 	ssize_t result;
 
-	DEBUG(10, ("[CEPH] pread(%p, %p, %p, %llu, %llu)\n", handle, fsp, data, llu(n), llu(offset)));
+	DBG_DEBUG("[CEPH] pread(%p, %p, %p, %llu, %llu)\n", handle, fsp, data, llu(n), llu(offset));
 
 	result = ceph_read(handle->data, fsp->fh->fd, data, n, offset);
-	DEBUG(10, ("[CEPH] pread(...) = %llu\n", llu(result)));
+	DBG_DEBUG("[CEPH] pread(...) = %llu\n", llu(result));
 	WRAP_RETURN(result);
 }
 
@@ -452,11 +453,11 @@ static ssize_t cephwrap_write(struct vfs_handle_struct *handle, files_struct *fs
 {
 	ssize_t result;
 
-	DEBUG(10, ("[CEPH] write(%p, %p, %p, %llu)\n", handle, fsp, data, llu(n)));
+	DBG_DEBUG("[CEPH] write(%p, %p, %p, %llu)\n", handle, fsp, data, llu(n));
 
 	result = ceph_write(handle->data, fsp->fh->fd, data, n, -1);
 
-	DEBUG(10, ("[CEPH] write(...) = %llu\n", llu(result)));
+	DBG_DEBUG("[CEPH] write(...) = %llu\n", llu(result));
 	if (result < 0) {
 		WRAP_RETURN(result);
 	}
@@ -469,9 +470,9 @@ static ssize_t cephwrap_pwrite(struct vfs_handle_struct *handle, files_struct *f
 {
 	ssize_t result;
 
-	DEBUG(10, ("[CEPH] pwrite(%p, %p, %p, %llu, %llu)\n", handle, fsp, data, llu(n), llu(offset)));
+	DBG_DEBUG("[CEPH] pwrite(%p, %p, %p, %llu, %llu)\n", handle, fsp, data, llu(n), llu(offset));
 	result = ceph_write(handle->data, fsp->fh->fd, data, n, offset);
-	DEBUG(10, ("[CEPH] pwrite(...) = %llu\n", llu(result)));
+	DBG_DEBUG("[CEPH] pwrite(...) = %llu\n", llu(result));
 	WRAP_RETURN(result);
 }
 
@@ -479,7 +480,7 @@ static off_t cephwrap_lseek(struct vfs_handle_struct *handle, files_struct *fsp,
 {
 	off_t result = 0;
 
-	DEBUG(10, ("[CEPH] cephwrap_lseek\n"));
+	DBG_DEBUG("[CEPH] cephwrap_lseek\n");
 	/* Cope with 'stat' file opens. */
 	if (fsp->fh->fd != -1) {
 		result = ceph_lseek(handle->data, fsp->fh->fd, offset, whence);
@@ -493,7 +494,7 @@ static ssize_t cephwrap_sendfile(struct vfs_handle_struct *handle, int tofd, fil
 	/*
 	 * We cannot support sendfile because libceph is in user space.
 	 */
-	DEBUG(10, ("[CEPH] cephwrap_sendfile\n"));
+	DBG_DEBUG("[CEPH] cephwrap_sendfile\n");
 	errno = ENOTSUP;
 	return -1;
 }
@@ -507,7 +508,7 @@ static ssize_t cephwrap_recvfile(struct vfs_handle_struct *handle,
 	/*
 	 * We cannot support recvfile because libceph is in user space.
 	 */
-	DEBUG(10, ("[CEPH] cephwrap_recvfile\n"));
+	DBG_DEBUG("[CEPH] cephwrap_recvfile\n");
 	errno=ENOTSUP;
 	return -1;
 }
@@ -517,7 +518,7 @@ static int cephwrap_rename(struct vfs_handle_struct *handle,
 			  const struct smb_filename *smb_fname_dst)
 {
 	int result = -1;
-	DEBUG(10, ("[CEPH] cephwrap_rename\n"));
+	DBG_DEBUG("[CEPH] cephwrap_rename\n");
 	if (smb_fname_src->stream_name || smb_fname_dst->stream_name) {
 		errno = ENOENT;
 		return result;
@@ -530,18 +531,160 @@ static int cephwrap_rename(struct vfs_handle_struct *handle,
 static int cephwrap_fsync(struct vfs_handle_struct *handle, files_struct *fsp)
 {
 	int result;
-	DEBUG(10, ("[CEPH] cephwrap_fsync\n"));
+	DBG_DEBUG("[CEPH] cephwrap_fsync\n");
 	result = ceph_fsync(handle->data, fsp->fh->fd, false);
 	WRAP_RETURN(result);
 }
 
+#ifdef HAVE_CEPH_STATX
+#define SAMBA_STATX_ATTR_MASK	(CEPH_STATX_BASIC_STATS|CEPH_STATX_BTIME)
+
+static void init_stat_ex_from_ceph_statx(struct stat_ex *dst, const struct ceph_statx *stx)
+{
+	if ((stx->stx_mask & SAMBA_STATX_ATTR_MASK) != SAMBA_STATX_ATTR_MASK)
+		DBG_WARNING("%s: stx->stx_mask is incorrect (wanted %x, got %x)",
+				__func__, SAMBA_STATX_ATTR_MASK, stx->stx_mask);
+
+	dst->st_ex_dev = stx->stx_dev;
+	dst->st_ex_rdev = stx->stx_rdev;
+	dst->st_ex_ino = stx->stx_ino;
+	dst->st_ex_mode = stx->stx_mode;
+	dst->st_ex_uid = stx->stx_uid;
+	dst->st_ex_gid = stx->stx_gid;
+	dst->st_ex_size = stx->stx_size;
+	dst->st_ex_nlink = stx->stx_nlink;
+	dst->st_ex_atime = stx->stx_atime;
+	dst->st_ex_btime = stx->stx_btime;
+	dst->st_ex_ctime = stx->stx_ctime;
+	dst->st_ex_mtime = stx->stx_mtime;
+	dst->st_ex_calculated_birthtime = false;
+	dst->st_ex_blksize = stx->stx_blksize;
+	dst->st_ex_blocks = stx->stx_blocks;
+}
+
+static int cephwrap_stat(struct vfs_handle_struct *handle,
+			struct smb_filename *smb_fname)
+{
+	int result = -1;
+	struct ceph_statx stx;
+
+	DBG_DEBUG("[CEPH] stat(%p, %s)\n", handle, smb_fname_str_dbg(smb_fname));
+
+	if (smb_fname->stream_name) {
+		errno = ENOENT;
+		return result;
+	}
+
+	result = ceph_statx(handle->data, smb_fname->base_name, &stx,
+				SAMBA_STATX_ATTR_MASK, 0);
+	DBG_DEBUG("[CEPH] statx(...) = %d\n", result);
+	if (result < 0) {
+		WRAP_RETURN(result);
+	} else {
+		DBG_DEBUG("[CEPH]\tstx = {dev = %llx, ino = %llu, mode = 0x%x, nlink = %llu, "
+			   "uid = %d, gid = %d, rdev = %llx, size = %llu, blksize = %llu, "
+			   "blocks = %llu, atime = %llu, mtime = %llu, ctime = %llu, btime = %llu}\n",
+			   llu(stx.stx_dev), llu(stx.stx_ino), stx.stx_mode,
+			   llu(stx.stx_nlink), stx.stx_uid, stx.stx_gid, llu(stx.stx_rdev),
+			   llu(stx.stx_size), llu(stx.stx_blksize),
+			   llu(stx.stx_blocks), llu(stx.stx_atime.tv_sec), llu(stx.stx_mtime.tv_sec),
+			   llu(stx.stx_ctime.tv_sec), llu(stx.stx_btime.tv_sec));
+	}
+	init_stat_ex_from_ceph_statx(&smb_fname->st, &stx);
+	DBG_DEBUG("[CEPH] mode = 0x%x\n", smb_fname->st.st_ex_mode);
+	return result;
+}
+
+static int cephwrap_fstat(struct vfs_handle_struct *handle, files_struct *fsp, SMB_STRUCT_STAT *sbuf)
+{
+	int result = -1;
+	struct ceph_statx stx;
+
+	DBG_DEBUG("[CEPH] fstat(%p, %d)\n", handle, fsp->fh->fd);
+	result = ceph_fstatx(handle->data, fsp->fh->fd, &stx,
+				SAMBA_STATX_ATTR_MASK, 0);
+	DBG_DEBUG("[CEPH] fstat(...) = %d\n", result);
+	if (result < 0) {
+		WRAP_RETURN(result);
+	} else {
+		DBG_DEBUG("[CEPH]\tstx = {dev = %llx, ino = %llu, mode = 0x%x, nlink = %llu, "
+			   "uid = %d, gid = %d, rdev = %llx, size = %llu, blksize = %llu, "
+			   "blocks = %llu, atime = %llu, mtime = %llu, ctime = %llu, btime = %llu}\n",
+			   llu(stx.stx_dev), llu(stx.stx_ino), stx.stx_mode,
+			   llu(stx.stx_nlink), stx.stx_uid, stx.stx_gid, llu(stx.stx_rdev),
+			   llu(stx.stx_size), llu(stx.stx_blksize),
+			   llu(stx.stx_blocks), llu(stx.stx_atime.tv_sec), llu(stx.stx_mtime.tv_sec),
+			   llu(stx.stx_ctime.tv_sec), llu(stx.stx_btime.tv_sec));
+	}
+	init_stat_ex_from_ceph_statx(sbuf, &stx);
+	DBG_DEBUG("[CEPH] mode = 0x%x\n", sbuf->st_ex_mode);
+	return result;
+}
+
+static int cephwrap_lstat(struct vfs_handle_struct *handle,
+			 struct smb_filename *smb_fname)
+{
+	int result = -1;
+	struct ceph_statx stx;
+
+	DBG_DEBUG("[CEPH] lstat(%p, %s)\n", handle, smb_fname_str_dbg(smb_fname));
+
+	if (smb_fname->stream_name) {
+		errno = ENOENT;
+		return result;
+	}
+
+	result = ceph_statx(handle->data, smb_fname->base_name, &stx,
+				SAMBA_STATX_ATTR_MASK, AT_SYMLINK_NOFOLLOW);
+	DBG_DEBUG("[CEPH] lstat(...) = %d\n", result);
+	if (result < 0) {
+		WRAP_RETURN(result);
+	}
+	init_stat_ex_from_ceph_statx(&smb_fname->st, &stx);
+	return result;
+}
+
+static int cephwrap_ntimes(struct vfs_handle_struct *handle,
+			 const struct smb_filename *smb_fname,
+			 struct smb_file_time *ft)
+{
+	struct ceph_statx stx = { 0 };
+	int result;
+	int mask = 0;
+
+	if (!null_timespec(ft->atime)) {
+		stx.stx_atime = ft->atime;
+		mask |= CEPH_SETATTR_ATIME;
+	}
+	if (!null_timespec(ft->mtime)) {
+		stx.stx_mtime = ft->mtime;
+		mask |= CEPH_SETATTR_MTIME;
+	}
+	if (!null_timespec(ft->create_time)) {
+		stx.stx_btime = ft->create_time;
+		mask |= CEPH_SETATTR_BTIME;
+	}
+
+	if (!mask) {
+		return 0;
+	}
+
+	result = ceph_setattrx(handle->data, smb_fname->base_name, &stx, mask, 0);
+	DBG_DEBUG("[CEPH] ntimes(%p, %s, {%ld, %ld, %ld, %ld}) = %d\n", handle, smb_fname_str_dbg(smb_fname),
+				ft->mtime.tv_sec, ft->atime.tv_sec, ft->ctime.tv_sec,
+				ft->create_time.tv_sec, result);
+	return result;
+}
+
+#else /* HAVE_CEPH_STATX */
+
 static int cephwrap_stat(struct vfs_handle_struct *handle,
 			struct smb_filename *smb_fname)
 {
 	int result = -1;
 	struct stat stbuf;
 
-	DEBUG(10, ("[CEPH] stat(%p, %s)\n", handle, smb_fname_str_dbg(smb_fname)));
+	DBG_DEBUG("[CEPH] stat(%p, %s)\n", handle, smb_fname_str_dbg(smb_fname));
 
 	if (smb_fname->stream_name) {
 		errno = ENOENT;
@@ -549,21 +692,21 @@ static int cephwrap_stat(struct vfs_handle_struct *handle,
 	}
 
 	result = ceph_stat(handle->data, smb_fname->base_name, (struct stat *) &stbuf);
-	DEBUG(10, ("[CEPH] stat(...) = %d\n", result));
+	DBG_DEBUG("[CEPH] stat(...) = %d\n", result);
 	if (result < 0) {
 		WRAP_RETURN(result);
 	} else {
-		DEBUG(10, ("[CEPH]\tstbuf = {dev = %llu, ino = %llu, mode = 0x%x, nlink = %llu, "
+		DBG_DEBUG("[CEPH]\tstbuf = {dev = %llu, ino = %llu, mode = 0x%x, nlink = %llu, "
 			   "uid = %d, gid = %d, rdev = %llu, size = %llu, blksize = %llu, "
 			   "blocks = %llu, atime = %llu, mtime = %llu, ctime = %llu}\n",
 			   llu(stbuf.st_dev), llu(stbuf.st_ino), stbuf.st_mode, llu(stbuf.st_nlink),
 			   stbuf.st_uid, stbuf.st_gid, llu(stbuf.st_rdev), llu(stbuf.st_size), llu(stbuf.st_blksize),
-			   llu(stbuf.st_blocks), llu(stbuf.st_atime), llu(stbuf.st_mtime), llu(stbuf.st_ctime)));
+			   llu(stbuf.st_blocks), llu(stbuf.st_atime), llu(stbuf.st_mtime), llu(stbuf.st_ctime));
 	}


-- 
Samba Shared Repository
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.