summaryrefslogtreecommitdiff
path: root/source3/locking/posix.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-07-12 06:56:43 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:19:16 -0500
commit297df32751fbc64a053700241dae2ac9c0fc4968 (patch)
treeff93dc8b04fa29894cedc1f117551056a3df73d4 /source3/locking/posix.c
parent4ef1f8e4256a3f7739864236626dacc636d313af (diff)
downloadsamba-297df32751fbc64a053700241dae2ac9c0fc4968.tar.gz
samba-297df32751fbc64a053700241dae2ac9c0fc4968.tar.bz2
samba-297df32751fbc64a053700241dae2ac9c0fc4968.zip
r16973: Fix subtle logic error in lock ref counting found by
cifsfs client code. Jeremy. (This used to be commit 53094435d89088124041d57078c21a12e761e2bf)
Diffstat (limited to 'source3/locking/posix.c')
-rw-r--r--source3/locking/posix.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/source3/locking/posix.c b/source3/locking/posix.c
index 59b62170e8..10845f9575 100644
--- a/source3/locking/posix.c
+++ b/source3/locking/posix.c
@@ -492,10 +492,10 @@ static void decrement_windows_lock_ref_count(files_struct *fsp)
}
/****************************************************************************
- Ensure the lock ref count is zero.
+ Bulk delete - subtract as many locks as we've just deleted.
****************************************************************************/
-void zero_windows_lock_ref_count(files_struct *fsp)
+void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount)
{
TDB_DATA kbuf = locking_ref_count_key_fsp(fsp);
TDB_DATA dbuf;
@@ -507,19 +507,19 @@ void zero_windows_lock_ref_count(files_struct *fsp)
}
memcpy(&lock_ref_count, dbuf.dptr, sizeof(int));
+ lock_ref_count -= dcount;
+
if (lock_ref_count < 0) {
- smb_panic("zero_windows_lock_ref_count: lock_count logic error.\n");
+ smb_panic("reduce_windows_lock_ref_count: lock_count logic error.\n");
}
-
- lock_ref_count = 0;
memcpy(dbuf.dptr, &lock_ref_count, sizeof(int));
if (tdb_store(posix_pending_close_tdb, kbuf, dbuf, TDB_REPLACE) == -1) {
- smb_panic("zero_windows_lock_ref_count: tdb_store_fail.\n");
+ smb_panic("reduce_windows_lock_ref_count: tdb_store_fail.\n");
}
SAFE_FREE(dbuf.dptr);
- DEBUG(10,("zero_windows_lock_ref_count for file now %s = %d\n",
+ DEBUG(10,("reduce_windows_lock_ref_count for file now %s = %d\n",
fsp->fsp_name, lock_ref_count ));
}