diff options
Diffstat (limited to 'source3/modules/onefs_open.c')
-rw-r--r-- | source3/modules/onefs_open.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/source3/modules/onefs_open.c b/source3/modules/onefs_open.c index d628443ef9..f315b34c8b 100644 --- a/source3/modules/onefs_open.c +++ b/source3/modules/onefs_open.c @@ -199,23 +199,6 @@ static NTSTATUS onefs_open_file(files_struct *fsp, if ((conn->fs_capabilities & FILE_NAMED_STREAMS) && stream != NULL) { SMB_ASSERT(fsp->base_fsp); - /* - * We have never seen an oplock taken on a stream, and our - * current implementation doesn't support it. If a request is - * seen, log a loud error message and ignore the requested - * oplock. - */ - if ((oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK) != - NO_OPLOCK) { - DEBUG(0, ("Oplock(%d) being requested on a stream! " - "Ignoring oplock request: base=%s, " - "stream=%s\n", - oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK, - base, stream)); - /* Recover by requesting NO_OPLOCK instead. */ - oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK; - } - DEBUG(10,("Opening a stream: base=%s(%d), stream=%s\n", base, fsp->base_fsp->fh->fd, stream)); @@ -522,10 +505,7 @@ NTSTATUS onefs_open_file_ntcreate(connection_struct *conn, * * 1. Open the base file of a stream: Always done stat-only * - * 2. Open the stream: Oplocks are disallowed on streams, so an - * oplock will never be contended. - * - * 3. open_file_fchmod(), which is called from 3 places: + * 2. open_file_fchmod(), which is called from 3 places: * A. try_chown: Posix acls only. Never called on onefs. * B. set_ea_dos_attributes: Can't be called from onefs, because * SMB_VFS_SETXATTR return ENOSYS. @@ -1773,6 +1753,21 @@ static NTSTATUS onefs_create_file_unixpath(connection_struct *conn, "failed: %s\n", base, nt_errstr(status))); goto fail; } + + /* + * Testing against windows xp/2003/vista shows that oplocks + * can actually be requested and granted on streams (see the + * RAW-OPLOCK-STREAM1 smbtorture test). + */ + if ((oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK) != + NO_OPLOCK) { + DEBUG(5, ("Oplock(%d) being requested on a stream! " + "Ignoring oplock request: fname=%s\n", + oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK, + fname)); + /* Request NO_OPLOCK instead. */ + oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK; + } } /* Covert generic bits in the security descriptor. */ |