smbd: Restructure brl_conflict_other
authorVolker Lendecke <vl@samba.org>
Fri, 11 Jul 2014 11:27:39 +0000 (13:27 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 22 Jul 2014 13:32:39 +0000 (15:32 +0200)
It took me really long to grasp what's going on in this routine. I hope
its logic is easier to understand now

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/locking/brlock.c

index e881b8fd78d7fad640bfb2965bc748040fa9be23..fe613056121d1012fc7aec51750a839ca65fcc72 100644 (file)
@@ -239,28 +239,53 @@ static bool brl_conflict_other(const struct lock_struct *lock,
                return False;
        }
 
-       /* POSIX flavour locks never conflict here - this is only called
-          in the read/write path. */
-
        if (lock->lock_flav == POSIX_LOCK &&
            rw_probe->lock_flav == POSIX_LOCK) {
+               /*
+                * POSIX flavour locks never conflict here - this is only called
+                * in the read/write path.
+                */
                return False;
        }
 
-       /*
-        * Incoming WRITE locks conflict with existing READ locks even
-        * if the context is the same. JRA. See LOCKTEST7 in smbtorture.
-        */
+       if (!brl_overlap(lock, rw_probe)) {
+               /*
+                * I/O can only conflict when overlapping a lock, thus let it
+                * pass
+                */
+               return false;
+       }
 
-       if (!(rw_probe->lock_type == WRITE_LOCK &&
-             lock->lock_type == READ_LOCK)) {
-               if (brl_same_context(&lock->context, &rw_probe->context) &&
-                   lock->fnum == rw_probe->fnum) {
-                       return False;
-               }
+       if (!brl_same_context(&lock->context, &rw_probe->context)) {
+               /*
+                * Different process, conflict
+                */
+               return true;
        }
 
-       return brl_overlap(lock, rw_probe);
+       if (lock->fnum != rw_probe->fnum) {
+               /*
+                * Different file handle, conflict
+                */
+               return true;
+       }
+
+       if ((lock->lock_type == READ_LOCK) &&
+           (rw_probe->lock_type == WRITE_LOCK)) {
+               /*
+                * Incoming WRITE locks conflict with existing READ locks even
+                * if the context is the same. JRA. See LOCKTEST7 in
+                * smbtorture.
+                */
+               return true;
+       }
+
+       /*
+        * I/O request compatible with existing lock, let it pass without
+        * conflict
+        */
+
+       return false;
 }
 
 /****************************************************************************