s3:smbd/oplock: pass smbd_server_connection to onefs_init_kernel_oplocks()
[kai/samba.git] / source3 / smbd / oplock_onefs.c
index c80925ced315a6de0cb434c8b0161a7022348ace..d7e36087350b740794b763653e9dbd02490dad21 100644 (file)
@@ -25,6 +25,7 @@
 
 #if HAVE_ONEFS
 #include "oplock_onefs.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
 
 #include <ifs/ifs_syscalls.h>
@@ -33,6 +34,7 @@
 
 struct onefs_oplocks_context {
        struct kernel_oplocks *ctx;
+       struct smbd_server_connection *sconn;
        const struct oplocks_event_ops *onefs_ops;
        int onefs_event_fd;
        struct fd_event *read_fde;
@@ -49,7 +51,7 @@ struct onefs_callback_record {
        enum onefs_callback_state state;
        union {
                files_struct *fsp;      /* ONEFS_OPEN_FILE */
-               uint16_t mid;           /* ONEFS_WAITING_FOR_OPLOCK */
+               uint64_t mid;           /* ONEFS_WAITING_FOR_OPLOCK */
        } data;
 };
 
@@ -78,8 +80,8 @@ const char *onefs_cb_record_str_dbg(const struct onefs_callback_record *r)
                                         fsp_str_dbg(r->data.fsp));
        case ONEFS_WAITING_FOR_OPLOCK:
                result = talloc_asprintf(talloc_tos(), "cb record %llu for "
-                                        "pending mid %d", r->id,
-                                        (int)r->data.mid);
+                                        "pending mid %llu", r->id,
+                                        (unsigned long long)r->data.mid);
                break;
        default:
                result = talloc_asprintf(talloc_tos(), "cb record %llu unknown "
@@ -196,7 +198,7 @@ void destroy_onefs_callback_record(uint64_t id)
  *   2. OPEN_FILE: Once ifs_createfile completes, the callback record is
  *   transitioned to this state via onefs_set_oplock_callback.
  */
-uint64_t onefs_oplock_wait_record(uint16_t mid)
+uint64_t onefs_oplock_wait_record(uint64_t mid)
 {
        struct onefs_callback_record *result;
        static uint64_t id_generator = 0;
@@ -250,7 +252,7 @@ void onefs_set_oplock_callback(uint64_t id, files_struct *fsp)
         */
        if (open_was_deferred(cb->data.mid)) {
                if (asprintf(&msg, "Trying to upgrade callback for deferred "
-                            "open mid=%d\n", cb->data.mid) != -1) {
+                            "open mid=%llu\n", (unsigned long long)cb->data.mid) != -1) {
                        smb_panic(msg);
                }
                smb_panic("Trying to upgrade callback for deferred open "
@@ -380,7 +382,6 @@ static void oplock_revoked_handler(uint64_t id)
        DEBUG(0,("Level 1 oplock break failed for file %s. Forcefully "
                 "revoking oplock\n", fsp_str_dbg(fsp)));
 
-       global_client_failed_oplock_break = True;
        remove_oplock(fsp);
 
        /*
@@ -407,7 +408,8 @@ static void semlock_available_handler(uint64_t id)
                return;
        }
 
-       DEBUG(10, ("Got semlock available for mid %d\n", cb->data.mid));
+       DEBUG(10, ("Got semlock available for mid %llu\n",
+               (unsigned long long)cb->data.mid));
 
        /* Paranoia check */
        if (!(open_was_deferred(cb->data.mid))) {
@@ -440,7 +442,6 @@ static void semlock_available_handler(uint64_t id)
 static void semlock_async_failure_handler(uint64_t id)
 {
        struct onefs_callback_record *cb;
-       struct pending_message_list *pml;
        struct deferred_open_record *state;
 
        DEBUG(1, ("semlock_async_failure_handler called: %llu\n", id));
@@ -451,7 +452,8 @@ static void semlock_async_failure_handler(uint64_t id)
                return;
        }
 
-       DEBUG(1, ("Got semlock_async_failure message for mid %d\n", cb->data.mid));
+       DEBUG(1, ("Got semlock_async_failure message for mid %llu\n",
+               (unsigned long long)cb->data.mid));
 
        /* Paranoia check */
        if (!(open_was_deferred(cb->data.mid))) {
@@ -465,13 +467,12 @@ static void semlock_async_failure_handler(uint64_t id)
        }
 
        /* Find the actual deferred open record. */
-       if (!(pml = get_open_deferred_message(cb->data.mid))) {
+       if (!get_open_deferred_message_state(cb->data.mid, NULL, &state)) {
                DEBUG(0, ("Could not find deferred request for "
                          "mid %d\n", cb->data.mid));
                destroy_onefs_callback_record(id);
                return;
        }
-       state = (struct deferred_open_record *)pml->private_data.data;
 
        /* Update to failed so the client can be notified on retried open. */
        state->failed = true;
@@ -663,7 +664,7 @@ static const struct oplocks_event_ops onefs_dispatch_ops = {
        .semlock_async_failure = semlock_async_failure_handler,
 };
 
-struct kernel_oplocks *onefs_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
+struct kernel_oplocks *onefs_init_kernel_oplocks(struct smbd_server_connection *sconn)
 {
        struct kernel_oplocks *_ctx = NULL;
        struct onefs_oplocks_context *ctx = NULL;
@@ -688,6 +689,7 @@ struct kernel_oplocks *onefs_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
        if (!ctx) {
                goto err_out;
        }
+       ctx->sconn = sconn;
 
        _ctx->ops = &onefs_koplocks_ops;
        _ctx->flags = (KOPLOCKS_LEVEL2_SUPPORTED |
@@ -709,7 +711,7 @@ struct kernel_oplocks *onefs_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
        DEBUG(10, ("oplock event_fd = %d\n", ctx->onefs_event_fd));
 
        /* Register the oplock event_fd with samba's event system */
-       ctx->read_fde = event_add_fd(smbd_event_context(),
+       ctx->read_fde = event_add_fd(sconn->ev_ctx,
                                     ctx,
                                     ctx->onefs_event_fd,
                                     EVENT_FD_READ,