[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Feb 20 12:55:03 MST 2015


The branch, master has been updated
       via  a6008b2 s3: smbd: SMB2 close. If a file has delete on close, store the return info before deleting.
       via  4a8c698 s3: smbd: SMB2 close. Call utility function setup_close_full_information()
       via  2ccfdf7 s3: smbd: SMB2 close. Add utility function setup_close_full_information()
      from  e6e6f56 doc:man:vfs_glusterfs: improve the configuration section.

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


- Log -----------------------------------------------------------------
commit a6008b2de7b2974073f38a1df88aacc27d3c6f57
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Feb 19 18:50:45 2015 -0800

    s3: smbd: SMB2 close. If a file has delete on close, store the return info before deleting.
    
    If we delete the file on close, the stat after the close
    will fail so we fail to return the attributes requested.
    
    Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.
    
    https://bugzilla.samba.org/show_bug.cgi?id=11104
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Steve French <sfrench at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Feb 20 20:54:18 CET 2015 on sn-devel-104

commit 4a8c6988e349a4f714f3052ebf3f96f801d3c11f
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Feb 19 18:49:03 2015 -0800

    s3: smbd: SMB2 close. Call utility function setup_close_full_information()
    
    Replaces existing inline code.
    
    Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.
    
    https://bugzilla.samba.org/show_bug.cgi?id=11104
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Steve French <sfrench at samba.org>

commit 2ccfdf760e4adcf25d59c629c9d6d6b31a10a9f1
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Feb 19 18:46:55 2015 -0800

    s3: smbd: SMB2 close. Add utility function setup_close_full_information()
    
    Not yet used.
    
    Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.
    
    https://bugzilla.samba.org/show_bug.cgi?id=11104
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Steve French <sfrench at samba.org>

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

Summary of changes:
 source3/smbd/smb2_close.c | 99 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 73 insertions(+), 26 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index 0e1475d..ed53e1b 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -149,6 +149,48 @@ static void smbd_smb2_request_close_done(struct tevent_req *subreq)
 	}
 }
 
+static void setup_close_full_information(connection_struct *conn,
+				struct smb_filename *smb_fname,
+				bool posix_open,
+				struct timespec *out_creation_ts,
+				struct timespec *out_last_access_ts,
+				struct timespec *out_last_write_ts,
+				struct timespec *out_change_ts,
+				uint16_t *out_flags,
+				uint64_t *out_allocation_size,
+				uint64_t *out_end_of_file,
+				uint32_t *out_file_attributes)
+{
+	int ret;
+	if (posix_open) {
+		ret = SMB_VFS_LSTAT(conn, smb_fname);
+	} else {
+		ret = SMB_VFS_STAT(conn, smb_fname);
+	}
+	if (ret != 0) {
+		return;
+	}
+
+	*out_flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
+	*out_file_attributes = dos_mode(conn, smb_fname);
+	*out_last_write_ts = smb_fname->st.st_ex_mtime;
+	*out_last_access_ts = smb_fname->st.st_ex_atime;
+	*out_creation_ts = get_create_timespec(conn, NULL, smb_fname);
+	*out_change_ts = get_change_timespec(conn, NULL, smb_fname);
+
+	if (lp_dos_filetime_resolution(SNUM(conn))) {
+		dos_filetime_timespec(out_creation_ts);
+		dos_filetime_timespec(out_last_write_ts);
+		dos_filetime_timespec(out_last_access_ts);
+		dos_filetime_timespec(out_change_ts);
+	}
+	if (!(*out_file_attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+		*out_end_of_file = get_file_size_stat(&smb_fname->st);
+	}
+
+	*out_allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, NULL, &smb_fname->st);
+}
+
 static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 				struct files_struct *fsp,
 				uint16_t in_flags,
@@ -195,6 +237,26 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 		return NT_STATUS_NO_MEMORY;
 	}
 
+	if ((in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) &&
+	    (fsp->initial_delete_on_close || fsp->delete_on_close)) {
+		/*
+		 * We might be deleting the file. Ensure we
+		 * return valid data from before the file got
+		 * removed.
+		 */
+		setup_close_full_information(conn,
+				smb_fname,
+				posix_open,
+				out_creation_ts,
+				out_last_access_ts,
+				out_last_write_ts,
+				out_change_ts,
+				&flags,
+				&allocation_size,
+				&file_size,
+				&dos_attrs);
+	}
+
 	status = close_file(smbreq, fsp, NORMAL_CLOSE);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",
@@ -203,32 +265,17 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
 	}
 
 	if (in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) {
-		int ret;
-		if (posix_open) {
-			ret = SMB_VFS_LSTAT(conn, smb_fname);
-		} else {
-			ret = SMB_VFS_STAT(conn, smb_fname);
-		}
-		if (ret == 0) {
-			flags = SMB2_CLOSE_FLAGS_FULL_INFORMATION;
-			dos_attrs = dos_mode(conn, smb_fname);
-			*out_last_write_ts = smb_fname->st.st_ex_mtime;
-			*out_last_access_ts = smb_fname->st.st_ex_atime;
-			*out_creation_ts = get_create_timespec(conn, NULL, smb_fname);
-			*out_change_ts = get_change_timespec(conn, NULL, smb_fname);
-
-			if (lp_dos_filetime_resolution(SNUM(conn))) {
-				dos_filetime_timespec(out_creation_ts);
-				dos_filetime_timespec(out_last_write_ts);
-				dos_filetime_timespec(out_last_access_ts);
-				dos_filetime_timespec(out_change_ts);
-			}
-			if (!(dos_attrs & FILE_ATTRIBUTE_DIRECTORY)) {
-				file_size = get_file_size_stat(&smb_fname->st);
-			}
-
-			allocation_size = SMB_VFS_GET_ALLOC_SIZE(conn, NULL, &smb_fname->st);
-		}
+		setup_close_full_information(conn,
+				smb_fname,
+				posix_open,
+				out_creation_ts,
+				out_last_access_ts,
+				out_last_write_ts,
+				out_change_ts,
+				&flags,
+				&allocation_size,
+				&file_size,
+				&dos_attrs);
 	}
 
 	*out_flags = flags;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list