this attempts to handle the rather bizarre lock cache semantics in
authorAndrew Tridgell <tridge@samba.org>
Sun, 10 Mar 2002 23:17:07 +0000 (23:17 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 10 Mar 2002 23:17:07 +0000 (23:17 +0000)
w2k. It isn't entirely accurate, but its close

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

index 10c1d5053b7cb89b883d896843084df105fead8b..e7fa4022f62b51787cbbb05de07ea1df280b6600 100644 (file)
@@ -285,6 +285,8 @@ NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum,
        struct lock_struct lock, *locks;
        char *tp;
        NTSTATUS status = NT_STATUS_OK;
+       static int last_failed = -1;
+       static br_off last_failed_start;
 
        kbuf = locking_key(dev,ino);
 
@@ -348,6 +350,18 @@ NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum,
        return NT_STATUS_OK;
 
  fail:
+       /* this is a nasty hack to try to simulate the lock result cache code in w2k.
+          It isn't completely accurate as I haven't yet worked out the correct
+          semantics (tridge)
+       */
+       if (last_failed == fnum &&
+           last_failed_start == start &&
+           NT_STATUS_EQUAL(status, NT_STATUS_LOCK_NOT_GRANTED)) {
+               status = NT_STATUS_FILE_LOCK_CONFLICT;
+       }
+       last_failed = fnum;
+       last_failed_start = start;
+
        SAFE_FREE(dbuf.dptr);
        tdb_chainunlock(tdb, kbuf);
        return status;
index 97366a1f9b76cb704bb4ea4a96d34793721671f7..dd6ca62e704ab7e038ec77aa0494caae9795f2f0 100644 (file)
@@ -171,7 +171,7 @@ NTSTATUS do_unlock(files_struct *fsp,connection_struct *conn, uint16 lock_pid,
    
        if (!ok) {
                DEBUG(10,("do_unlock: returning ERRlock.\n" ));
-               return NT_STATUS_LOCK_NOT_GRANTED;
+               return NT_STATUS_RANGE_NOT_LOCKED;
        }
 
        if (!lp_posix_locking(SNUM(conn)))