diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_buf.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 946b00bf384..168eecd8127 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -1687,14 +1687,15 @@ STATIC int xfs_buf_delwri_split( xfs_buftarg_t *target, struct list_head *list, - unsigned long age, - int flags) + unsigned long age) { xfs_buf_t *bp, *n; struct list_head *dwq = &target->bt_delwrite_queue; spinlock_t *dwlk = &target->bt_delwrite_lock; int skipped = 0; + int force; + force = test_and_clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); INIT_LIST_HEAD(list); spin_lock(dwlk); list_for_each_entry_safe(bp, n, dwq, b_list) { @@ -1702,7 +1703,7 @@ xfs_buf_delwri_split( ASSERT(bp->b_flags & XBF_DELWRI); if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { - if (!(flags & XBT_FORCE_FLUSH) && + if (!force && time_before(jiffies, bp->b_queuetime + age)) { xfs_buf_unlock(bp); break; @@ -1744,9 +1745,7 @@ xfsbufd( xfs_buf_timer_centisecs * msecs_to_jiffies(10)); xfs_buf_delwri_split(target, &tmp, - xfs_buf_age_centisecs * msecs_to_jiffies(10), - test_bit(XBT_FORCE_FLUSH, &target->bt_flags) - ? XBT_FORCE_FLUSH : 0); + xfs_buf_age_centisecs * msecs_to_jiffies(10)); count = 0; while (!list_empty(&tmp)) { @@ -1763,7 +1762,6 @@ xfsbufd( if (count) blk_run_address_space(target->bt_mapping); - clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); } while (!kthread_should_stop()); return 0; @@ -1786,7 +1784,8 @@ xfs_flush_buftarg( xfs_buf_runall_queues(xfsdatad_workqueue); xfs_buf_runall_queues(xfslogd_workqueue); - pincount = xfs_buf_delwri_split(target, &tmp, 0, XBT_FORCE_FLUSH); + set_bit(XBT_FORCE_FLUSH, &target->bt_flags); + pincount = xfs_buf_delwri_split(target, &tmp, 0); /* * Dropped the delayed write list lock, now walk the temporary list |