[SCM] Samba Shared Repository - branch master updated - 6f9e7505b29da753d98dba4de98e2dbf7e6b6b2b

Jeremy Allison jra at samba.org
Thu Dec 18 21:28:38 GMT 2008


The branch, master has been updated
       via  6f9e7505b29da753d98dba4de98e2dbf7e6b6b2b (commit)
      from  ff98d7f9ce1213aeff3d196d8f415303974ffd77 (commit)

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


- Log -----------------------------------------------------------------
commit 6f9e7505b29da753d98dba4de98e2dbf7e6b6b2b
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Dec 18 13:27:42 2008 -0800

    Fix bug #5980 - Race condition when granting level2 oplocks can cause break notify to be missed.
    Jeremy.

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

Summary of changes:
 source3/smbd/oplock.c |   31 +++++++++++++++++++++++++++----
 1 files changed, 27 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index c98d114..261d8fd 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -821,10 +821,33 @@ void release_level_2_oplocks_on_change(files_struct *fsp)
 
 		share_mode_entry_to_message(msg, share_entry);
 
-		messaging_send_buf(smbd_messaging_context(), share_entry->pid,
-				   MSG_SMB_ASYNC_LEVEL2_BREAK,
-				   (uint8 *)msg,
-				   MSG_SMB_SHARE_MODE_ENTRY_SIZE);
+		/*
+		 * Deal with a race condition when breaking level2
+ 		 * oplocks. Don't send all the messages and release
+ 		 * the lock, this allows someone else to come in and
+ 		 * get a level2 lock before any of the messages are
+ 		 * processed, and thus miss getting a break message.
+ 		 * Ensure at least one entry (the one we're breaking)
+ 		 * is processed immediately under the lock and becomes
+ 		 * set as NO_OPLOCK to stop any waiter getting a level2.
+ 		 * Bugid #5980.
+ 		 */
+
+		if (procid_is_me(&share_entry->pid)) {
+			DATA_BLOB blob = data_blob_const(msg,
+					MSG_SMB_SHARE_MODE_ENTRY_SIZE);
+			process_oplock_async_level2_break_message(smbd_messaging_context(),
+						NULL,
+						MSG_SMB_ASYNC_LEVEL2_BREAK,
+						share_entry->pid,
+						&blob);
+		} else {
+			messaging_send_buf(smbd_messaging_context(),
+					share_entry->pid,
+					MSG_SMB_ASYNC_LEVEL2_BREAK,
+					(uint8 *)msg,
+					MSG_SMB_SHARE_MODE_ENTRY_SIZE);
+		}
 	}
 
 	/* We let the message receivers handle removing the oplock state


-- 
Samba Shared Repository


More information about the samba-cvs mailing list