summaryrefslogtreecommitdiffstats
path: root/source/smbd/open.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2001-08-21 01:25:45 +0000
committerVolker Lendecke <vlendec@samba.org>2001-08-21 01:25:45 +0000
commit1c94fa80646f9e31377fbb41332fe4780f550cab (patch)
tree6db0b8de9461f1b1c3fd4716bacadac4825be481 /source/smbd/open.c
parent41066208ad8ca20d35a32bdf9ad934e11465c8f1 (diff)
downloadsamba-1c94fa80646f9e31377fbb41332fe4780f550cab.tar.gz
samba-1c94fa80646f9e31377fbb41332fe4780f550cab.tar.xz
samba-1c94fa80646f9e31377fbb41332fe4780f550cab.zip
This is Jeremy pretending to be Volker, 'cos the
link from Seattle is having problems. I've added 3 things here to work on the fcntl spin problem. 1). Check *all* tdb return codes... :-). 2). If we're asking ourselves to break an oplock, and we can't find a fsp pointer that matches the entry, this is a *logic bug* and we should abort and panic so someone with gdb can pick up the pieces. 3). After we've broken an oplock, ensure that the entry itself has been removed, and if not remove it ourselves. This should not be neccessary in a correctly working environmen,t, but will provide an added layer of robustness in error situations. 4). I hate german keyboards :-) :-). Jeremy.
Diffstat (limited to 'source/smbd/open.c')
-rw-r--r--source/smbd/open.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/source/smbd/open.c b/source/smbd/open.c
index a32e0329213..143aa934a68 100644
--- a/source/smbd/open.c
+++ b/source/smbd/open.c
@@ -464,6 +464,7 @@ static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T
*/
do {
+ share_mode_entry broken_entry;
broke_oplock = False;
*p_all_current_opens_are_level_II = True;
@@ -506,6 +507,7 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
}
broke_oplock = True;
+ broken_entry = *share_entry;
break;
} else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
@@ -525,6 +527,14 @@ dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (dou
if(broke_oplock) {
free((char *)old_shares);
+ if (del_share_entry(dev, inode, &broken_entry, NULL) == -1) {
+ DEBUG(0,("open_mode_check: cannot delete entry when breaking oplock (%x) on file %s, \
+dev = %x, inode = %.0f\n", broken_entry.op_type, fname, (unsigned int)dev, (double)inode));
+ errno = EACCES;
+ unix_ERR_class = ERRDOS;
+ unix_ERR_code = ERRbadshare;
+ return -1;
+ }
num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
oplock_contention_count++;
}