diff options
author | Matthew Wilcox <matthew@wil.cx> | 2008-01-14 23:28:30 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2008-02-03 17:51:36 -0500 |
commit | 4321e01e7dce8042758349ffa2929c723b0d4107 (patch) | |
tree | 32b7b1a4af4b28c3ce1fc013bc7a2da4f2e21fde /fs/locks.c | |
parent | b533184fc353d4a2d07929b4ac424a6f1bf5a3b9 (diff) |
file locks: Use wait_event_interruptible_timeout()
interruptible_sleep_on_locked() is just an open-coded
wait_event_interruptible_timeout(), with the one difference that
interruptible_sleep_on_locked() doesn't bother to check the condition on
which it is waiting, depending instead on the BKL to avoid the case
where it blocks after the wakeup has already been called.
locks_block_on_timeout() is only used in one place, so it's actually
simpler to inline it into its caller.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/locks.c')
-rw-r--r-- | fs/locks.c | 32 |
1 files changed, 4 insertions, 28 deletions
diff --git a/fs/locks.c b/fs/locks.c index c3eecb895acf..faddccb6336a 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 | |||
634 | return (locks_conflict(caller_fl, sys_fl)); | 634 | return (locks_conflict(caller_fl, sys_fl)); |
635 | } | 635 | } |
636 | 636 | ||
637 | static int interruptible_sleep_on_locked(wait_queue_head_t *fl_wait, int timeout) | ||
638 | { | ||
639 | int result = 0; | ||
640 | DECLARE_WAITQUEUE(wait, current); | ||
641 | |||
642 | __set_current_state(TASK_INTERRUPTIBLE); | ||
643 | add_wait_queue(fl_wait, &wait); | ||
644 | if (timeout == 0) | ||
645 | schedule(); | ||
646 | else | ||
647 | result = schedule_timeout(timeout); | ||
648 | if (signal_pending(current)) | ||
649 | result = -ERESTARTSYS; | ||
650 | remove_wait_queue(fl_wait, &wait); | ||
651 | __set_current_state(TASK_RUNNING); | ||
652 | return result; | ||
653 | } | ||
654 | |||
655 | static int locks_block_on_timeout(struct file_lock *blocker, struct file_lock *waiter, int time) | ||
656 | { | ||
657 | int result; | ||
658 | locks_insert_block(blocker, waiter); | ||
659 | result = interruptible_sleep_on_locked(&waiter->fl_wait, time); | ||
660 | __locks_delete_block(waiter); | ||
661 | return result; | ||
662 | } | ||
663 | |||
664 | void | 637 | void |
665 | posix_test_lock(struct file *filp, struct file_lock *fl) | 638 | posix_test_lock(struct file *filp, struct file_lock *fl) |
666 | { | 639 | { |
@@ -1266,7 +1239,10 @@ restart: | |||
1266 | if (break_time == 0) | 1239 | if (break_time == 0) |
1267 | break_time++; | 1240 | break_time++; |
1268 | } | 1241 | } |
1269 | error = locks_block_on_timeout(flock, new_fl, break_time); | 1242 | locks_insert_block(flock, new_fl); |
1243 | error = wait_event_interruptible_timeout(new_fl->fl_wait, | ||
1244 | !new_fl->fl_next, break_time); | ||
1245 | __locks_delete_block(new_fl); | ||
1270 | if (error >= 0) { | 1246 | if (error >= 0) { |
1271 | if (error == 0) | 1247 | if (error == 0) |
1272 | time_out_leases(inode); | 1248 | time_out_leases(inode); |