[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed May 19 20:31:27 MDT 2010


The branch, master has been updated
       via  af44593... (Finally) fix bug #7158 - SMB2 connection resets during IOZone tests from 64-bit Vista client
      from  ae02691... tsocket: Improve the language in some parts of the guide.

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


- Log -----------------------------------------------------------------
commit af445935555dc3fab3cefc52b375dd18b8d9bb4c
Author: Jeremy Allison <jra at samba.org>
Date:   Wed May 19 19:28:26 2010 -0700

    (Finally) fix bug #7158 - SMB2 connection resets during IOZone tests from 64-bit Vista client
    
    It turns out that the persistent handles are used by the Microsoft
    redirector to index files on oplock break requests. So even if we
    don't do durable handles (yet) we must set the persistent handle
    on create. For now just use the same handle value as we use for
    volatile.
    
    Jeremy.

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

Summary of changes:
 source3/smbd/globals.h      |    1 +
 source3/smbd/smb2_break.c   |    3 ++-
 source3/smbd/smb2_close.c   |    2 +-
 source3/smbd/smb2_create.c  |   10 +++++++++-
 source3/smbd/smb2_find.c    |    2 +-
 source3/smbd/smb2_flush.c   |    2 +-
 source3/smbd/smb2_getinfo.c |    2 +-
 source3/smbd/smb2_ioctl.c   |    2 +-
 source3/smbd/smb2_lock.c    |    2 +-
 source3/smbd/smb2_notify.c  |    2 +-
 source3/smbd/smb2_read.c    |    2 +-
 source3/smbd/smb2_server.c  |    3 ++-
 source3/smbd/smb2_setinfo.c |    2 +-
 source3/smbd/smb2_write.c   |    2 +-
 14 files changed, 24 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index f6dd36e..bb4f695 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -269,6 +269,7 @@ NTSTATUS smbd_smb2_request_done_ex(struct smbd_smb2_request *req,
 	smbd_smb2_request_done_ex(req, NT_STATUS_OK, body, dyn, __location__)
 
 NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
+				     uint64_t file_id_persistent,
 				     uint64_t file_id_volatile,
 				     uint8_t oplock_level);
 
diff --git a/source3/smbd/smb2_break.c b/source3/smbd/smb2_break.c
index a214da0..79b06b1 100644
--- a/source3/smbd/smb2_break.c
+++ b/source3/smbd/smb2_break.c
@@ -70,7 +70,7 @@ NTSTATUS smbd_smb2_request_process_break(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
@@ -271,6 +271,7 @@ void send_break_message_smb2(files_struct *fsp, int level)
 
 	status = smbd_smb2_send_oplock_break(fsp->conn->sconn,
 					(uint64_t)fsp->fnum,
+					(uint64_t)fsp->fnum,
 					smb2_oplock_level);
 	if (!NT_STATUS_IS_OK(status)) {
 		smbd_server_connection_terminate(fsp->conn->sconn,
diff --git a/source3/smbd/smb2_close.c b/source3/smbd/smb2_close.c
index b28fb72..56e3167 100644
--- a/source3/smbd/smb2_close.c
+++ b/source3/smbd/smb2_close.c
@@ -58,7 +58,7 @@ NTSTATUS smbd_smb2_request_process_close(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index 02f83cb..65022d5 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -87,6 +87,7 @@ static NTSTATUS smbd_smb2_create_recv(struct tevent_req *req,
 			uint64_t *out_allocation_size,
 			uint64_t *out_end_of_file,
 			uint32_t *out_file_attributes,
+			uint64_t *out_file_id_persistent,
 			uint64_t *out_file_id_volatile,
 			struct smb2_create_blobs *out_context_blobs);
 
@@ -264,6 +265,7 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
 	uint64_t out_allocation_size = 0;
 	uint64_t out_end_of_file = 0;
 	uint32_t out_file_attributes = 0;
+	uint64_t out_file_id_persistent = 0;
 	uint64_t out_file_id_volatile = 0;
 	struct smb2_create_blobs out_context_blobs;
 	DATA_BLOB out_context_buffer;
@@ -295,6 +297,7 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
 				       &out_allocation_size,
 				       &out_end_of_file,
 				       &out_file_attributes,
+				       &out_file_id_persistent,
 				       &out_file_id_volatile,
 				       &out_context_blobs);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -356,7 +359,8 @@ static void smbd_smb2_request_create_done(struct tevent_req *tsubreq)
 	SIVAL(outbody.data, 0x38,
 	      out_file_attributes);		/* file attributes */
 	SIVAL(outbody.data, 0x3C, 0);		/* reserved */
-	SBVAL(outbody.data, 0x40, 0);		/* file id (persistent) */
+	SBVAL(outbody.data, 0x40,
+	      out_file_id_persistent);		/* file id (persistent) */
 	SBVAL(outbody.data, 0x48,
 	      out_file_id_volatile);		/* file id (volatile) */
 	SIVAL(outbody.data, 0x50,
@@ -391,6 +395,7 @@ struct smbd_smb2_create_state {
 	uint64_t out_allocation_size;
 	uint64_t out_end_of_file;
 	uint32_t out_file_attributes;
+	uint64_t out_file_id_persistent;
 	uint64_t out_file_id_volatile;
 	struct smb2_create_blobs out_context_blobs;
 };
@@ -791,6 +796,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 	if (state->out_file_attributes == 0) {
 		state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
 	}
+	state->out_file_id_persistent = result->fnum;
 	state->out_file_id_volatile = result->fnum;
 	state->out_context_blobs = out_context_blobs;
 
@@ -809,6 +815,7 @@ static NTSTATUS smbd_smb2_create_recv(struct tevent_req *req,
 			uint64_t *out_allocation_size,
 			uint64_t *out_end_of_file,
 			uint32_t *out_file_attributes,
+			uint64_t *out_file_id_persistent,
 			uint64_t *out_file_id_volatile,
 			struct smb2_create_blobs *out_context_blobs)
 {
@@ -830,6 +837,7 @@ static NTSTATUS smbd_smb2_create_recv(struct tevent_req *req,
 	*out_allocation_size	= state->out_allocation_size;
 	*out_end_of_file	= state->out_end_of_file;
 	*out_file_attributes	= state->out_file_attributes;
+	*out_file_id_persistent	= state->out_file_id_persistent;
 	*out_file_id_volatile	= state->out_file_id_volatile;
 	*out_context_blobs	= state->out_context_blobs;
 
diff --git a/source3/smbd/smb2_find.c b/source3/smbd/smb2_find.c
index 6690adc..9a7738a 100644
--- a/source3/smbd/smb2_find.c
+++ b/source3/smbd/smb2_find.c
@@ -114,7 +114,7 @@ NTSTATUS smbd_smb2_request_process_find(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_flush.c b/source3/smbd/smb2_flush.c
index 561e690..108f3bd 100644
--- a/source3/smbd/smb2_flush.c
+++ b/source3/smbd/smb2_flush.c
@@ -57,7 +57,7 @@ NTSTATUS smbd_smb2_request_process_flush(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_getinfo.c b/source3/smbd/smb2_getinfo.c
index d8963f4..547d9db 100644
--- a/source3/smbd/smb2_getinfo.c
+++ b/source3/smbd/smb2_getinfo.c
@@ -97,7 +97,7 @@ NTSTATUS smbd_smb2_request_process_getinfo(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_ioctl.c b/source3/smbd/smb2_ioctl.c
index c7775b4..672965f 100644
--- a/source3/smbd/smb2_ioctl.c
+++ b/source3/smbd/smb2_ioctl.c
@@ -88,7 +88,7 @@ NTSTATUS smbd_smb2_request_process_ioctl(struct smbd_smb2_request *req)
 	} else if (in_file_id_persistent == UINT64_MAX &&
 		   in_file_id_volatile == UINT64_MAX) {
 		/* without a handle */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c
index 8e66248..df59715 100644
--- a/source3/smbd/smb2_lock.c
+++ b/source3/smbd/smb2_lock.c
@@ -96,7 +96,7 @@ NTSTATUS smbd_smb2_request_process_lock(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_notify.c b/source3/smbd/smb2_notify.c
index f3d8077..bffa651 100644
--- a/source3/smbd/smb2_notify.c
+++ b/source3/smbd/smb2_notify.c
@@ -85,7 +85,7 @@ NTSTATUS smbd_smb2_request_process_notify(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_read.c b/source3/smbd/smb2_read.c
index 7a92cdf..d4c38d6 100644
--- a/source3/smbd/smb2_read.c
+++ b/source3/smbd/smb2_read.c
@@ -83,7 +83,7 @@ NTSTATUS smbd_smb2_request_process_read(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index 75c818b..b081b6a 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -1448,6 +1448,7 @@ struct smbd_smb2_send_oplock_break_state {
 static void smbd_smb2_oplock_break_writev_done(struct tevent_req *subreq);
 
 NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
+				     uint64_t file_id_persistent,
 				     uint64_t file_id_volatile,
 				     uint8_t oplock_level)
 {
@@ -1488,7 +1489,7 @@ NTSTATUS smbd_smb2_send_oplock_break(struct smbd_server_connection *sconn,
 	SCVAL(body, 0x02, oplock_level);
 	SCVAL(body, 0x03, 0);		/* reserved */
 	SIVAL(body, 0x04, 0);		/* reserved */
-	SBVAL(body, 0x08, 0);		/* file_id_persistent */
+	SBVAL(body, 0x08, file_id_persistent);
 	SBVAL(body, 0x10, file_id_volatile);
 
 	subreq = tstream_writev_queue_send(state,
diff --git a/source3/smbd/smb2_setinfo.c b/source3/smbd/smb2_setinfo.c
index 6a40714..3e1bdd2 100644
--- a/source3/smbd/smb2_setinfo.c
+++ b/source3/smbd/smb2_setinfo.c
@@ -88,7 +88,7 @@ NTSTATUS smbd_smb2_request_process_setinfo(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 
diff --git a/source3/smbd/smb2_write.c b/source3/smbd/smb2_write.c
index 7813836..ae98c81 100644
--- a/source3/smbd/smb2_write.c
+++ b/source3/smbd/smb2_write.c
@@ -96,7 +96,7 @@ NTSTATUS smbd_smb2_request_process_write(struct smbd_smb2_request *req)
 
 	if (req->compat_chain_fsp) {
 		/* skip check */
-	} else if (in_file_id_persistent != 0) {
+	} else if (in_file_id_persistent != in_file_id_volatile) {
 		return smbd_smb2_request_error(req, NT_STATUS_FILE_CLOSED);
 	}
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list