diff options
author | Stefan Metzmacher <metze@samba.org> | 2012-05-24 23:33:32 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2012-05-25 09:05:35 +0200 |
commit | 167cccbc1990dbfb2b47f6aeb1168673a8817bd8 (patch) | |
tree | 3a30653fda0de8cc09744e71cb772a9538b9d355 | |
parent | 3a66ee1ae583520a1dea50883038de3ec82169ba (diff) | |
download | samba-167cccbc1990dbfb2b47f6aeb1168673a8817bd8.tar.gz samba-167cccbc1990dbfb2b47f6aeb1168673a8817bd8.tar.bz2 samba-167cccbc1990dbfb2b47f6aeb1168673a8817bd8.zip |
s3:smbd: move global koplocks to smbd_server_connection
metze
-rw-r--r-- | source3/smbd/globals.c | 2 | ||||
-rw-r--r-- | source3/smbd/globals.h | 3 | ||||
-rw-r--r-- | source3/smbd/oplock.c | 19 |
3 files changed, 20 insertions, 4 deletions
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c index 515a1e810d..807271b320 100644 --- a/source3/smbd/globals.c +++ b/source3/smbd/globals.c @@ -93,8 +93,6 @@ struct vfs_init_function_entry *backends = NULL; char *sparse_buf = NULL; char *LastDir = NULL; -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 f49cdbb473..b334e2593a 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -108,8 +108,6 @@ extern struct vfs_init_function_entry *backends; extern char *sparse_buf; extern char *LastDir; -extern struct kernel_oplocks *koplocks; - struct smbd_parent_context; extern struct smbd_parent_context *am_parent; extern struct memcache *smbd_memcache_ctx; @@ -520,6 +518,7 @@ struct smbd_server_connection { struct { int32_t exclusive_open; int32_t level_II_open; + struct kernel_oplocks *kernel_ops; } oplocks; struct { diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 3705943474..190a9d39f8 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -54,6 +54,7 @@ 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) { @@ -96,6 +97,7 @@ 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) && @@ -133,6 +135,7 @@ 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")); @@ -210,6 +213,7 @@ bool downgrade_oplock(files_struct *fsp) */ 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)); } @@ -336,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. @@ -487,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")); @@ -639,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; /* @@ -896,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; @@ -907,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); @@ -981,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 @@ -988,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; } } |