[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Nov 22 16:41:07 MST 2013


The branch, master has been updated
       via  a793ac0 smbd: Pull mtime handling into open_file_ntcreate
       via  4e344ab smbd: Point reply_open at the correct stat struct
       via  80e6ca5 smbd: Factor out get_share_mode_write_time of get_file_infos
      from  cb353a3 torture: test get/set compression ioctl permissions

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


- Log -----------------------------------------------------------------
commit a793ac016db95290470515d89c187365bfcb4f18
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Nov 22 16:24:42 2013 +0000

    smbd: Pull mtime handling into open_file_ntcreate
    
    This is a performance improvement for heavily contended files, in
    particular in a cluster. The separate call to get_file_infos makes us
    pull the locking.tdb record twice per open. For a contended file this
    can be a performance penalty, this gets the # of record accesses for
    the open/close cycle down from 3 to 2.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Sat Nov 23 00:40:49 CET 2013 on sn-devel-104

commit 4e344aba4e66e2e4f59f407f305072bfbb82dc7d
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Nov 22 16:17:44 2013 +0000

    smbd: Point reply_open at the correct stat struct
    
    Not sure if anybody will ever notice this these days, but the same is
    done in the createfile calls.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 80e6ca56258f436df07fcfea6854cf653d5f3f0d
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Nov 22 14:36:49 2013 +0000

    smbd: Factor out get_share_mode_write_time of get_file_infos
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 source3/locking/locking.c  |   19 +++++++++++--------
 source3/locking/proto.h    |    1 +
 source3/smbd/nttrans.c     |   18 ------------------
 source3/smbd/open.c        |   23 +++++++++++++++++++++++
 source3/smbd/reply.c       |   17 ++++-------------
 source3/smbd/smb2_create.c |    8 --------
 6 files changed, 39 insertions(+), 47 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index b5d4f24..54c92b1 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -600,14 +600,7 @@ void get_file_infos(struct file_id id,
 	}
 
 	if (write_time) {
-		struct timespec wt;
-
-		wt = lck->data->changed_write_time;
-		if (null_timespec(wt)) {
-			wt = lck->data->old_write_time;
-		}
-
-		*write_time = wt;
+		*write_time = get_share_mode_write_time(lck);
 	}
 
 	TALLOC_FREE(lck);
@@ -1088,3 +1081,13 @@ bool set_write_time(struct file_id fileid, struct timespec write_time)
 	TALLOC_FREE(lck);
 	return True;
 }
+
+struct timespec get_share_mode_write_time(struct share_mode_lock *lck)
+{
+	struct share_mode_data *d = lck->data;
+
+	if (!null_timespec(d->changed_write_time)) {
+		return d->changed_write_time;
+	}
+	return d->old_write_time;
+}
diff --git a/source3/locking/proto.h b/source3/locking/proto.h
index 2c9654c..a897fea 100644
--- a/source3/locking/proto.h
+++ b/source3/locking/proto.h
@@ -197,6 +197,7 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close,
 bool is_delete_on_close_set(struct share_mode_lock *lck, uint32_t name_hash);
 bool set_sticky_write_time(struct file_id fileid, struct timespec write_time);
 bool set_write_time(struct file_id fileid, struct timespec write_time);
+struct timespec get_share_mode_write_time(struct share_mode_lock *lck);
 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
 				 const char *, void *),
 		      void *private_data);
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 94be9f6..e901ff2 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -457,7 +457,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
 	struct timespec c_timespec;
 	struct timespec a_timespec;
 	struct timespec m_timespec;
-	struct timespec write_time_ts;
 	NTSTATUS status;
 	int oplock_request;
 	uint8_t oplock_granted = NO_OPLOCK_RETURN;
@@ -657,14 +656,6 @@ void reply_ntcreate_and_X(struct smb_request *req)
 		fattr = FILE_ATTRIBUTE_NORMAL;
 	}
 
-	/* Deal with other possible opens having a modified
-	   write time. JRA. */
-	ZERO_STRUCT(write_time_ts);
-	get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
-	if (!null_timespec(write_time_ts)) {
-		update_stat_ex_mtime(&smb_fname->st, write_time_ts);
-	}
-
 	/* Create time. */
 	create_timespec = get_create_timespec(conn, fsp, smb_fname);
 	a_timespec = smb_fname->st.st_ex_atime;
@@ -1001,7 +992,6 @@ static void call_nt_transact_create(connection_struct *conn,
 	struct timespec c_timespec;
 	struct timespec a_timespec;
 	struct timespec m_timespec;
-	struct timespec write_time_ts;
 	struct ea_list *ea_list = NULL;
 	NTSTATUS status;
 	size_t param_len;
@@ -1270,14 +1260,6 @@ static void call_nt_transact_create(connection_struct *conn,
 		fattr = FILE_ATTRIBUTE_NORMAL;
 	}
 
-	/* Deal with other possible opens having a modified
-	   write time. JRA. */
-	ZERO_STRUCT(write_time_ts);
-	get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
-	if (!null_timespec(write_time_ts)) {
-		update_stat_ex_mtime(&smb_fname->st, write_time_ts);
-	}
-
 	/* Create time. */
 	create_timespec = get_create_timespec(conn, fsp, smb_fname);
 	a_timespec = smb_fname->st.st_ex_atime;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 5370cb8..2d866bb 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2845,6 +2845,17 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 				  (unsigned int)new_unx_mode));
 	}
 
+	{
+		/*
+		 * Deal with other opens having a modified write time.
+		 */
+		struct timespec write_time = get_share_mode_write_time(lck);
+
+		if (!null_timespec(write_time)) {
+			update_stat_ex_mtime(&fsp->fsp_name->st, write_time);
+		}
+	}
+
 	TALLOC_FREE(lck);
 
 	return NT_STATUS_OK;
@@ -3281,6 +3292,18 @@ static NTSTATUS open_directory(connection_struct *conn,
 		}
 	}
 
+	{
+		/*
+		 * Deal with other opens having a modified write time. Is this
+		 * possible for directories?
+		 */
+		struct timespec write_time = get_share_mode_write_time(lck);
+
+		if (!null_timespec(write_time)) {
+			update_stat_ex_mtime(&fsp->fsp_name->st, write_time);
+		}
+	}
+
 	TALLOC_FREE(lck);
 
 	if (pinfo) {
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index ffbfabb..87bda99 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1960,21 +1960,13 @@ void reply_open(struct smb_request *req)
 		goto out;
 	}
 
+	/* Ensure we're pointing at the correct stat struct. */
+	TALLOC_FREE(smb_fname);
+	smb_fname = fsp->fsp_name;
+
 	size = smb_fname->st.st_ex_size;
 	fattr = dos_mode(conn, smb_fname);
 
-	/* Deal with other possible opens having a modified
-	   write time. JRA. */
-	if (ask_sharemode) {
-		struct timespec write_time_ts;
-
-		ZERO_STRUCT(write_time_ts);
-		get_file_infos(fsp->file_id, 0, NULL, &write_time_ts);
-		if (!null_timespec(write_time_ts)) {
-			update_stat_ex_mtime(&smb_fname->st, write_time_ts);
-		}
-	}
-
 	mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime);
 
 	if (fattr & FILE_ATTRIBUTE_DIRECTORY) {
@@ -2007,7 +1999,6 @@ void reply_open(struct smb_request *req)
 		      CVAL(req->outbuf,smb_flg)|CORE_OPLOCK_GRANTED);
 	}
  out:
-	TALLOC_FREE(smb_fname);
 	END_PROFILE(SMBopen);
 	return;
 }
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index f48c8ee..38eba4f 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -411,7 +411,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 	struct smb_request *smb1req = NULL;
 	files_struct *result = NULL;
 	int info;
-	struct timespec write_time_ts;
 	struct smb2_create_blobs out_context_blobs;
 	int requested_oplock_level;
 	struct smb2_create_blob *dhnc = NULL;
@@ -1066,13 +1065,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 	}
 	state->out_file_attributes = dos_mode(result->conn,
 					   result->fsp_name);
-	/* Deal with other possible opens having a modified
-	   write time. JRA. */
-	ZERO_STRUCT(write_time_ts);
-	get_file_infos(result->file_id, 0, NULL, &write_time_ts);
-	if (!null_timespec(write_time_ts)) {
-		update_stat_ex_mtime(&result->fsp_name->st, write_time_ts);
-	}
 
 	unix_timespec_to_nt_time(&state->out_creation_time,
 			get_create_timespec(smb1req->conn, result,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list