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