linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Matthew Wilcox <matthew@wil.cx>
Cc: Oleg Drokin <Oleg.Drokin@Sun.COM>, linux-fsdevel@vger.kernel.org
Subject: Re: file locks: Use wait_event_interruptible_timeout()
Date: Tue, 15 Jan 2008 09:48:51 -0500	[thread overview]
Message-ID: <20080115144851.GB10971@fieldses.org> (raw)
In-Reply-To: <20080115042830.GU18741@parisc-linux.org>

On Mon, Jan 14, 2008 at 09:28:30PM -0700, Matthew Wilcox wrote:
> 
> interruptible_sleep_on_locked() is just an open-coded
> wait_event_interruptible_timeout() with a few assumptions since we know
> we hold the BKL.  locks_block_on_timeout() is only used in one place, so
> it's actually simpler to inline it into its caller.

Makes sense, thanks.  So the assumption we were depending on the BKL for
was that we could count on the wake-up not coming till after we block,
so we could skip a check ->fl_next that's normally needed to resolve the
usual sleeping-on-some-condition race?

--b.

> 
> Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
> 
>  locks.c |   33 ++++-----------------------------
>  1 file changed, 4 insertions(+), 29 deletions(-)
> 
> diff --git a/fs/locks.c b/fs/locks.c
> index 8b8388e..b681459 100644
> --- a/fs/locks.c
> +++ b/fs/locks.c
> @@ -634,33 +634,6 @@ static int flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *s
>  	return (locks_conflict(caller_fl, sys_fl));
>  }
>  
> -static int interruptible_sleep_on_locked(wait_queue_head_t *fl_wait, int timeout)
> -{
> -	int result = 0;
> -	DECLARE_WAITQUEUE(wait, current);
> -
> -	__set_current_state(TASK_INTERRUPTIBLE);
> -	add_wait_queue(fl_wait, &wait);
> -	if (timeout == 0)
> -		schedule();
> -	else
> -		result = schedule_timeout(timeout);
> -	if (signal_pending(current))
> -		result = -ERESTARTSYS;
> -	remove_wait_queue(fl_wait, &wait);
> -	__set_current_state(TASK_RUNNING);
> -	return result;
> -}
> -
> -static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *waiter, int time)
> -{
> -	int result;
> -	locks_insert_block(blocker, waiter);
> -	result = interruptible_sleep_on_locked(&waiter->fl_wait, time);
> -	__locks_delete_block(waiter);
> -	return result;
> -}
> -
>  void
>  posix_test_lock(struct file *filp, struct file_lock *fl)
>  {
> @@ -1256,7 +1229,10 @@ restart:
>  		if (break_time == 0)
>  			break_time++;
>  	}
> -	error = locks_block_on_timeout(flock, new_fl, break_time);
> +	locks_insert_block(flock, new_fl);
> +	error = wait_event_interruptible_timeout(new_fl->fl_wait,
> +						!new_fl->fl_next, break_time);
> +	__locks_delete_block(new_fl);
>  	if (error >= 0) {
>  		if (error == 0)
>  			time_out_leases(inode);
> 
> -- 
> Intel are signing my paycheques ... these opinions are still mine
> "Bill, look, we understand that you're interested in selling us this
> operating system, but compare it to ours.  We can't possibly take such
> a retrograde step."

  reply	other threads:[~2008-01-15 14:48 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-29 18:46 Leak in nlmsvc_testlock for async GETFL case Oleg Drokin
2007-11-29 19:08 ` J. Bruce Fields
2008-01-12  2:57   ` Oleg Drokin
2008-01-14 20:44     ` J. Bruce Fields
2008-01-15  4:26       ` Matthew Wilcox
2008-01-15  4:28         ` file locks: Use wait_event_interruptible_timeout() Matthew Wilcox
2008-01-15 14:48           ` J. Bruce Fields [this message]
2008-01-15 15:04             ` Matthew Wilcox
2008-01-15 18:54               ` J. Bruce Fields
2008-01-15  4:29         ` file locks: Split flock_find_conflict out of flock_lock_file Matthew Wilcox
2008-01-15 18:50           ` J. Bruce Fields
2008-01-15 14:42         ` Leak in nlmsvc_testlock for async GETFL case J. Bruce Fields
2007-12-03 17:00 ` Felix Blyakher
2007-12-03 17:49   ` Oleg Drokin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080115144851.GB10971@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=Oleg.Drokin@Sun.COM \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=matthew@wil.cx \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).