diff options
-rw-r--r-- | source3/smbd/blocking.c | 2 | ||||
-rw-r--r-- | source3/smbd/reply.c | 21 |
2 files changed, 16 insertions, 7 deletions
diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index 04e28a9907..cb48cc8c1c 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 b6316aac46..b1a4e31951 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(); } |