From ae532b725026887026b1a9dead56e24a91f981f1 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 15 Jun 2012 16:26:03 -0700 Subject: [PATCH] Fix bug #8974 - Kernel oplocks are broken when uid(file) != uid(process). Based on a fix from "Etienne Dechamps " --- source3/modules/vfs_default.c | 5 ----- source3/smbd/oplock_linux.c | 12 ++++++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index b387cce..eb3e343 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1573,11 +1573,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 190578e..c61389b 100644 --- a/source3/smbd/oplock_linux.c +++ b/source3/smbd/oplock_linux.c @@ -76,9 +76,21 @@ int linux_setlease(int fd, int leasetype) { int ret; + /* first set the signal handler */ + if(linux_set_lease_sighandler(fsp->fh->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(fsp->fh->fd) == -1) { + return -1; + } ret = fcntl(fd, F_SETLEASE, leasetype); } -- 1.7.7.3