summaryrefslogtreecommitdiff
path: root/source3/smbd/oplock.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-12-17 17:23:13 -0800
committerJeremy Allison <jra@samba.org>2008-12-17 17:23:13 -0800
commit1a5fc6d4bc847d9896500b704c9a8d5ac7faa7d2 (patch)
tree3a6d51a6dc4794711a63e7447b020ffd6ec51a43 /source3/smbd/oplock.c
parent43d0a4813bf919e7fe6ab82f6920015d1a57f7bc (diff)
downloadsamba-1a5fc6d4bc847d9896500b704c9a8d5ac7faa7d2.tar.gz
samba-1a5fc6d4bc847d9896500b704c9a8d5ac7faa7d2.tar.bz2
samba-1a5fc6d4bc847d9896500b704c9a8d5ac7faa7d2.zip
Fix bug #5979 - Level 2 oplocks being granted improperly,
Jeremy.
Diffstat (limited to 'source3/smbd/oplock.c')
-rw-r--r--source3/smbd/oplock.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index 23411294df..c98d11426d 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -104,7 +104,10 @@ void process_kernel_oplocks(struct messaging_context *msg_ctx, fd_set *pfds)
bool set_file_oplock(files_struct *fsp, int oplock_type)
{
- if (koplocks && !koplocks->set_oplock(fsp, oplock_type)) {
+ if ((fsp->oplock_type != NO_OPLOCK) &&
+ (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK) &&
+ koplocks &&
+ !koplocks->set_oplock(fsp, oplock_type)) {
return False;
}
@@ -112,7 +115,7 @@ bool set_file_oplock(files_struct *fsp, int oplock_type)
fsp->sent_oplock_break = NO_BREAK_SENT;
if (oplock_type == LEVEL_II_OPLOCK) {
level_II_oplocks_open++;
- } else {
+ } else if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
exclusive_oplocks_open++;
}
@@ -145,10 +148,15 @@ void release_file_oplock(files_struct *fsp)
SMB_ASSERT(exclusive_oplocks_open>=0);
SMB_ASSERT(level_II_oplocks_open>=0);
-
- fsp->oplock_type = NO_OPLOCK;
+
+ if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
+ /* This doesn't matter for close. */
+ fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
+ } else {
+ fsp->oplock_type = NO_OPLOCK;
+ }
fsp->sent_oplock_break = NO_BREAK_SENT;
-
+
flush_write_cache(fsp, OPLOCK_RELEASE_FLUSH);
TALLOC_FREE(fsp->oplock_timeout);
@@ -435,6 +443,11 @@ static void process_oplock_async_level2_break_message(struct messaging_context *
/* Ensure we're really at level2 state. */
SMB_ASSERT(fsp->oplock_type == LEVEL_II_OPLOCK);
+ DEBUG(10,("process_oplock_async_level2_break_message: sending break to "
+ "none message for fid %d, file %s\n",
+ fsp->fnum,
+ fsp->fsp_name));
+
/* Now send a break to none message to our client. */
break_msg = new_break_smb_message(NULL, fsp, OPLOCKLEVEL_NONE);