summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/smb.h1
-rw-r--r--source3/locking/locking.c20
2 files changed, 21 insertions, 0 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 1e31d8545d..a54cebac10 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -501,6 +501,7 @@ typedef struct files_struct {
int sent_oplock_break;
struct timed_event *oplock_timeout;
struct lock_struct last_lock_failure;
+ int current_lock_count; /* Count the number of outstanding locks and pending locks. */
struct share_mode_entry *pending_break_messages;
int num_pending_break_messages;
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 6c4e896a2a..304932cf32 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -222,6 +222,12 @@ struct byte_range_lock *do_lock(files_struct *fsp,
lock_flav,
blocking_lock);
+ /* blocking ie. pending, locks also count here,
+ * as this is an efficiency counter to avoid checking
+ * the lock db. on close. JRA. */
+
+ fsp->current_lock_count++;
+
return br_lck;
}
@@ -268,6 +274,9 @@ NTSTATUS do_unlock(files_struct *fsp,
return NT_STATUS_RANGE_NOT_LOCKED;
}
+ SMB_ASSERT(fsp->current_lock_count > 0);
+ fsp->current_lock_count--;
+
return NT_STATUS_OK;
}
@@ -315,6 +324,9 @@ NTSTATUS do_lock_cancel(files_struct *fsp,
return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
}
+ SMB_ASSERT(fsp->current_lock_count > 0);
+ fsp->current_lock_count++;
+
return NT_STATUS_OK;
}
@@ -330,6 +342,14 @@ void locking_close_file(files_struct *fsp)
return;
}
+ /* If we have not outstanding locks or pending
+ * locks then we don't need to look in the lock db.
+ */
+
+ if (fsp->current_lock_count == 0) {
+ return;
+ }
+
br_lck = brl_get_locks(NULL,fsp);
if (br_lck) {