diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 95e95f71ec0fa..fa3de31d9c682 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -1949,6 +1949,9 @@ static inline void lbmRedrive(struct lbuf *bp) { unsigned long flags; + /* keep io_count elevated while bp is on the redrive list */ + atomic_inc(&bp->l_log->io_count); + spin_lock_irqsave(&log_redrive_lock, flags); bp->l_redrive_next = log_redrive_list; log_redrive_list = bp; @@ -2324,7 +2327,14 @@ int jfsIOWait(void *arg) log_redrive_list = bp->l_redrive_next; bp->l_redrive_next = NULL; spin_unlock_irq(&log_redrive_lock); - lbmStartIO(bp); + { + struct jfs_log *log = bp->l_log; + + lbmStartIO(bp); + /* cancel redrive ref; lbmStartIO took its own */ + if (atomic_dec_and_test(&log->io_count)) + wake_up(&log->io_done_wait); + } spin_lock_irq(&log_redrive_lock); }