The branch, v3-6-test has been updated
       via  9ef80fc Ensure gpfs kernel leases are wrapped in a 
become_root()/unbecome_root() pair.
       via  3630254 Wrap setting leases in become_root()/unbecome_root() to 
ensure correct delivery of signals.
      from  b085c39 Fix bug 9678 - Windows 8 Roaming profiles fail

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


- Log -----------------------------------------------------------------
commit 9ef80fcff6e0d03e30bd675cd7ebfc88608e81d6
Author: Ralph Wuerthner <ral...@de.ibm.com>
Date:   Wed Jul 31 16:33:48 2013 -0700

    Ensure gpfs kernel leases are wrapped in a become_root()/unbecome_root() 
pair.
    
    Ensures correct lease owner for signal delivery.
    
    Signed-off-by: Ralph Wuerthner <ral...@de.ibm.com>
    Reviewed-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Simo Sorce <i...@samba.org>
    
    Autobuild-User(master): Jeremy Allison <j...@samba.org>
    Autobuild-Date(master): Thu Aug  1 03:57:11 CEST 2013 on sn-devel-104
    
    The last 2 patches address bug #10064 - Linux kernel oplock breaks can miss
    signals.

commit 363025491d97171e130a7b8dd03296b9559799a0
Author: Jeremy Allison <j...@samba.org>
Date:   Wed Jul 31 16:32:20 2013 -0700

    Wrap setting leases in become_root()/unbecome_root() to ensure correct 
delivery of signals.
    
    Remove workaround for Linux kernel bug 
https://bugzilla.kernel.org/show_bug.cgi?id=43336
    as we don't need to set capabilities when we're already root.
    
    Signed-off-by: Jeremy Allison <j...@samba.org>
    Reviewed-by: Simo Sorce <i...@samba.org>

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

Summary of changes:
 source3/modules/vfs_gpfs.c  |    6 ++++++
 source3/smbd/oplock_linux.c |   33 ++++++++++++++++++++-------------
 2 files changed, 26 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index 7bc2832..4aad679 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -97,7 +97,13 @@ static int vfs_gpfs_setlease(vfs_handle_struct *handle, 
files_struct *fsp,
                return -1;
 
        if (config->leases) {
+               /*
+                * Ensure the lease owner is root to allow
+                * correct delivery of lease-break signals.
+                */
+               become_root();
                ret = set_gpfs_lease(fsp->fh->fd,leasetype);
+               unbecome_root();
        }
 
        if (ret < 0) {
diff --git a/source3/smbd/oplock_linux.c b/source3/smbd/oplock_linux.c
index 02bd32a..82523f2 100644
--- a/source3/smbd/oplock_linux.c
+++ b/source3/smbd/oplock_linux.c
@@ -75,26 +75,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) {
-               return -1;
+               saved_errno = errno;
+               ret = -1;
+               goto out;
        }
        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);
+       if (ret == -1) {
+               saved_errno = errno;
        }
 
+  out:
+
+       unbecome_root();
+
+       if (ret == -1) {
+               errno = saved_errno;
+       }
        return ret;
 }
 


-- 
Samba Shared Repository

Reply via email to