summaryrefslogtreecommitdiff
path: root/source3/locking
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2003-10-09 01:46:03 +0000
committerJeremy Allison <jra@samba.org>2003-10-09 01:46:03 +0000
commit226360b742cc2d4d6b31d0b21accb1f2de61297c (patch)
tree4d386de5e4de7b5a4474ea05ecdfe1b3b4c11d35 /source3/locking
parent9a08def3a2d3632e3b9fb8d83967df0f76e616ca (diff)
downloadsamba-226360b742cc2d4d6b31d0b21accb1f2de61297c.tar.gz
samba-226360b742cc2d4d6b31d0b21accb1f2de61297c.tar.bz2
samba-226360b742cc2d4d6b31d0b21accb1f2de61297c.zip
Changes to allow Samba3 to pass the Samba4 RAW-READ tests.
Jeremy. (This used to be commit e4df46732021be4eeb5693ebe7ec0df77f4bb5df)
Diffstat (limited to 'source3/locking')
-rw-r--r--source3/locking/brlock.c9
-rw-r--r--source3/locking/locking.c11
2 files changed, 14 insertions, 6 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c
index 20d76c9c79..c51a5a2aac 100644
--- a/source3/locking/brlock.c
+++ b/source3/locking/brlock.c
@@ -172,7 +172,8 @@ static BOOL brl_conflict_other(struct lock_struct *lck1, struct lock_struct *lck
}
if (lck1->start >= (lck2->start + lck2->size) ||
- lck2->start >= (lck1->start + lck1->size)) return False;
+ lck2->start >= (lck1->start + lck1->size))
+ return False;
return True;
}
@@ -305,7 +306,7 @@ static int lock_compare(struct lock_struct *lck1,
NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum,
uint16 smbpid, pid_t pid, uint16 tid,
br_off start, br_off size,
- enum brl_type lock_type)
+ enum brl_type lock_type, BOOL *my_lock_ctx)
{
TDB_DATA kbuf, dbuf;
int count, i;
@@ -315,6 +316,7 @@ NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum,
static int last_failed = -1;
static br_off last_failed_start;
+ *my_lock_ctx = False;
kbuf = locking_key(dev,ino);
dbuf.dptr = NULL;
@@ -343,6 +345,9 @@ NTSTATUS brl_lock(SMB_DEV_T dev, SMB_INO_T ino, int fnum,
for (i=0; i<count; i++) {
if (brl_conflict(&locks[i], &lock)) {
status = NT_STATUS_LOCK_NOT_GRANTED;
+ /* Did we block ourselves ? */
+ if (brl_same_context(&locks[i].context, &lock.context))
+ *my_lock_ctx = True;
goto fail;
}
#if ZERO_ZERO
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 91bc20af90..c3abd63818 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -98,7 +98,7 @@ BOOL is_locked(files_struct *fsp,connection_struct *conn,
****************************************************************************/
static NTSTATUS do_lock(files_struct *fsp,connection_struct *conn, uint16 lock_pid,
- SMB_BIG_UINT count,SMB_BIG_UINT offset,enum brl_type lock_type)
+ SMB_BIG_UINT count,SMB_BIG_UINT offset,enum brl_type lock_type, BOOL *my_lock_ctx)
{
NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED;
@@ -114,7 +114,7 @@ static NTSTATUS do_lock(files_struct *fsp,connection_struct *conn, uint16 lock_p
status = brl_lock(fsp->dev, fsp->inode, fsp->fnum,
lock_pid, sys_getpid(), conn->cnum,
offset, count,
- lock_type);
+ lock_type, my_lock_ctx);
if (NT_STATUS_IS_OK(status) && lp_posix_locking(SNUM(conn))) {
@@ -153,7 +153,7 @@ static NTSTATUS do_lock(files_struct *fsp,connection_struct *conn, uint16 lock_p
****************************************************************************/
NTSTATUS do_lock_spin(files_struct *fsp,connection_struct *conn, uint16 lock_pid,
- SMB_BIG_UINT count,SMB_BIG_UINT offset,enum brl_type lock_type)
+ SMB_BIG_UINT count,SMB_BIG_UINT offset,enum brl_type lock_type, BOOL *my_lock_ctx)
{
int j, maxj = lp_lock_spin_count();
int sleeptime = lp_lock_sleep_time();
@@ -165,7 +165,7 @@ NTSTATUS do_lock_spin(files_struct *fsp,connection_struct *conn, uint16 lock_pid
ret = NT_STATUS_OK; /* to keep dumb compilers happy */
for (j = 0; j < maxj; j++) {
- status = do_lock(fsp, conn, lock_pid, count, offset, lock_type);
+ status = do_lock(fsp, conn, lock_pid, count, offset, lock_type, my_lock_ctx);
if (!NT_STATUS_EQUAL(status, NT_STATUS_LOCK_NOT_GRANTED) &&
!NT_STATUS_EQUAL(status, NT_STATUS_FILE_LOCK_CONFLICT)) {
return status;
@@ -173,6 +173,9 @@ NTSTATUS do_lock_spin(files_struct *fsp,connection_struct *conn, uint16 lock_pid
/* if we do fail then return the first error code we got */
if (j == 0) {
ret = status;
+ /* Don't spin if we blocked ourselves. */
+ if (*my_lock_ctx)
+ return ret;
}
if (sleeptime)
sys_usleep(sleeptime);