smbd: remove dead code
[samba.git] / source3 / smbd / oplock_linux.c
index 19f4d6e06d8446281d0dd404fef4582beec6e49c..44ed976b92cbd63237313ebd86f9fc7886959101 100644 (file)
@@ -2,17 +2,17 @@
    Unix SMB/CIFS implementation.
    kernel oplock processing for Linux
    Copyright (C) Andrew Tridgell 2000
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -23,7 +23,7 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 
-#if HAVE_KERNEL_OPLOCKS_LINUX
+#ifdef HAVE_KERNEL_OPLOCKS_LINUX
 
 #ifndef F_SETLEASE
 #define F_SETLEASE     1024
 #define F_GETLEASE     1025
 #endif
 
-#ifndef CAP_LEASE
-#define CAP_LEASE 28
-#endif
-
 #ifndef RT_SIGNAL_LEASE
 #define RT_SIGNAL_LEASE (SIGRTMIN+1)
 #endif
 #define F_SETSIG 10
 #endif
 
-/*
- * public function to get linux lease capability. Needed by some VFS modules (eg. gpfs.c)
- */
-void linux_set_lease_capability(void)
-{
-       set_effective_capability(LEASE_CAPABILITY);
-}
-
 /* 
  * Call to set the kernel lease signal handler
  */
@@ -75,13 +63,33 @@ int linux_set_lease_sighandler(int fd)
 int linux_setlease(int fd, int leasetype)
 {
        int ret;
+       int saved_errno;
+
+       /*
+        * Ensure the lease owner is root to allow
+        * correct delivery of lease-break signals.
+        */
+
+       become_root();
 
+       /* First set the signal handler. */
+       if (linux_set_lease_sighandler(fd) == -1) {
+               saved_errno = errno;
+               ret = -1;
+               goto out;
+       }
        ret = fcntl(fd, F_SETLEASE, leasetype);
-       if (ret == -1 && errno == EACCES) {
-               set_effective_capability(LEASE_CAPABILITY);
-               ret = fcntl(fd, F_SETLEASE, leasetype);
+       if (ret == -1) {
+               saved_errno = errno;
        }
 
+  out:
+
+       unbecome_root();
+
+       if (ret == -1) {
+               errno = saved_errno;
+       }
        return ret;
 }
 
@@ -95,16 +103,22 @@ static void linux_oplock_signal_handler(struct tevent_context *ev_ctx,
                                        int signum, int count,
                                        void *_info, void *private_data)
 {
+       struct kernel_oplocks *ctx =
+               talloc_get_type_abort(private_data,
+               struct kernel_oplocks);
+       struct smbd_server_connection *sconn =
+               talloc_get_type_abort(ctx->private_data,
+               struct smbd_server_connection);
        siginfo_t *info = (siginfo_t *)_info;
        int fd = info->si_fd;
        files_struct *fsp;
 
-       fsp = file_find_fd(smbd_server_conn, fd);
+       fsp = file_find_fd(sconn, fd);
        if (fsp == NULL) {
                DEBUG(0,("linux_oplock_signal_handler: failed to find fsp for file fd=%d (file was closed ?)\n", fd ));
                return;
        }
-       break_kernel_oplock(fsp->conn->sconn->msg_ctx, fsp);
+       break_kernel_oplock(sconn->msg_ctx, fsp);
 }
 
 /****************************************************************************
@@ -114,19 +128,23 @@ static void linux_oplock_signal_handler(struct tevent_context *ev_ctx,
 static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
                                    files_struct *fsp, int oplock_type)
 {
+       struct file_id_buf idbuf;
+
        if ( SMB_VFS_LINUX_SETLEASE(fsp, F_WRLCK) == -1) {
-               DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, "
-                        "fd = %d, file_id = %s. (%s)\n",
-                        fsp_str_dbg(fsp), fsp->fh->fd,
-                        file_id_string_tos(&fsp->file_id),
-                        strerror(errno)));
+               DBG_NOTICE("Refused oplock on file %s, "
+                          "fd = %d, file_id = %s. (%s)\n",
+                          fsp_str_dbg(fsp),
+                          fsp->fh->fd,
+                          file_id_str_buf(fsp->file_id, &idbuf),
+                          strerror(errno));
                return False;
        }
        
-       DEBUG(3,("linux_set_kernel_oplock: got kernel oplock on file %s, "
-                "file_id = %s gen_id = %lu\n",
-                fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
-                fsp->fh->gen_id));
+       DBG_NOTICE("got kernel oplock on file %s, "
+                  "file_id = %s gen_id = %"PRIu64"\n",
+                  fsp_str_dbg(fsp),
+                  file_id_str_buf(fsp->file_id, &idbuf),
+                  fsp->fh->gen_id);
 
        return True;
 }
@@ -138,6 +156,8 @@ static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
 static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
                                        files_struct *fsp, int oplock_type)
 {
+       struct file_id_buf idbuf;
+
        if (DEBUGLVL(10)) {
                /*
                 * Check and print out the current kernel
@@ -145,10 +165,12 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
                 */
                int state = fcntl(fsp->fh->fd, F_GETLEASE, 0);
                dbgtext("linux_release_kernel_oplock: file %s, file_id = %s "
-                       "gen_id = %lu has kernel oplock state "
-                       "of %x.\n", fsp_str_dbg(fsp),
-                       file_id_string_tos(&fsp->file_id),
-                       fsp->fh->gen_id, state );
+                       "gen_id = %"PRIu64" has kernel oplock state "
+                       "of %x.\n",
+                       fsp_str_dbg(fsp),
+                       file_id_str_buf(fsp->file_id, &idbuf),
+                       fsp->fh->gen_id,
+                       state);
        }
 
        /*
@@ -158,10 +180,12 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
                if (DEBUGLVL(0)) {
                        dbgtext("linux_release_kernel_oplock: Error when "
                                "removing kernel oplock on file " );
-                       dbgtext("%s, file_id = %s, gen_id = %lu. "
-                               "Error was %s\n", fsp_str_dbg(fsp),
-                               file_id_string_tos(&fsp->file_id),
-                               fsp->fh->gen_id, strerror(errno) );
+                       dbgtext("%s, file_id = %s, gen_id = %"PRIu64". "
+                               "Error was %s\n",
+                               fsp_str_dbg(fsp),
+                               file_id_str_buf(fsp->file_id, &idbuf),
+                               fsp->fh->gen_id,
+                               strerror(errno));
                }
        }
 }
@@ -188,11 +212,9 @@ static bool linux_oplocks_available(void)
 static const struct kernel_oplocks_ops linux_koplocks = {
        .set_oplock                     = linux_set_kernel_oplock,
        .release_oplock                 = linux_release_kernel_oplock,
-       .contend_level2_oplocks_begin   = NULL,
-       .contend_level2_oplocks_end     = NULL,
 };
 
-struct kernel_oplocks *linux_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
+struct kernel_oplocks *linux_init_kernel_oplocks(struct smbd_server_connection *sconn)
 {
        struct kernel_oplocks *ctx;
        struct tevent_signal *se;
@@ -202,15 +224,16 @@ struct kernel_oplocks *linux_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
                return NULL;
        }
 
-       ctx = talloc_zero(mem_ctx, struct kernel_oplocks);
+       ctx = talloc_zero(sconn, struct kernel_oplocks);
        if (!ctx) {
                DEBUG(0,("Linux Kernel oplocks talloc_Zero failed\n"));
                return NULL;
        }
 
        ctx->ops = &linux_koplocks;
+       ctx->private_data = sconn;
 
-       se = tevent_add_signal(server_event_context(),
+       se = tevent_add_signal(sconn->ev_ctx,
                               ctx,
                               RT_SIGNAL_LEASE, SA_SIGINFO,
                               linux_oplock_signal_handler,
@@ -221,8 +244,6 @@ struct kernel_oplocks *linux_init_kernel_oplocks(TALLOC_CTX *mem_ctx)
                return NULL;
        }
 
-       ctx->private_data = se;
-
        DEBUG(3,("Linux kernel oplocks enabled\n"));
 
        return ctx;