[SCM] Samba Shared Repository - branch v3-4-test updated -
release-4-0-0alpha7-727-g17962ba
Volker Lendecke
vlendec at samba.org
Sun Apr 12 12:57:12 GMT 2009
The branch, v3-4-test has been updated
via 17962ba589f24b7d2a67474978d06e33adad56c2 (commit)
from fb8707e2c2d1657294b0660064e1b16590d1ca6c (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test
- Log -----------------------------------------------------------------
commit 17962ba589f24b7d2a67474978d06e33adad56c2
Author: Volker Lendecke <vl at samba.org>
Date: Wed Apr 8 08:29:23 2009 +0200
We have to deny a level 2 oplock if kernel oplocks are enabled
The second r/o opener of a file is supposed to get a level2 oplock. The first
opener due to the protection in process_oplock_break_message() has been forced
to break to no oplock. The second opener according to locking.tdb gets a level2
oplock. Further down in open_file_ntcreate we try to set this level2 oplock in
the kernel, and the non-clustered Linux kernel disallows this. The rules for
the kernel leases are a bit baroque, but the attempt to do the SETLEASE
correctly fails and we end up with no oplock for any client.
In the clustered case however the linux kernel on the second opening node has
not seen the open fd of the first node, it is only the cluster fs that has this
information. If the cluster fs does not have the very same notion of leases as
the local kernel has, we can end up with a WRLCK style kernel lease for the
second opener where locking.tdb only indicates a level2 oplock. Getting a
kernel oplock break signal with just a level2 oplock in locking.tdb is
something smbd is not prepared for. For example after sending out the break in
response to the kernel signal we set a timeout, waiting for a reply.
More work needs to be done to make level2 kernel oplocks real for us. This
patch addresses a real problem we have right now without them.
-----------------------------------------------------------------------
Summary of changes:
source3/smbd/oplock.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index 290e662..086ce1a 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -58,6 +58,12 @@ void break_kernel_oplock(struct messaging_context *msg_ctx, files_struct *fsp)
bool set_file_oplock(files_struct *fsp, int oplock_type)
{
+ if ((fsp->oplock_type == LEVEL_II_OPLOCK)
+ && koplocks && !(koplocks->flags & KOPLOCKS_LEVEL2_SUPPORTED)) {
+ DEBUG(10, ("Refusing level2 oplock, kernel oplocks don't "
+ "support them\n"));
+ return false;
+ }
if ((fsp->oplock_type != NO_OPLOCK) &&
(fsp->oplock_type != FAKE_LEVEL_II_OPLOCK) &&
koplocks &&
--
Samba Shared Repository
More information about the samba-cvs
mailing list