Author: jra
Date: 2007-07-17 00:50:48 +0000 (Tue, 17 Jul 2007)
New Revision: 23908

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=23908

Log:
Fix bug with interaction of optimization with
POSIX locking. We can't do lock counts with POSIX,
so stop counting if we get a POSIX lock request.
Jeremy.

Modified:
   branches/SAMBA_3_0_25/source/locking/locking.c
   branches/SAMBA_3_2/source/locking/locking.c
   branches/SAMBA_3_2_0/source/locking/locking.c


Changeset:
Modified: branches/SAMBA_3_0_25/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0_25/source/locking/locking.c      2007-07-17 00:10:53 UTC 
(rev 23907)
+++ branches/SAMBA_3_0_25/source/locking/locking.c      2007-07-17 00:50:48 UTC 
(rev 23908)
@@ -41,6 +41,8 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
 
+#define NO_LOCKING_COUNT (-1)
+
 /* the locking database handle */
 static TDB_CONTEXT *tdb;
 
@@ -224,11 +226,19 @@
                        blocking_lock,
                        plock_pid);
 
-       /* blocking ie. pending, locks also count here,
-        * as this is an efficiency counter to avoid checking
-        * the lock db. on close. JRA. */
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               /* blocking ie. pending, locks also count here,
+                * as this is an efficiency counter to avoid checking
+                * the lock db. on close. JRA. */
 
-       fsp->current_lock_count++;
+               fsp->current_lock_count++;
+       } else {
+               /* Notice that this has had a POSIX lock request.
+                * We can't count locks after this so forget them.
+                */
+               fsp->current_lock_count = NO_LOCKING_COUNT;
+       }
 
        return br_lck;
 }
@@ -276,8 +286,11 @@
                return NT_STATUS_RANGE_NOT_LOCKED;
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }
@@ -326,8 +339,11 @@
                return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }

Modified: branches/SAMBA_3_2/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_2/source/locking/locking.c 2007-07-17 00:10:53 UTC (rev 
23907)
+++ branches/SAMBA_3_2/source/locking/locking.c 2007-07-17 00:50:48 UTC (rev 
23908)
@@ -40,6 +40,8 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
 
+#define NO_LOCKING_COUNT (-1)
+
 /* the locking database handle */
 static struct db_context *lock_db;
 
@@ -225,11 +227,19 @@
                        blocking_lock,
                        plock_pid);
 
-       /* blocking ie. pending, locks also count here,
-        * as this is an efficiency counter to avoid checking
-        * the lock db. on close. JRA. */
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               /* blocking ie. pending, locks also count here,
+                * as this is an efficiency counter to avoid checking
+                * the lock db. on close. JRA. */
 
-       fsp->current_lock_count++;
+               fsp->current_lock_count++;
+       } else {
+               /* Notice that this has had a POSIX lock request.
+                * We can't count locks after this so forget them.
+                */
+               fsp->current_lock_count = NO_LOCKING_COUNT;
+       }
 
        return br_lck;
 }
@@ -279,8 +289,11 @@
                return NT_STATUS_RANGE_NOT_LOCKED;
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }
@@ -329,8 +342,11 @@
                return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }

Modified: branches/SAMBA_3_2_0/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_2_0/source/locking/locking.c       2007-07-17 00:10:53 UTC 
(rev 23907)
+++ branches/SAMBA_3_2_0/source/locking/locking.c       2007-07-17 00:50:48 UTC 
(rev 23908)
@@ -40,6 +40,8 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
 
+#define NO_LOCKING_COUNT (-1)
+
 /* the locking database handle */
 static struct db_context *lock_db;
 
@@ -225,11 +227,19 @@
                        blocking_lock,
                        plock_pid);
 
-       /* blocking ie. pending, locks also count here,
-        * as this is an efficiency counter to avoid checking
-        * the lock db. on close. JRA. */
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               /* blocking ie. pending, locks also count here,
+                * as this is an efficiency counter to avoid checking
+                * the lock db. on close. JRA. */
 
-       fsp->current_lock_count++;
+               fsp->current_lock_count++;
+       } else {
+               /* Notice that this has had a POSIX lock request.
+                * We can't count locks after this so forget them.
+                */
+               fsp->current_lock_count = NO_LOCKING_COUNT;
+       }
 
        return br_lck;
 }
@@ -279,8 +289,11 @@
                return NT_STATUS_RANGE_NOT_LOCKED;
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }
@@ -329,8 +342,11 @@
                return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
        }
 
-       SMB_ASSERT(fsp->current_lock_count > 0);
-       fsp->current_lock_count--;
+       if (lock_flav == WINDOWS_LOCK &&
+                       fsp->current_lock_count != NO_LOCKING_COUNT) {
+               SMB_ASSERT(fsp->current_lock_count > 0);
+               fsp->current_lock_count--;
+       }
 
        return NT_STATUS_OK;
 }

Reply via email to