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