diff options
author | Jeremy Allison <jra@samba.org> | 2006-07-12 16:32:02 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:19:16 -0500 |
commit | 17222261895b8c82eb5458bc66dab6712930d5a3 (patch) | |
tree | dc267b6d2123a9fdca033ba1e4ba036e18029345 /source3/locking | |
parent | 297df32751fbc64a053700241dae2ac9c0fc4968 (diff) | |
download | samba-17222261895b8c82eb5458bc66dab6712930d5a3.tar.gz samba-17222261895b8c82eb5458bc66dab6712930d5a3.tar.bz2 samba-17222261895b8c82eb5458bc66dab6712930d5a3.zip |
r16987: Fix the logic errors in ref-counting Windows locks.
Hopefully will fix the build farm. Still a few errors
in RAW-LOCK to look at though...
Jeremy.
(This used to be commit edd72d37de570fdad09f7ee983b5b22a1613e558)
Diffstat (limited to 'source3/locking')
-rw-r--r-- | source3/locking/brlock.c | 8 | ||||
-rw-r--r-- | source3/locking/posix.c | 15 |
2 files changed, 14 insertions, 9 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index eb325fe053..e99d4ab900 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -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); + } } /**************************************************************************** diff --git a/source3/locking/posix.c b/source3/locking/posix.c index 10845f9575..475ab61a2f 100644 --- a/source3/locking/posix.c +++ b/source3/locking/posix.c @@ -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; } /* |