r16986: Fix the logic errors in ref-counting Windows locks.
authorJeremy Allison <jra@samba.org>
Wed, 12 Jul 2006 16:31:59 +0000 (16:31 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 12 Jul 2006 16:31:59 +0000 (16:31 +0000)
Hopefully will fix the build farm. Still a few errors
in RAW-LOCK to look at though...
Jeremy.

source/locking/brlock.c
source/locking/posix.c

index eb325fe053cfacab075f449a154cdd7ee390ad6a..e99d4ab900b4df72d25803f7a8d4473d0bfe5699 100644 (file)
@@ -1225,6 +1225,7 @@ void brl_close_fnum(struct byte_range_lock *br_lck)
        uint16 tid = fsp->conn->cnum;
        int fnum = fsp->fnum;
        unsigned int i, j, dcount=0;
+       int num_deleted_windows_locks = 0;
        struct lock_struct *locks = (struct lock_struct *)br_lck->lock_data;
        struct process_id pid = procid_self();
        BOOL unlock_individually = False;
@@ -1289,6 +1290,7 @@ void brl_close_fnum(struct byte_range_lock *br_lck)
                if (lock->context.tid == tid && procid_equal(&lock->context.pid, &pid)) {
                        if ((lock->lock_flav == WINDOWS_LOCK) && (lock->fnum == fnum)) {
                                del_this_lock = True;
+                               num_deleted_windows_locks++;
                        } else if (lock->lock_flav == POSIX_LOCK) {
                                del_this_lock = True;
                        }
@@ -1334,8 +1336,10 @@ void brl_close_fnum(struct byte_range_lock *br_lck)
                }
        }
 
-       /* Reduce the lock reference count on this dev/ino pair. */
-       reduce_windows_lock_ref_count(fsp, dcount);
+       if (num_deleted_windows_locks) {
+               /* Reduce the Windows lock reference count on this dev/ino pair. */
+               reduce_windows_lock_ref_count(fsp, num_deleted_windows_locks);
+       }
 }
 
 /****************************************************************************
index 10845f9575289e341e7adef75aa20b403e83beb4..475ab61a2f0b78667544f95e56169a994dc017ac 100644 (file)
@@ -981,6 +981,7 @@ BOOL set_posix_lock_windows_flavour(files_struct *fsp,
         */
 
        if(!posix_lock_in_range(&offset, &count, u_offset, u_count)) {
+               increment_windows_lock_ref_count(fsp);
                return True;
        }
 
@@ -1004,13 +1005,13 @@ BOOL set_posix_lock_windows_flavour(files_struct *fsp,
        
        if ((l_ctx = talloc_init("set_posix_lock")) == NULL) {
                DEBUG(0,("set_posix_lock_windows_flavour: unable to init talloc context.\n"));
-               return True; /* Not a fatal error. */
+               return False;
        }
 
        if ((ll = TALLOC_P(l_ctx, struct lock_list)) == NULL) {
                DEBUG(0,("set_posix_lock_windows_flavour: unable to talloc unlock list.\n"));
                talloc_destroy(l_ctx);
-               return True; /* Not a fatal error. */
+               return False;
        }
 
        /*
@@ -1108,6 +1109,9 @@ BOOL release_posix_lock_windows_flavour(files_struct *fsp,
        DEBUG(5,("release_posix_lock_windows_flavour: File %s, offset = %.0f, count = %.0f\n",
                fsp->fsp_name, (double)u_offset, (double)u_count ));
 
+       /* Remember the number of Windows locks we have on this dev/ino pair. */
+       decrement_windows_lock_ref_count(fsp);
+
        /*
         * If the requested lock won't fit in the POSIX range, we will
         * pretend it was successful.
@@ -1117,18 +1121,15 @@ BOOL release_posix_lock_windows_flavour(files_struct *fsp,
                return True;
        }
 
-       /* Remember the number of Windows locks we have on this dev/ino pair. */
-       decrement_windows_lock_ref_count(fsp);
-
        if ((ul_ctx = talloc_init("release_posix_lock")) == NULL) {
                DEBUG(0,("release_posix_lock_windows_flavour: unable to init talloc context.\n"));
-               return True; /* Not a fatal error. */
+               return False;
        }
 
        if ((ul = TALLOC_P(ul_ctx, struct lock_list)) == NULL) {
                DEBUG(0,("release_posix_lock_windows_flavour: unable to talloc unlock list.\n"));
                talloc_destroy(ul_ctx);
-               return True; /* Not a fatal error. */
+               return False;
        }
 
        /*