summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-03-06 21:59:51 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:18:26 -0500
commit640ab28d78dac5c2bcee8b641c8971fcbcd87dfa (patch)
treebad8704b9bb74097b928e18cdc9fd610376ee336
parent94a1b230f3323e55fa23f20b464964eaac643882 (diff)
downloadsamba-640ab28d78dac5c2bcee8b641c8971fcbcd87dfa.tar.gz
samba-640ab28d78dac5c2bcee8b641c8971fcbcd87dfa.tar.bz2
samba-640ab28d78dac5c2bcee8b641c8971fcbcd87dfa.zip
r21724: Optimization pointed out by Volker. If we don't
have any outstanding locks or blocking locks then we don't need to read the lock db. on close. Jeremy. (This used to be commit 1b063496f93f78347a6e67549bde54c845499a7d)
-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) {