summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/blocking.c2
-rw-r--r--source3/smbd/reply.c21
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();
}