Tidyups of some dubious logic discovered whilst trying to track down a
authorJeremy Allison <jra@samba.org>
Tue, 22 Apr 2003 01:12:54 +0000 (01:12 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 22 Apr 2003 01:12:54 +0000 (01:12 +0000)
strange oplock related issue on the PSA.
Jeremy.
(This used to be commit f8021af2a7b790e739a7ecc67c908289b0a9b719)

source3/smbd/close.c
source3/smbd/oplock.c

index 9cb191c4e27e031d4d1d26750c5018f1ee4af2b2..5cca85500fd831dbf0d1e8688494cbdfe9ce1a8a 100644 (file)
@@ -201,7 +201,7 @@ with error %s\n", fsp->fsp_name, strerror(errno) ));
 
        unlock_share_entry_fsp(fsp);
 
-       if(EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
+       if(fsp->oplock_type)
                release_file_oplock(fsp);
 
        locking_close_file(fsp);
index d6c44893d65e91992e38ea6cd8ac024a488b9f77..632dfe9e29124eca0c8529ebb5e0b2250ae530c9 100644 (file)
@@ -226,12 +226,12 @@ tv_sec = %x, tv_usec = %x\n",
 
 void release_file_oplock(files_struct *fsp)
 {
-       if (koplocks)
+       if ((fsp->oplock_type != NO_OPLOCK) && koplocks)
                koplocks->release_oplock(fsp);
 
        if (fsp->oplock_type == LEVEL_II_OPLOCK)
                level_II_oplocks_open--;
-       else
+       else if (fsp->oplock_type)
                exclusive_oplocks_open--;
        
        fsp->oplock_type = NO_OPLOCK;
@@ -270,7 +270,7 @@ BOOL remove_oplock(files_struct *fsp, BOOL break_to_none)
        if (lock_share_entry_fsp(fsp) == False) {
                DEBUG(0,("remove_oplock: failed to lock share entry for file %s\n",
                         fsp->fsp_name ));
-               ret = False;
+               return False;
        }
 
        if (fsp->sent_oplock_break == EXCLUSIVE_BREAK_SENT || break_to_none) {
@@ -626,12 +626,11 @@ BOOL oplock_break_level2(files_struct *fsp, BOOL local_request, int token)
                DEBUG(0,("oplock_break_level2: unable to remove level II oplock for file %s\n", fsp->fsp_name ));
        }
 
+       release_file_oplock(fsp);
+
        if (!local_request && got_lock)
                unlock_share_entry_fsp(fsp);
 
-       fsp->oplock_type = NO_OPLOCK;
-       level_II_oplocks_open--;
-
        if(level_II_oplocks_open < 0) {
                DEBUG(0,("oplock_break_level2: level_II_oplocks_open < 0 (%d). PANIC ERROR\n",
                        level_II_oplocks_open));