s3:smbd: move global koplocks to smbd_server_connection
authorStefan Metzmacher <metze@samba.org>
Thu, 24 May 2012 21:33:32 +0000 (23:33 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 25 May 2012 07:05:35 +0000 (09:05 +0200)
metze

source3/smbd/globals.c
source3/smbd/globals.h
source3/smbd/oplock.c

index 515a1e810d5a080fc152621e92d0b18b3f0f12ae..807271b3206572884cdcc5cfc7aa638be7a3f770 100644 (file)
@@ -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;
index f49cdbb473988447311cca2d938b8b3bc19f9f81..b334e2593a0ca4940692bfc2acc07d674997c565 100644 (file)
@@ -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 {
index 3705943474a6ea56338442c7c89a32c3fedec5f7..190a9d39f830406df0e8b9c97d2efdd98152e979 100644 (file)
@@ -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;
        }
 }