JFS: call io_schedule() instead of schedule() to avoid deadlock
The introduction of Jens Axboe's explicit i/o plugging patches introduced a deadlock in jfs. This was caused by the process initiating I/O not unplugging the queue before waiting on the commit thread. The commit thread itself was waiting for that I/O to complete. Calling io_schedule() rather than schedule() unplugs the I/O queue avoiding the deadlock, and it appears to be the right function to call in any case. Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
This commit is contained in:
parent
82d5b9a7c6
commit
4aa0d230c2
@ -42,7 +42,7 @@ do { \
|
||||
if (cond) \
|
||||
break; \
|
||||
unlock_cmd; \
|
||||
schedule(); \
|
||||
io_schedule(); \
|
||||
lock_cmd; \
|
||||
} \
|
||||
current->state = TASK_RUNNING; \
|
||||
|
@ -56,7 +56,7 @@ static inline void __lock_metapage(struct metapage *mp)
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
if (metapage_locked(mp)) {
|
||||
unlock_page(mp->page);
|
||||
schedule();
|
||||
io_schedule();
|
||||
lock_page(mp->page);
|
||||
}
|
||||
} while (trylock_metapage(mp));
|
||||
|
@ -135,7 +135,7 @@ static inline void TXN_SLEEP_DROP_LOCK(wait_queue_head_t * event)
|
||||
add_wait_queue(event, &wait);
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
TXN_UNLOCK();
|
||||
schedule();
|
||||
io_schedule();
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(event, &wait);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user