[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Feb 12 22:29:43 MST 2010


The branch, master has been updated
       via  cb0ea27... s3/smbd: change locking behavior when "lock spin time = 0".
      from  465ffba... Remove #if SOFTLINK_OPTIMIZATION code.

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


- Log -----------------------------------------------------------------
commit cb0ea273696fc9024e6da18eb3e319024f8643f5
Author: Steven Danneman <steven.danneman at isilon.com>
Date:   Fri Feb 12 15:42:50 2010 -0800

    s3/smbd: change locking behavior when "lock spin time = 0".
    
    The "lock spin time" parameter mimics the following Windows
    setting which by default is 250ms in Windows and 200ms in Samba.
    
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\LockViolationDelay
    
    When a client sends repeated, non-blocking, contending BRL requests
    to a Windows server, after the first Windows starts treating these
    requests as timed blocking locks with the above timeout.
    
    As an efficiency, I've changed the behavior when this setting is 0,
    to skip this logic and treat all requests as non-blocking locks.
    
    This gives the smbd server behavior similar to the 3.0 release with
    the do_spin_lock() implementation.
    
    I've also changed the blocking lock parameter in the call from
    push_blocking_lock_request() to true as all requests made in this
    path are blocking by definition.

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

Summary of changes:
 source3/smbd/blocking.c |    2 +-
 source3/smbd/reply.c    |   21 +++++++++++++++------
 2 files changed, 16 insertions(+), 7 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c
index 04e28a9..cb48cc8 100644
--- a/source3/smbd/blocking.c
+++ b/source3/smbd/blocking.c
@@ -205,7 +205,7 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
 			count,
 			lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK,
 			blr->lock_flav,
-			lock_timeout ? True : False, /* blocking_lock. */
+			True,
 			NULL,
 			blr);
 
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index b6316aa..b1a4e31 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -7120,13 +7120,22 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
 				defer_lock = true;
 			}
 
-			/* This heuristic seems to match W2K3 very well. If a
-			   lock sent with timeout of zero would fail with NT_STATUS_FILE_LOCK_CONFLICT
-			   it pretends we asked for a timeout of between 150 - 300 milliseconds as
-			   far as I can tell. Replacement for do_lock_spin(). JRA. */
+			/* If a lock sent with timeout of zero would fail, and
+			 * this lock has been requested multiple times,
+			 * according to brl_lock_failed() we convert this
+			 * request to a blocking lock with a timeout of between
+			 * 150 - 300 milliseconds.
+			 *
+			 * If lp_lock_spin_time() has been set to 0, we skip
+			 * this blocking retry and fail immediately.
+			 *
+			 * Replacement for do_lock_spin(). JRA. */
 
-			if (br_lck && lp_blocking_locks(SNUM(conn)) && !blocking_lock &&
-					NT_STATUS_EQUAL((status), NT_STATUS_FILE_LOCK_CONFLICT)) {
+			if (br_lck && lp_blocking_locks(SNUM(conn)) &&
+			    lp_lock_spin_time() && !blocking_lock &&
+			    NT_STATUS_EQUAL((status),
+				NT_STATUS_FILE_LOCK_CONFLICT))
+			{
 				defer_lock = true;
 				timeout = lp_lock_spin_time();
 			}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list