The branch, v3-5-test has been updated
       via  92b1d6b Fix bug #8974 - Kernel oplocks are broken when uid(file) != 
uid(process).
      from  fad706e s3: Correct documentation of case sensitive

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 92b1d6b93571facbb07b7d32f169ba32ef6f8e1f
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Jun 20 15:50:00 2012 -0700

    Fix bug #8974 - Kernel oplocks are broken when uid(file) != uid(process).
    
    Based on a fix from "Etienne Dechamps " <e-t...@akegroup.org>
    (cherry picked from commit 0e2fb6c69e971c7502fabe17fa71d1453dda18a6)

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_default.c |    5 -----
 source3/smbd/oplock_linux.c   |   13 +++++++++++++
 2 files changed, 13 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 60b85d9..0a34198 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -1133,11 +1133,6 @@ static int vfswrap_linux_setlease(vfs_handle_struct 
*handle, files_struct *fsp,
        START_PROFILE(syscall_linux_setlease);
 
 #ifdef HAVE_KERNEL_OPLOCKS_LINUX
-       /* first set the signal handler */
-       if(linux_set_lease_sighandler(fsp->fh->fd) == -1) {
-               return -1;
-       }
-
        result = linux_setlease(fsp->fh->fd, leasetype);
 #else
        errno = ENOSYS;
diff --git a/source3/smbd/oplock_linux.c b/source3/smbd/oplock_linux.c
index c60c745..ff5d596 100644
--- a/source3/smbd/oplock_linux.c
+++ b/source3/smbd/oplock_linux.c
@@ -74,9 +74,22 @@ int linux_setlease(int fd, int leasetype)
 {
        int ret;
 
+       /* First set the signal handler. */
+       if (linux_set_lease_sighandler(fd) == -1) {
+               return -1;
+       }
        ret = fcntl(fd, F_SETLEASE, leasetype);
        if (ret == -1 && errno == EACCES) {
                set_effective_capability(LEASE_CAPABILITY);
+               /*
+                * Bug 8974 - work around Linux kernel bug
+                * https://bugzilla.kernel.org/show_bug.cgi?id=43336.
+                * "fcntl(F_SETLEASE) resets signal number when
+                *  called multiple times"
+                */
+               if (linux_set_lease_sighandler(fd) == -1) {
+                       return -1;
+               }
                ret = fcntl(fd, F_SETLEASE, leasetype);
        }
 


-- 
Samba Shared Repository

Reply via email to