diff options
author | Andrew Tridgell <tridge@samba.org> | 2002-03-10 23:17:07 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2002-03-10 23:17:07 +0000 |
commit | e02d7364707c4939efa4ff0ddf9b6d4f48e5d411 (patch) | |
tree | 1a40395126bc88af231f340459ab1dfac2214998 /source | |
parent | 56662a75f58d35cec1a5b2d6c9a4315d95a22420 (diff) | |
download | samba-e02d7364707c4939efa4ff0ddf9b6d4f48e5d411.tar.gz samba-e02d7364707c4939efa4ff0ddf9b6d4f48e5d411.tar.xz samba-e02d7364707c4939efa4ff0ddf9b6d4f48e5d411.zip |
this attempts to handle the rather bizarre lock cache semantics in
w2k. It isn't entirely accurate, but its close
Diffstat (limited to 'source')
-rw-r--r-- | source/locking/brlock.c | 14 | ||||
-rw-r--r-- | source/locking/locking.c | 2 |
2 files changed, 15 insertions, 1 deletions
diff --git a/source/locking/brlock.c b/source/locking/brlock.c index 10c1d5053b7..e7fa4022f62 100644 --- a/source/locking/brlock.c +++ b/source/locking/brlock.c @@ -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; diff --git a/source/locking/locking.c b/source/locking/locking.c index 97366a1f9b7..dd6ca62e704 100644 --- a/source/locking/locking.c +++ b/source/locking/locking.c @@ -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))) |