The branch, master has been updated
       via  2927ca3 s3:smbd only care about missing level2 support if kernel 
oplocks are enabled
       via  fbfbc6a s3:smbd only initialize kernel oplocks if they are enabled 
for a share
       via  1d9a3d4 s3:smbd add seperate function to initialize kernel oplocks
       via  639a775 docs: update kernel oplocks documentation
       via  2a36408 s3:param convert kernel oplocks to share parameter
      from  30203bd build: Fix spelling of tevent

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2927ca36706bf2e9b2b0458bbb1dfb493ea8e208
Author: Christian Ambach <a...@samba.org>
Date:   Fri Mar 30 16:11:08 2012 +0200

    s3:smbd only care about missing level2 support if kernel oplocks are enabled
    
    if kernel oplocks are not enabled for that share, we can grant level2 
oplocks
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    
    Autobuild-User: Jeremy Allison <j...@samba.org>
    Autobuild-Date: Wed Apr 11 22:45:21 CEST 2012 on sn-devel-104

commit fbfbc6a252d3ab4e61d85abb7bc25e08f7b519eb
Author: Christian Ambach <a...@samba.org>
Date:   Fri Mar 30 16:00:15 2012 +0200

    s3:smbd only initialize kernel oplocks if they are enabled for a share
    
    Signed-off-by: Jeremy Allison <j...@samba.org>

commit 1d9a3d488db2a9575ea1dc954c4d14b7d0a20204
Author: Christian Ambach <a...@samba.org>
Date:   Fri Mar 30 15:51:25 2012 +0200

    s3:smbd add seperate function to initialize kernel oplocks
    
    Signed-off-by: Jeremy Allison <j...@samba.org>

commit 639a775866230fd1fb1a44d0f4e27522d9ade93a
Author: Christian Ambach <a...@samba.org>
Date:   Fri Mar 30 16:11:37 2012 +0200

    docs: update kernel oplocks documentation
    
    Signed-off-by: Jeremy Allison <j...@samba.org>

commit 2a36408d4020b67d94f8750951bfead069ca1206
Author: Christian Ambach <a...@samba.org>
Date:   Fri Mar 30 15:31:19 2012 +0200

    s3:param convert kernel oplocks to share parameter
    
    Signed-off-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/smbdotconf/locking/kerneloplocks.xml |    9 +++++++--
 lib/param/param_functions.c                   |    1 +
 source3/include/proto.h                       |    2 +-
 source3/param/loadparm.c                      |   11 ++++-------
 source3/smbd/oplock.c                         |   24 +++++++++++++++++-------
 source3/smbd/proto.h                          |    1 +
 source3/smbd/service.c                        |    4 ++++
 7 files changed, 35 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/smbdotconf/locking/kerneloplocks.xml 
b/docs-xml/smbdotconf/locking/kerneloplocks.xml
index c4f12b9..9ac7256 100644
--- a/docs-xml/smbdotconf/locking/kerneloplocks.xml
+++ b/docs-xml/smbdotconf/locking/kerneloplocks.xml
@@ -1,11 +1,13 @@
 <samba:parameter name="kernel oplocks"
                                 type="boolean"
-                 context="G"
+                context="S"
                  xmlns:samba="http://www.samba.org/samba/DTD/samba-doc";>
 <description>
        <para>For UNIXes that support kernel based <smbconfoption 
name="oplocks"/>
        (currently only IRIX and the Linux 2.4 kernel), this parameter 
-       allows the use of them to be turned on or off.</para>
+       allows the use of them to be turned on or off. However, this disables
+       Level II oplocks for clients as the Linux and IRIX kernels do not
+       support them properly.</para>
 
        <para>Kernel oplocks support allows Samba <parameter 
moreinfo="none">oplocks
        </parameter> to be broken whenever a local UNIX process or NFS 
operation 
@@ -13,6 +15,9 @@
        <manvolnum>8</manvolnum></citerefentry> has oplocked. This allows 
complete 
        data consistency between SMB/CIFS, NFS and local file access (and is 
        a <emphasis>very</emphasis> cool feature :-).</para>
+       <para>If you do not need this interaction, you should disable the
+       parameter on Linux and IRIX to get Level II oplocks and the associated
+       performance benefit.</para>
 
        <para>This parameter defaults to <constant>on</constant>, but is 
translated
        to a no-op on systems that no not have the necessary kernel support.
diff --git a/lib/param/param_functions.c b/lib/param/param_functions.c
index ee865fd..cd85cb0 100644
--- a/lib/param/param_functions.c
+++ b/lib/param/param_functions.c
@@ -104,6 +104,7 @@ FN_LOCAL_PARM_BOOL(locking, bLocking)
 FN_LOCAL_PARM_INTEGER(strict_locking, iStrictLocking)
 FN_LOCAL_PARM_BOOL(posix_locking, bPosixLocking)
 FN_LOCAL_BOOL(share_modes, bShareModes)
+FN_LOCAL_BOOL(kernel_oplocks, bKernelOplocks)
 FN_LOCAL_BOOL(level2_oplocks, bLevel2OpLocks)
 FN_LOCAL_BOOL(onlyuser, bOnlyUser)
 FN_LOCAL_PARM_BOOL(manglednames, bMangledNames)
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 34c9fe8..d32d2e8 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1226,7 +1226,6 @@ bool lp_client_plaintext_auth(void);
 bool lp_client_lanman_auth(void);
 bool lp_client_ntlmv2_auth(void);
 bool lp_host_msdfs(void);
-bool lp_kernel_oplocks(void);
 bool lp_enhanced_browsing(void);
 bool lp_use_mmap(void);
 bool lp_unix_extensions(void);
@@ -1355,6 +1354,7 @@ int lp_strict_locking(const struct share_params *p );
 bool lp_posix_locking(const struct share_params *p );
 bool lp_share_modes(int );
 bool lp_oplocks(int );
+bool lp_kernel_oplocks(int );
 bool lp_level2_oplocks(int );
 bool lp_onlyuser(int );
 bool lp_manglednames(const struct share_params *p );
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 5d8c3a7..41c29cb 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -230,6 +230,7 @@ static struct loadparm_service sDefault =
        .bPosixLocking = true,
        .bShareModes = true,
        .bOpLocks = true,
+       .bKernelOplocks = true,
        .bLevel2OpLocks = true,
        .bOnlyUser = false,
        .bMangledNames = true,
@@ -3109,11 +3110,11 @@ static struct parm_struct parm_table[] = {
        {
                .label          = "kernel oplocks",
                .type           = P_BOOL,
-               .p_class        = P_GLOBAL,
-               .offset         = GLOBAL_VAR(bKernelOplocks),
+               .p_class        = P_LOCAL,
+               .offset         = LOCAL_VAR(bKernelOplocks),
                .special        = NULL,
                .enum_list      = NULL,
-               .flags          = FLAG_ADVANCED | FLAG_GLOBAL,
+               .flags          = FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
        },
        {
                .label          = "locking",
@@ -4892,9 +4893,6 @@ static void init_globals(bool reinit_globals)
 
        Globals.bDNSproxy = true;
 
-       /* this just means to use them if they exist */
-       Globals.bKernelOplocks = true;
-
        Globals.bAllowTrustedDomains = true;
        string_set(&Globals.szIdmapBackend, "tdb");
 
@@ -5260,7 +5258,6 @@ FN_GLOBAL_BOOL(lp_client_plaintext_auth, 
bClientPlaintextAuth)
 FN_GLOBAL_BOOL(lp_client_lanman_auth, bClientLanManAuth)
 FN_GLOBAL_BOOL(lp_client_ntlmv2_auth, bClientNTLMv2Auth)
 FN_GLOBAL_BOOL(lp_host_msdfs, bHostMSDfs)
-FN_GLOBAL_BOOL(lp_kernel_oplocks, bKernelOplocks)
 FN_GLOBAL_BOOL(lp_enhanced_browsing, enhanced_browsing)
 FN_GLOBAL_BOOL(lp_use_mmap, bUseMmap)
 FN_GLOBAL_BOOL(lp_unix_extensions, bUnixExtensions)
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c
index f760171..b181fb7 100644
--- a/source3/smbd/oplock.c
+++ b/source3/smbd/oplock.c
@@ -62,8 +62,11 @@ void break_kernel_oplock(struct messaging_context *msg_ctx, 
files_struct *fsp)
 
 bool set_file_oplock(files_struct *fsp, int oplock_type)
 {
+
+       bool use_kernel = lp_kernel_oplocks(SNUM(fsp->conn)) && koplocks;
+
        if (fsp->oplock_type == LEVEL_II_OPLOCK) {
-               if (koplocks &&
+               if (use_kernel &&
                    !(koplocks->flags & KOPLOCKS_LEVEL2_SUPPORTED)) {
                        DEBUG(10, ("Refusing level2 oplock, kernel oplocks "
                                   "don't support them\n"));
@@ -73,7 +76,7 @@ bool set_file_oplock(files_struct *fsp, int oplock_type)
 
        if ((fsp->oplock_type != NO_OPLOCK) &&
            (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK) &&
-           koplocks &&
+           use_kernel &&
            !koplocks->ops->set_oplock(koplocks, fsp, oplock_type)) {
                return False;
        }
@@ -484,6 +487,7 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
        struct share_mode_entry msg;
        files_struct *fsp;
        bool break_to_level2 = False;
+       bool use_kernel;
        struct smbd_server_connection *sconn =
                talloc_get_type_abort(private_data,
                struct smbd_server_connection);
@@ -543,9 +547,11 @@ static void process_oplock_break_message(struct 
messaging_context *msg_ctx,
                return;
        }
 
-       if ((global_client_caps & CAP_LEVEL_II_OPLOCKS) && 
+       use_kernel = lp_kernel_oplocks(SNUM(fsp->conn)) && koplocks;
+
+       if ((global_client_caps & CAP_LEVEL_II_OPLOCKS) &&
            !(msg.op_type & FORCE_OPLOCK_BREAK_TO_NONE) &&
-           !(koplocks && !(koplocks->flags & KOPLOCKS_LEVEL2_SUPPORTED)) &&
+           !(use_kernel && !(koplocks->flags & KOPLOCKS_LEVEL2_SUPPORTED)) &&
            lp_level2_oplocks(SNUM(fsp->conn))) {
                break_to_level2 = True;
        }
@@ -978,7 +984,13 @@ bool init_oplocks(struct smbd_server_connection *sconn)
        messaging_register(sconn->msg_ctx, sconn, MSG_SMB_OPEN_RETRY,
                           process_open_retry_message);
 
-       if (lp_kernel_oplocks()) {
+       return true;
+}
+
+void init_kernel_oplocks(struct smbd_server_connection *sconn)
+{
+       /* only initialize once */
+       if (koplocks == NULL) {
 #if HAVE_KERNEL_OPLOCKS_IRIX
                koplocks = irix_init_kernel_oplocks(sconn);
 #elif HAVE_KERNEL_OPLOCKS_LINUX
@@ -988,6 +1000,4 @@ bool init_oplocks(struct smbd_server_connection *sconn)
                koplocks = onefs_init_kernel_oplocks(sconn);
 #endif
        }
-
-       return True;
 }
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 5ab5185..f2040cd 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -673,6 +673,7 @@ void smbd_contend_level2_oplocks_end(files_struct *fsp,
 void share_mode_entry_to_message(char *msg, const struct share_mode_entry *e);
 void message_to_share_mode_entry(struct share_mode_entry *e, char *msg);
 bool init_oplocks(struct smbd_server_connection *sconn);
+void init_kernel_oplocks(struct smbd_server_connection *sconn);
 
 /* The following definitions come from smbd/oplock_irix.c  */
 
diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index c4d3486..914cec8 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -709,6 +709,10 @@ static NTSTATUS make_connection_snum(struct 
smbd_server_connection *sconn,
                }
        }
 
+       if (lp_kernel_oplocks(snum)) {
+               init_kernel_oplocks(conn->sconn);
+       }
+
        /*
         * Fix compatibility issue pointed out by Volker.
         * We pass the conn->connectpath to the preexec


-- 
Samba Shared Repository

Reply via email to