Description of problem: fctnl(F_SETSIG) no longer works in 2.6.17, does in 2.6.16. The attached program illustrates. Compile and run with strace. In another shell do "echo >> oplockstest.c". On 2.6.16 we get: fcntl64(3, F_SETSIG, 0x23) = 0 fcntl64(3, 0x400 /* F_??? */, 0x1) = 0 nanosleep({50, 0}, 0) = ? ERESTART_RESTARTBLOCK (To be restarted) --- SIGRT_3 (Real-time signal 1) @ 0 (0) --- +++ killed by SIGRT_3 +++ on 2.6.17 we get: fcntl64(3, F_SETSIG, 0x23) = 0 fcntl64(3, 0x400 /* F_??? */, 0x1) = 0 nanosleep({50, 0}, 0) = ? ERESTART_RESTARTBLOCK (To be restarted) --- SIGIO (I/O possible) @ 0 (0) --- +++ killed by SIGIO +++ The signal is no longer changed from SIGIO to SIGRT_3. This causes problems with samba and kernel oplocks. See closed bug #200452 for more info.
Created attachment 133200 [details] Test program
From a reply on LKML from Chuck Ebbert: I added some debug statements to your code: => printf("before setlease: signal number = %d\n", fcntl(fd, F_GETSIG)); ret = fcntl(fd, F_SETLEASE, leasetype); if (ret == -1 && errno == EACCES) { set_capability(CAP_LEASE); ret = fcntl(fd, F_SETLEASE, leasetype); } => printf("after setlease: signal number = %d\n", fcntl(fd, F_GETSIG)); And I get: before setlease: signal number = 34 after setlease: signal number = 0 So the fcntl(F_SETLEASE) is resetting the signal number. I don't think it's supposed to do that. That seems to be caused by: | From: Trond Myklebust <Trond.Myklebust> | Date: Mon, 20 Mar 2006 18:44:05 +0000 (-0500) | Subject: VFS: Fix __posix_lock_file() copy of private lock area | X-Git-Tag: v2.6.17-rc1 | X-Git-Url: http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=47831 | | VFS: Fix __posix_lock_file() copy of private lock area | | The struct file_lock->fl_u area must be copied using the fl_copy_lock() | operation. In this change: | */ | void locks_copy_lock(struct file_lock *new, struct file_lock *fl) | { |+ locks_release_private(new); |+ | new->fl_owner = fl->fl_owner; | new->fl_pid = fl->fl_pid; | new->fl_file = fl->fl_file; Which ends up calling this: static void lease_release_private_callback(struct file_lock *fl) { if (!fl->fl_file) return; f_delown(fl->fl_file); => fl->fl_file->f_owner.signum = 0; } I'm not sure how to fix it, though (if that's really the problem, but I think it is.)
Patch posted by Trond Myklebust: http://www.ussg.iu.edu/hypermail/linux/kernel/0608.1/0192.html
A new kernel update has been released (Version: 2.6.18-1.2200.fc5) based upon a new upstream kernel release. Please retest against this new kernel, as a large number of patches go into each upstream release, possibly including changes that may address this problem. This bug has been placed in NEEDINFO state. Due to the large volume of inactive bugs in bugzilla, if this bug is still in this state in two weeks time, it will be closed. Should this bug still be relevant after this period, the reporter can reopen the bug at any time. Any other users on the Cc: list of this bug can request that the bug be reopened by adding a comment to the bug. In the last few updates, some users upgrading from FC4->FC5 have reported that installing a kernel update has left their systems unbootable. If you have been affected by this problem please check you only have one version of device-mapper & lvm2 installed. See bug 207474 for further details. If this bug is a problem preventing you from installing the release this version is filed against, please see bug 169613. If this bug has been fixed, but you are now experiencing a different problem, please file a separate bug for the new problem. Thank you.