The branch, master has been updated via e17fa58 s3:smbd: move global smbd_msg_state to smbXsrv_connection via 167cccb s3:smbd: move global koplocks to smbd_server_connection via 3a66ee1 s3:smbd: pass smbd_server_connection to should_notify_deferred_opens() via 469a2c8 s3:smbd: move global oplocks vars to smbd_server_connection via 2f435bb s3:smbd: remove unused get_number_of_exclusive_open_oplocks() from eec4f80 move VERSION to alpha22
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e17fa58d6ee8bf190adba25462d9d97b26ca2c8f Author: Stefan Metzmacher <me...@samba.org> Date: Thu May 24 23:41:43 2012 +0200 s3:smbd: move global smbd_msg_state to smbXsrv_connection metze Autobuild-User: Stefan Metzmacher <me...@samba.org> Autobuild-Date: Fri May 25 11:01:27 CEST 2012 on sn-devel-104 commit 167cccbc1990dbfb2b47f6aeb1168673a8817bd8 Author: Stefan Metzmacher <me...@samba.org> Date: Thu May 24 23:33:32 2012 +0200 s3:smbd: move global koplocks to smbd_server_connection metze commit 3a66ee1ae583520a1dea50883038de3ec82169ba Author: Stefan Metzmacher <me...@samba.org> Date: Thu May 24 23:32:04 2012 +0200 s3:smbd: pass smbd_server_connection to should_notify_deferred_opens() metze commit 469a2c8e7cbcb0c9089f50b9323255840dc6ed04 Author: Stefan Metzmacher <me...@samba.org> Date: Thu May 24 23:15:08 2012 +0200 s3:smbd: move global oplocks vars to smbd_server_connection metze commit 2f435bb61aeaee142f8a826db6aed88d3dc3ab91 Author: Stefan Metzmacher <me...@samba.org> Date: Thu May 24 23:06:26 2012 +0200 s3:smbd: remove unused get_number_of_exclusive_open_oplocks() metze ----------------------------------------------------------------------- Summary of changes: source3/smbd/close.c | 2 +- source3/smbd/globals.c | 7 ------ source3/smbd/globals.h | 15 +++++++----- source3/smbd/message.c | 34 ++++++++++++++++------------- source3/smbd/oplock.c | 55 ++++++++++++++++++++++++++++++----------------- source3/smbd/proto.h | 3 +- 6 files changed, 65 insertions(+), 51 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/smbd/close.c b/source3/smbd/close.c index ede7925..22d756c 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -173,7 +173,7 @@ static void notify_deferred_opens(struct smbd_server_connection *sconn, uint32_t i, num_deferred; struct share_mode_entry *deferred; - if (!should_notify_deferred_opens()) { + if (!should_notify_deferred_opens(sconn)) { return; } diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c index 196b643..f107c0e 100644 --- a/source3/smbd/globals.c +++ b/source3/smbd/globals.c @@ -54,8 +54,6 @@ TDB_CONTEXT *tdb_mangled_cache = NULL; */ unsigned mangle_prefix = 0; -struct msg_state *smbd_msg_state = NULL; - bool logged_ioctl_message = false; time_t last_smb_conf_reload_time = 0; @@ -93,11 +91,6 @@ struct vfs_init_function_entry *backends = NULL; char *sparse_buf = NULL; char *LastDir = NULL; -/* Current number of oplocks we have outstanding. */ -int32_t exclusive_oplocks_open = 0; -int32_t level_II_oplocks_open = 0; -struct kernel_oplocks *koplocks = NULL; - struct smbd_parent_context *am_parent = NULL; struct memcache *smbd_memcache_ctx = NULL; bool exit_firsttime = true; diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index 24c21ff..ccf79fe 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -58,7 +58,6 @@ extern struct tdb_context *tdb_mangled_cache; extern unsigned mangle_prefix; struct msg_state; -extern struct msg_state *smbd_msg_state; extern bool logged_ioctl_message; @@ -108,11 +107,6 @@ extern struct vfs_init_function_entry *backends; extern char *sparse_buf; extern char *LastDir; -/* Current number of oplocks we have outstanding. */ -extern int32_t exclusive_oplocks_open; -extern int32_t level_II_oplocks_open; -extern struct kernel_oplocks *koplocks; - struct smbd_parent_context; extern struct smbd_parent_context *am_parent; extern struct memcache *smbd_memcache_ctx; @@ -356,6 +350,8 @@ struct smbXsrv_connection { uint32_t max_write; } server; } smb2; + + struct msg_state *msg_state; }; NTSTATUS smbXsrv_connection_init_tables(struct smbXsrv_connection *conn, @@ -519,6 +515,13 @@ struct smbd_server_connection { uint64_t num_requests; + /* Current number of oplocks we have outstanding. */ + struct { + int32_t exclusive_open; + int32_t level_II_open; + struct kernel_oplocks *kernel_ops; + } oplocks; + struct { struct fd_event *fde; diff --git a/source3/smbd/message.c b/source3/smbd/message.c index 63b08e1..8ae588b 100644 --- a/source3/smbd/message.c +++ b/source3/smbd/message.c @@ -200,11 +200,11 @@ void reply_sendstrt(struct smb_request *req) return; } - TALLOC_FREE(smbd_msg_state); + TALLOC_FREE(req->sconn->conn->msg_state); - smbd_msg_state = talloc_zero(NULL, struct msg_state); + req->sconn->conn->msg_state = talloc_zero(NULL, struct msg_state); - if (smbd_msg_state == NULL) { + if (req->sconn->conn->msg_state == NULL) { reply_nterror(req, NT_STATUS_NO_MEMORY); END_PROFILE(SMBsendstrt); return; @@ -212,14 +212,17 @@ void reply_sendstrt(struct smb_request *req) p = (const char *)req->buf+1; p += srvstr_pull_req_talloc( - smbd_msg_state, req, &smbd_msg_state->from, p, + req->sconn->conn->msg_state, req, + &req->sconn->conn->msg_state->from, p, STR_ASCII|STR_TERMINATE) + 1; p += srvstr_pull_req_talloc( - smbd_msg_state, req, &smbd_msg_state->to, p, + req->sconn->conn->msg_state, req, + &req->sconn->conn->msg_state->to, p, STR_ASCII|STR_TERMINATE) + 1; - DEBUG( 3, ( "SMBsendstrt (from %s to %s)\n", smbd_msg_state->from, - smbd_msg_state->to ) ); + DEBUG(3, ("SMBsendstrt (from %s to %s)\n", + req->sconn->conn->msg_state->from, + req->sconn->conn->msg_state->to)); reply_outbuf(req, 0, 0); @@ -247,7 +250,7 @@ void reply_sendtxt(struct smb_request *req) return; } - if ((smbd_msg_state == NULL) || (req->buflen < 3)) { + if ((req->sconn->conn->msg_state == NULL) || (req->buflen < 3)) { reply_nterror(req, NT_STATUS_INVALID_PARAMETER); END_PROFILE(SMBsendtxt); return; @@ -255,12 +258,13 @@ void reply_sendtxt(struct smb_request *req) msg = (const char *)req->buf + 1; - old_len = talloc_get_size(smbd_msg_state->msg); + old_len = talloc_get_size(req->sconn->conn->msg_state->msg); len = MIN(SVAL(msg, 0), smbreq_bufrem(req, msg+2)); - tmp = talloc_realloc(smbd_msg_state, smbd_msg_state->msg, - char, old_len + len); + tmp = talloc_realloc(req->sconn->conn->msg_state, + req->sconn->conn->msg_state->msg, + char, old_len + len); if (tmp == NULL) { reply_nterror(req, NT_STATUS_NO_MEMORY); @@ -268,9 +272,9 @@ void reply_sendtxt(struct smb_request *req) return; } - smbd_msg_state->msg = tmp; + req->sconn->conn->msg_state->msg = tmp; - memcpy(&smbd_msg_state->msg[old_len], msg+2, len); + memcpy(&req->sconn->conn->msg_state->msg[old_len], msg+2, len); DEBUG( 3, ( "SMBsendtxt\n" ) ); @@ -297,9 +301,9 @@ void reply_sendend(struct smb_request *req) DEBUG(3,("SMBsendend\n")); - msg_deliver(smbd_msg_state); + msg_deliver(req->sconn->conn->msg_state); - TALLOC_FREE(smbd_msg_state); + TALLOC_FREE(req->sconn->conn->msg_state); reply_outbuf(req, 0, 0); diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index e3f00a7..190a9d3 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -26,15 +26,6 @@ #include "messages.h" #include "../librpc/gen_ndr/open_files.h" -/**************************************************************************** - Get the number of current exclusive oplocks. -****************************************************************************/ - -int32 get_number_of_exclusive_open_oplocks(void) -{ - return exclusive_oplocks_open; -} - /* * helper function used by the kernel oplock backends to post the break message */ @@ -62,7 +53,8 @@ void break_kernel_oplock(struct messaging_context *msg_ctx, files_struct *fsp) bool set_file_oplock(files_struct *fsp, int oplock_type) { - + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; bool use_kernel = lp_kernel_oplocks(SNUM(fsp->conn)) && koplocks; if (fsp->oplock_type == LEVEL_II_OPLOCK) { @@ -84,9 +76,9 @@ bool set_file_oplock(files_struct *fsp, int oplock_type) fsp->oplock_type = oplock_type; fsp->sent_oplock_break = NO_BREAK_SENT; if (oplock_type == LEVEL_II_OPLOCK) { - level_II_oplocks_open++; + sconn->oplocks.level_II_open++; } else if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { - exclusive_oplocks_open++; + sconn->oplocks.exclusive_open++; } DEBUG(5,("set_file_oplock: granted oplock on file %s, %s/%lu, " @@ -104,6 +96,9 @@ bool set_file_oplock(files_struct *fsp, int oplock_type) void release_file_oplock(files_struct *fsp) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + if ((fsp->oplock_type != NO_OPLOCK) && (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK) && koplocks) { @@ -111,13 +106,13 @@ void release_file_oplock(files_struct *fsp) } if (fsp->oplock_type == LEVEL_II_OPLOCK) { - level_II_oplocks_open--; + sconn->oplocks.level_II_open--; } else if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { - exclusive_oplocks_open--; + sconn->oplocks.exclusive_open--; } - SMB_ASSERT(exclusive_oplocks_open>=0); - SMB_ASSERT(level_II_oplocks_open>=0); + SMB_ASSERT(sconn->oplocks.exclusive_open>=0); + SMB_ASSERT(sconn->oplocks.level_II_open>=0); if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { /* This doesn't matter for close. */ @@ -139,6 +134,9 @@ void release_file_oplock(files_struct *fsp) static void downgrade_file_oplock(files_struct *fsp) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + if (!EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) { DEBUG(0, ("trying to downgrade an already-downgraded oplock!\n")); return; @@ -148,8 +146,8 @@ static void downgrade_file_oplock(files_struct *fsp) koplocks->ops->release_oplock(koplocks, fsp, LEVEL_II_OPLOCK); } fsp->oplock_type = LEVEL_II_OPLOCK; - exclusive_oplocks_open--; - level_II_oplocks_open++; + sconn->oplocks.exclusive_open--; + sconn->oplocks.level_II_open++; fsp->sent_oplock_break = NO_BREAK_SENT; } @@ -213,8 +211,9 @@ bool downgrade_oplock(files_struct *fsp) /* * Some kernel oplock implementations handle the notification themselves. */ -bool should_notify_deferred_opens() +bool should_notify_deferred_opens(struct smbd_server_connection *sconn) { + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; return !(koplocks && (koplocks->flags & KOPLOCKS_DEFERRED_OPEN_NOTIFICATION)); } @@ -274,7 +273,8 @@ static files_struct *initial_break_processing( dbgtext( "initial_break_processing: called for %s/%u\n", file_id_string_tos(&id), (int)file_id); dbgtext( "Current oplocks_open (exclusive = %d, levelII = %d)\n", - exclusive_oplocks_open, level_II_oplocks_open ); + sconn->oplocks.exclusive_open, + sconn->oplocks.level_II_open); } /* @@ -340,6 +340,9 @@ static void oplock_timeout_handler(struct event_context *ctx, static void add_oplock_timeout_handler(files_struct *fsp) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + /* * If kernel oplocks already notifies smbds when an oplock break times * out, just return. @@ -491,6 +494,7 @@ static void process_oplock_break_message(struct messaging_context *msg_ctx, struct smbd_server_connection *sconn = talloc_get_type_abort(private_data, struct smbd_server_connection); + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; if (data->data == NULL) { DEBUG(0, ("Got NULL buffer\n")); @@ -643,6 +647,8 @@ static void process_kernel_oplock_break(struct messaging_context *msg_ctx, void reply_to_oplock_break_requests(files_struct *fsp) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; int i; /* @@ -900,6 +906,9 @@ done: void smbd_contend_level2_oplocks_begin(files_struct *fsp, enum level2_contention_type type) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + if (koplocks && koplocks->ops->contend_level2_oplocks_begin) { koplocks->ops->contend_level2_oplocks_begin(fsp, type); return; @@ -911,6 +920,9 @@ void smbd_contend_level2_oplocks_begin(files_struct *fsp, void smbd_contend_level2_oplocks_end(files_struct *fsp, enum level2_contention_type type) { + struct smbd_server_connection *sconn = fsp->conn->sconn; + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + /* Only kernel oplocks implement this so far */ if (koplocks && koplocks->ops->contend_level2_oplocks_end) { koplocks->ops->contend_level2_oplocks_end(fsp, type); @@ -985,6 +997,8 @@ bool init_oplocks(struct smbd_server_connection *sconn) void init_kernel_oplocks(struct smbd_server_connection *sconn) { + struct kernel_oplocks *koplocks = sconn->oplocks.kernel_ops; + /* only initialize once */ if (koplocks == NULL) { #if HAVE_KERNEL_OPLOCKS_IRIX @@ -992,5 +1006,6 @@ void init_kernel_oplocks(struct smbd_server_connection *sconn) #elif HAVE_KERNEL_OPLOCKS_LINUX koplocks = linux_init_kernel_oplocks(sconn); #endif + sconn->oplocks.kernel_ops = koplocks; } } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 311072a..7fdbbea 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -662,13 +662,12 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn, /* The following definitions come from smbd/oplock.c */ -int32 get_number_of_exclusive_open_oplocks(void); void break_kernel_oplock(struct messaging_context *msg_ctx, files_struct *fsp); bool set_file_oplock(files_struct *fsp, int oplock_type); void release_file_oplock(files_struct *fsp); bool remove_oplock(files_struct *fsp); bool downgrade_oplock(files_struct *fsp); -bool should_notify_deferred_opens(void); +bool should_notify_deferred_opens(struct smbd_server_connection *sconn); void break_level2_to_none_async(files_struct *fsp); void reply_to_oplock_break_requests(files_struct *fsp); void contend_level2_oplocks_begin(files_struct *fsp, -- Samba Shared Repository