Re: [PATCH] locks: allow __break_lease to sleep even when break_time is 0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks, applying.--b.

On Tue, Apr 15, 2014 at 08:44:12AM -0400, Jeff Layton wrote:
> 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 causes __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: <stable@xxxxxxxxxxxxxxx>
> Cc: J. Bruce Fields <bfields@xxxxxxxxxxxx>
> Reported-by: Terry Barnaby <terry1@xxxxxxxxxxx>
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> ---
>  fs/locks.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/locks.c b/fs/locks.c
> index 13fc7a6d380a..b380f5543614 100644
> --- a/fs/locks.c
> +++ b/fs/locks.c
> @@ -1391,11 +1391,10 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
>  
>  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.0
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux