[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri May 7 02:21:19 MDT 2010


The branch, master has been updated
       via  4ad1943... Make us pass all SMB2 lock tests except MULTIPLE-UNLOCK and CONTEXT. Them next :-).
      from  882fb18... Fix crash in cancel-tdis lock test. Correctly shut down connection.

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


- Log -----------------------------------------------------------------
commit 4ad1943d29a273ad3770e7abd5f266c25608eb39
Author: Jeremy Allison <jra at samba.org>
Date:   Fri May 7 01:20:26 2010 -0700

    Make us pass all SMB2 lock tests except MULTIPLE-UNLOCK and CONTEXT. Them next :-).
    
    Jeremy.

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

Summary of changes:
 source3/include/proto.h    |    7 +++++--
 source3/lib/dummysmbd.c    |    4 +++-
 source3/locking/locking.c  |    5 +++--
 source3/smbd/blocking.c    |    8 ++++++--
 source3/smbd/close.c       |    2 +-
 source3/smbd/globals.h     |    3 ++-
 source3/smbd/smb2_lock.c   |   10 ++++++++--
 source3/smbd/smb2_server.c |    8 ++++++++
 8 files changed, 36 insertions(+), 11 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index e16cae5..f05f76b 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -3473,7 +3473,8 @@ NTSTATUS do_lock_cancel(files_struct *fsp,
 			enum brl_flavour lock_flav,
 			struct blocking_lock_record *blr);
 void locking_close_file(struct messaging_context *msg_ctx,
-			files_struct *fsp);
+			files_struct *fsp,
+			enum file_close_type close_type);
 bool locking_init(void);
 bool locking_init_readonly(void);
 bool locking_end(void);
@@ -6002,7 +6003,9 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
 		uint64_t offset,
 		uint64_t count,
 		uint32 blocking_pid);
-void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lock *br_lck);
+void cancel_pending_lock_requests_by_fid(files_struct *fsp,
+			struct byte_range_lock *br_lck,
+			enum file_close_type close_type);
 void remove_pending_lock_requests_by_mid_smb1(uint64_t mid);
 bool blocking_lock_was_deferred_smb1(uint64_t mid);
 struct blocking_lock_record *blocking_lock_cancel_smb1(files_struct *fsp,
diff --git a/source3/lib/dummysmbd.c b/source3/lib/dummysmbd.c
index a41e6dc..01a5563 100644
--- a/source3/lib/dummysmbd.c
+++ b/source3/lib/dummysmbd.c
@@ -38,7 +38,9 @@ bool conn_snum_used(int snum)
 	return False;
 }
 
-void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lock *br_lck)
+void cancel_pending_lock_requests_by_fid(files_struct *fsp,
+			struct byte_range_lock *br_lck,
+			enum file_close_type close_type)
 {
 }
 
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 63bcff1..dc43f9e 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -396,7 +396,8 @@ NTSTATUS do_lock_cancel(files_struct *fsp,
 ****************************************************************************/
 
 void locking_close_file(struct messaging_context *msg_ctx,
-			files_struct *fsp)
+			files_struct *fsp,
+			enum file_close_type close_type)
 {
 	struct byte_range_lock *br_lck;
 
@@ -415,7 +416,7 @@ void locking_close_file(struct messaging_context *msg_ctx,
 	br_lck = brl_get_locks(talloc_tos(),fsp);
 
 	if (br_lck) {
-		cancel_pending_lock_requests_by_fid(fsp, br_lck);
+		cancel_pending_lock_requests_by_fid(fsp, br_lck, close_type);
 		brl_close_fnum(msg_ctx, br_lck);
 		TALLOC_FREE(br_lck);
 	}
diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c
index e78d807..942237b 100644
--- a/source3/smbd/blocking.c
+++ b/source3/smbd/blocking.c
@@ -571,13 +571,17 @@ static bool blocking_lock_record_process(struct blocking_lock_record *blr)
  Called when a file is closed.
 *****************************************************************************/
 
-void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lock *br_lck)
+void cancel_pending_lock_requests_by_fid(files_struct *fsp,
+			struct byte_range_lock *br_lck,
+			enum file_close_type close_type)
 {
 	struct smbd_server_connection *sconn = smbd_server_conn;
 	struct blocking_lock_record *blr, *blr_cancelled, *next = NULL;
 
 	if (sconn->allow_smb2) {
-		cancel_pending_lock_requests_by_fid_smb2(fsp, br_lck);
+		cancel_pending_lock_requests_by_fid_smb2(fsp,
+					br_lck,
+					close_type);
 		return;
 	}
 
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 098edac..20fe9e4 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -623,7 +623,7 @@ static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
 		status = ntstatus_keeperror(status, tmp);
 	}
 
-	locking_close_file(smbd_messaging_context(), fsp);
+	locking_close_file(smbd_messaging_context(), fsp, close_type);
 
 	tmp = fd_close(fsp);
 	status = ntstatus_keeperror(status, tmp);
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 34f8796..6543ee6 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -320,7 +320,8 @@ bool push_blocking_lock_request_smb2( struct byte_range_lock *br_lck,
 				uint32_t blocking_pid);
 void process_blocking_lock_queue_smb2(struct timeval tv_curr);
 void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
-			struct byte_range_lock *br_lck);
+			struct byte_range_lock *br_lck,
+			enum file_close_type close_type);
 /* From smbd/smb2_create.c */
 int map_smb2_oplock_levels_to_samba(uint8_t in_oplock_level);
 uint8_t map_samba_oplock_levels_to_smb2(int oplock_type);
diff --git a/source3/smbd/smb2_lock.c b/source3/smbd/smb2_lock.c
index b106c5f..9c8964a 100644
--- a/source3/smbd/smb2_lock.c
+++ b/source3/smbd/smb2_lock.c
@@ -840,7 +840,8 @@ void process_blocking_lock_queue_smb2(struct timeval tv_curr)
 ****************************************************************************/
 
 void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
-			struct byte_range_lock *br_lck)
+			struct byte_range_lock *br_lck,
+			enum file_close_type close_type)
 {
 	struct smbd_server_connection *sconn = smbd_server_conn;
 	struct smbd_smb2_request *smb2req, *nextreq;
@@ -904,6 +905,11 @@ void cancel_pending_lock_requests_by_fid_smb2(files_struct *fsp,
 				blr);
 
 		/* Finally end the request. */
-		tevent_req_nterror(smb2req->subreq, NT_STATUS_RANGE_NOT_LOCKED);
+		if (close_type == SHUTDOWN_CLOSE) {
+			tevent_req_done(smb2req->subreq);
+		} else {
+			tevent_req_nterror(smb2req->subreq,
+				NT_STATUS_RANGE_NOT_LOCKED);
+		}
 	}
 }
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index 243dd40..d8e6ba1 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -1097,10 +1097,18 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 
 	case SMB2_OP_LOCK:
 		if (!NT_STATUS_IS_OK(session_status)) {
+			/* Too ugly to live ? JRA. */
+			if (NT_STATUS_EQUAL(session_status,NT_STATUS_USER_SESSION_DELETED)) {
+				session_status = NT_STATUS_FILE_CLOSED;
+			}
 			return smbd_smb2_request_error(req, session_status);
 		}
 		status = smbd_smb2_request_check_tcon(req);
 		if (!NT_STATUS_IS_OK(status)) {
+			/* Too ugly to live ? JRA. */
+			if (NT_STATUS_EQUAL(status,NT_STATUS_NETWORK_NAME_DELETED)) {
+				status = NT_STATUS_FILE_CLOSED;
+			}
 			return smbd_smb2_request_error(req, status);
 		}
 		return smbd_smb2_request_process_lock(req);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list