[3.11.y.z extended stable] Patch "locks: allow __break_lease to sleep even when break_time is 0" has been added to staging queue
Luis Henriques
luis.henriques at canonical.com
Wed Apr 30 12:55:05 UTC 2014
This is a note to let you know that I have just added a patch titled
locks: allow __break_lease to sleep even when break_time is 0
to the linux-3.11.y-queue branch of the 3.11.y.z extended stable tree
which can be found at:
http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.11.y-queue
If you, or anyone else, feels it should not be added to this tree, please
reply to this email.
For more information about the 3.11.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable
Thanks.
-Luis
------
>From 2337d0b0622045ef976eb64e9921f3ee48aef75b Mon Sep 17 00:00:00 2001
From: Jeff Layton <jlayton at redhat.com>
Date: Tue, 15 Apr 2014 06:17:49 -0400
Subject: locks: allow __break_lease to sleep even when break_time is 0
commit f1c6bb2cb8b81013e8979806f8e15e3d53efb96d upstream.
A fl->fl_break_time of 0 has a special meaning to the lease break code
that basically means "never break the lease". knfsd uses this to ensure
that leases don't disappear out from under it.
Unfortunately, the code in __break_lease can end up passing this value
to wait_event_interruptible as a timeout, which prevents it from going
to sleep at all. This makes __break_lease to spin in a tight loop and
causes soft lockups.
Fix this by ensuring that we pass a minimum value of 1 as a timeout
instead.
Cc: J. Bruce Fields <bfields at fieldses.org>
Reported-by: Terry Barnaby <terry1 at beam.ltd.uk>
Signed-off-by: Jeff Layton <jlayton at redhat.com>
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
fs/locks.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/fs/locks.c b/fs/locks.c
index b27a300..ad95fbd 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -1359,11 +1359,10 @@ int __break_lease(struct inode *inode, unsigned int mode)
restart:
break_time = flock->fl_break_time;
- if (break_time != 0) {
+ if (break_time != 0)
break_time -= jiffies;
- if (break_time == 0)
- break_time++;
- }
+ if (break_time == 0)
+ break_time++;
locks_insert_block(flock, new_fl);
spin_unlock(&inode->i_lock);
error = wait_event_interruptible_timeout(new_fl->fl_wait,
--
1.9.1
More information about the kernel-team
mailing list