[SCM] Samba Shared Repository - branch v3-6-test updated

Jeremy Allison jra at samba.org
Mon May 16 15:49:32 MDT 2011


The branch, v3-6-test has been updated
       via  a2bc1d3 Fix the SMB2 showstopper, found by an extended torture test from Volker.
       via  76f6eed Ensure we always write the correct incoming mid into the share mode table entries. (cherry picked from commit fe21bdc43c0aeacfc8592998e6a90f6f83c939e0)
      from  3275986 s3-printing: remove cups_pull_comment_location from header file

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit a2bc1d37b98a0581960039a5ff3deb55cf0c4f90
Author: Jeremy Allison <jra at samba.org>
Date:   Mon May 16 12:20:14 2011 -0700

    Fix the SMB2 showstopper, found by an extended torture test from Volker.
    
    In the oplock refactoring, the algorithm underwent an unnoticed change.
    In 3.5.x stat_opens were silently (i.e. no explicit code had comments
    explaining this) ignored when looking for oplock breaks and share mode
    violations. After the refactoring, the function find_oplock_types()
    no longer ignored stat_open entries in the share mode table when looking
    for batch and exclusive oplocks. This patch adds two changes to find_oplock_types()
    to ignore the case where the incoming open request is a stat open being
    tested against existing opens, and also when the incoming open request
    is a non-stat open being tested against existing stat opens. Neither
    of these cause an oplock break or share mode violation. Thanks a *lot*
    to Volker, who persevered in reproducing this problem.
    
    Autobuild-User: Jeremy Allison <jra at samba.org>
    Autobuild-Date: Mon May 16 22:38:20 CEST 2011 on sn-devel-104
    (cherry picked from commit 8cf14c21b3bc55454728bf48b23f696e15c92aea)

commit 76f6eed7068909c87f103e96e7e94e59647a7736
Author: Jeremy Allison <jra at samba.org>
Date:   Mon May 16 10:41:51 2011 -0700

    Ensure we always write the correct incoming mid into the share mode
    table entries.
    (cherry picked from commit fe21bdc43c0aeacfc8592998e6a90f6f83c939e0)

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

Summary of changes:
 source3/modules/onefs_open.c |    6 ++++--
 source3/smbd/open.c          |   34 +++++++++++++++++++++++++++++-----
 2 files changed, 33 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c
index 6ab47d7..101dc5b 100644
--- a/source3/modules/onefs_open.c
+++ b/source3/modules/onefs_open.c
@@ -1310,7 +1310,8 @@ NTSTATUS onefs_open_file_ntcreate(connection_struct *conn,
 		new_file_created = True;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0,
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0,
 		       fsp->oplock_type);
 
 	/* Handle strange delete on close create semantics. */
@@ -1666,7 +1667,8 @@ static NTSTATUS onefs_open_directory(connection_struct *conn,
 		return NT_STATUS_DELETE_PENDING;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0, NO_OPLOCK);
+	set_share_mode(lck, fsp, get_current_uid(conn),
+		req ? req->mid : 0, NO_OPLOCK);
 
 	/*
 	 * For directories the delete on close bit at open time seems
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 91dae4d..e537d0f 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -950,7 +950,9 @@ static NTSTATUS send_break_message(files_struct *fsp,
  * Do internal consistency checks on the share mode for a file.
  */
 
-static void find_oplock_types(struct share_mode_lock *lck,
+static void find_oplock_types(files_struct *fsp,
+				int oplock_request,
+				struct share_mode_lock *lck,
 				struct share_mode_entry **pp_batch,
 				struct share_mode_entry **pp_ex_or_batch,
 				bool *got_level2,
@@ -963,11 +965,27 @@ static void find_oplock_types(struct share_mode_lock *lck,
 	*got_level2 = false;
 	*got_no_oplock = false;
 
+	/* Ignore stat or internal opens, as is done in
+		delay_for_batch_oplocks() and
+		delay_for_exclusive_oplocks().
+	 */
+	if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
+		return;
+	}
+
 	for (i=0; i<lck->num_share_modes; i++) {
 		if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
 			continue;
 		}
 
+		if (lck->share_modes[i].op_type == NO_OPLOCK &&
+				is_stat_open(lck->share_modes[i].access_mask)) {
+			/* We ignore stat opens in the table - they
+			   always have NO_OPLOCK and never get or
+			   cause breaks. JRA. */
+			continue;
+		}
+
 		if (BATCH_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
 			/* batch - can only be one. */
 			if (*pp_ex_or_batch || *pp_batch || *got_level2 || *got_no_oplock) {
@@ -1907,7 +1925,9 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		}
 
 		/* Get the types we need to examine. */
-		find_oplock_types(lck,
+		find_oplock_types(fsp,
+				oplock_request,
+				lck,
 				&batch_entry,
 				&exclusive_entry,
 				&got_level2_oplock,
@@ -2152,7 +2172,9 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		}
 
 		/* Get the types we need to examine. */
-		find_oplock_types(lck,
+		find_oplock_types(fsp,
+				oplock_request,
+				lck,
 				&batch_entry,
 				&exclusive_entry,
 				&got_level2_oplock,
@@ -2336,7 +2358,8 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		new_file_created = True;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0,
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0,
 		       fsp->oplock_type);
 
 	/* Handle strange delete on close create semantics. */
@@ -2829,7 +2852,8 @@ static NTSTATUS open_directory(connection_struct *conn,
 		return status;
 	}
 
-	set_share_mode(lck, fsp, get_current_uid(conn), 0, NO_OPLOCK);
+	set_share_mode(lck, fsp, get_current_uid(conn),
+			req ? req->mid : 0, NO_OPLOCK);
 
 	/* For directories the delete on close bit at open time seems
 	   always to be honored on close... See test 19 in Samba4 BASE-DELETE. */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list