[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Jan 17 22:39:03 UTC 2020


The branch, master has been updated
       via  7606800b798 smbd: avoid calling vfs_file_id_from_sbuf() if statinfo is not valid
      from  c9adf47ac5a vfs_glusterfs: Return fake fd from pipe() during open

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


- Log -----------------------------------------------------------------
commit 7606800b798a31d62e69f61d441201e5db2f0d8a
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 17 10:56:00 2020 +0100

    smbd: avoid calling vfs_file_id_from_sbuf() if statinfo is not valid
    
    When we're about to create a file, the stat info will be all zero, so
    vfs_file_id_from_sbuf() would return a bogus file_id. This is normally not a
    problem, as open_file() itself also calls vfs_file_id_from_sbuf() after having
    created the file.
    
    This is however a problem when using the VFS module fileid, as that is doing
    caching of /etc/mtab and failing to find smb_fname->st.st_ex_dev (all zero in
    this case when creating a new file) in the mtab cache will trigger a mtab reload
    which can be *very* expensive.
    
    Copying many small files to a Samba server in this situation will result in
    abysimal performance.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=14237
    
    Pair-Programmed-With: Jeremy Allison <jra at samba.org>
    Signed-off-by: Ralph Boehme <slow at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Jan 17 22:38:14 UTC 2020 on sn-devel-184

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

Summary of changes:
 source3/smbd/open.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index a012e33316f..e64e22581e0 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -3596,7 +3596,15 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		return NT_STATUS_ACCESS_DENIED;
 	}
 
-	fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
+	if (VALID_STAT(smb_fname->st)) {
+		/*
+		 * Only try and create a file id before open
+		 * for an existing file. For a file being created
+		 * this won't do anything useful until the file
+		 * exists and has a valid stat struct.
+		 */
+		fsp->file_id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
+	}
 	fsp->fh->private_options = private_flags;
 	fsp->access_mask = open_access_mask; /* We change this to the
 					      * requested access_mask after


-- 
Samba Shared Repository



More information about the samba-cvs mailing list