diff options
author | Gerald Carter <jerry@samba.org> | 2004-12-23 18:45:36 +0000 |
---|---|---|
committer | Gerald Carter <jerry@samba.org> | 2004-12-23 18:45:36 +0000 |
commit | b262548fec09659f46839dcf4c079176775f0871 (patch) | |
tree | 2f44f7f1cdce6d71d868626caea49fdfb82e1249 /source/locking | |
parent | 8d91e07ef22ad3ed484b04bc4968380a24940696 (diff) | |
download | samba-b262548fec09659f46839dcf4c079176775f0871.tar.gz samba-b262548fec09659f46839dcf4c079176775f0871.tar.xz samba-b262548fec09659f46839dcf4c079176775f0871.zip |
r4348: syncing up for 3.0.11pre1
Diffstat (limited to 'source/locking')
-rw-r--r-- | source/locking/brlock.c | 17 | ||||
-rw-r--r-- | source/locking/locking.c | 42 |
2 files changed, 40 insertions, 19 deletions
diff --git a/source/locking/brlock.c b/source/locking/brlock.c index d92027e267a..3451b0cc1ab 100644 --- a/source/locking/brlock.c +++ b/source/locking/brlock.c @@ -592,7 +592,7 @@ BOOL brl_unlock(SMB_DEV_T dev, SMB_INO_T ino, int fnum, BOOL brl_locktest(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, int check_self) + enum brl_type lock_type) { TDB_DATA kbuf, dbuf; int count, i; @@ -617,16 +617,11 @@ BOOL brl_locktest(SMB_DEV_T dev, SMB_INO_T ino, int fnum, locks = (struct lock_struct *)dbuf.dptr; count = dbuf.dsize / sizeof(*locks); for (i=0; i<count; i++) { - if (check_self) { - if (brl_conflict(&locks[i], &lock)) - goto fail; - } else { - /* - * Our own locks don't conflict. - */ - if (brl_conflict_other(&locks[i], &lock)) - goto fail; - } + /* + * Our own locks don't conflict. + */ + if (brl_conflict_other(&locks[i], &lock)) + goto fail; } } diff --git a/source/locking/locking.c b/source/locking/locking.c index 15a4500bfa8..e10e8a1fa0f 100644 --- a/source/locking/locking.c +++ b/source/locking/locking.c @@ -62,27 +62,39 @@ static const char *lock_type_name(enum brl_type lock_type) /**************************************************************************** Utility function called to see if a file region is locked. - If check_self is True, then checks on our own fd with the same locking context - are still made. If check_self is False, then checks are not made on our own fd - with the same locking context are not made. ****************************************************************************/ BOOL is_locked(files_struct *fsp,connection_struct *conn, SMB_BIG_UINT count,SMB_BIG_UINT offset, - enum brl_type lock_type, BOOL check_self) + enum brl_type lock_type) { int snum = SNUM(conn); + int strict_locking = lp_strict_locking(snum); BOOL ret; if (count == 0) return(False); - if (!lp_locking(snum) || !lp_strict_locking(snum)) + if (!lp_locking(snum) || !strict_locking) return(False); - ret = !brl_locktest(fsp->dev, fsp->inode, fsp->fnum, - global_smbpid, sys_getpid(), conn->cnum, - offset, count, lock_type, check_self); + if (strict_locking == Auto) { + if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK || lock_type == WRITE_LOCK)) { + DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name )); + ret = 0; + } else if (LEVEL_II_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK)) { + DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name )); + ret = 0; + } else { + ret = !brl_locktest(fsp->dev, fsp->inode, fsp->fnum, + global_smbpid, sys_getpid(), conn->cnum, + offset, count, lock_type); + } + } else { + ret = !brl_locktest(fsp->dev, fsp->inode, fsp->fnum, + global_smbpid, sys_getpid(), conn->cnum, + offset, count, lock_type); + } DEBUG(10,("is_locked: brl start=%.0f len=%.0f %s for file %s\n", (double)offset, (double)count, ret ? "locked" : "unlocked", @@ -541,6 +553,19 @@ static void fill_share_mode(char *p, files_struct *fsp, uint16 port, uint16 op_t BOOL share_modes_identical( share_mode_entry *e1, share_mode_entry *e2) { +#if 1 /* JRA PARANOIA TEST - REMOVE LATER */ + if (e1->pid == e2->pid && + e1->share_file_id == e2->share_file_id && + e1->dev == e2->dev && + e1->inode == e2->inode && + (e1->share_mode & ~DELETE_ON_CLOSE_FLAG) != (e2->share_mode & ~DELETE_ON_CLOSE_FLAG)) { + DEBUG(0,("PANIC: share_modes_identical: share_mode missmatch (e1 = %u, e2 = %u). Logic error.\n", + (unsigned int)(e1->share_mode & ~DELETE_ON_CLOSE_FLAG), + (unsigned int)(e2->share_mode & ~DELETE_ON_CLOSE_FLAG) )); + smb_panic("PANIC: share_modes_identical logic error.\n"); + } +#endif + return (e1->pid == e2->pid && (e1->share_mode & ~DELETE_ON_CLOSE_FLAG) == (e2->share_mode & ~DELETE_ON_CLOSE_FLAG) && e1->dev == e2->dev && @@ -912,6 +937,7 @@ static void print_deferred_open_table(struct deferred_open_data *data) } } + /******************************************************************* Form a static deferred open locking key for a dev/inode pair. ******************************************************************/ |