diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_buf.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 2af528dcfb04..f13503508c46 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2000-2005 Silicon Graphics, Inc. | 2 | * Copyright (c) 2000-2006 Silicon Graphics, Inc. |
3 | * All Rights Reserved. | 3 | * All Rights Reserved. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
@@ -1681,6 +1681,7 @@ xfsbufd( | |||
1681 | xfs_buf_t *bp, *n; | 1681 | xfs_buf_t *bp, *n; |
1682 | struct list_head *dwq = &target->bt_delwrite_queue; | 1682 | struct list_head *dwq = &target->bt_delwrite_queue; |
1683 | spinlock_t *dwlk = &target->bt_delwrite_lock; | 1683 | spinlock_t *dwlk = &target->bt_delwrite_lock; |
1684 | int count; | ||
1684 | 1685 | ||
1685 | current->flags |= PF_MEMALLOC; | 1686 | current->flags |= PF_MEMALLOC; |
1686 | 1687 | ||
@@ -1696,6 +1697,7 @@ xfsbufd( | |||
1696 | schedule_timeout_interruptible( | 1697 | schedule_timeout_interruptible( |
1697 | xfs_buf_timer_centisecs * msecs_to_jiffies(10)); | 1698 | xfs_buf_timer_centisecs * msecs_to_jiffies(10)); |
1698 | 1699 | ||
1700 | count = 0; | ||
1699 | age = xfs_buf_age_centisecs * msecs_to_jiffies(10); | 1701 | age = xfs_buf_age_centisecs * msecs_to_jiffies(10); |
1700 | spin_lock(dwlk); | 1702 | spin_lock(dwlk); |
1701 | list_for_each_entry_safe(bp, n, dwq, b_list) { | 1703 | list_for_each_entry_safe(bp, n, dwq, b_list) { |
@@ -1711,9 +1713,11 @@ xfsbufd( | |||
1711 | break; | 1713 | break; |
1712 | } | 1714 | } |
1713 | 1715 | ||
1714 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); | 1716 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q| |
1717 | _XBF_RUN_QUEUES); | ||
1715 | bp->b_flags |= XBF_WRITE; | 1718 | bp->b_flags |= XBF_WRITE; |
1716 | list_move(&bp->b_list, &tmp); | 1719 | list_move_tail(&bp->b_list, &tmp); |
1720 | count++; | ||
1717 | } | 1721 | } |
1718 | } | 1722 | } |
1719 | spin_unlock(dwlk); | 1723 | spin_unlock(dwlk); |
@@ -1724,12 +1728,12 @@ xfsbufd( | |||
1724 | 1728 | ||
1725 | list_del_init(&bp->b_list); | 1729 | list_del_init(&bp->b_list); |
1726 | xfs_buf_iostrategy(bp); | 1730 | xfs_buf_iostrategy(bp); |
1727 | |||
1728 | blk_run_address_space(target->bt_mapping); | ||
1729 | } | 1731 | } |
1730 | 1732 | ||
1731 | if (as_list_len > 0) | 1733 | if (as_list_len > 0) |
1732 | purge_addresses(); | 1734 | purge_addresses(); |
1735 | if (count) | ||
1736 | blk_run_address_space(target->bt_mapping); | ||
1733 | 1737 | ||
1734 | clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); | 1738 | clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); |
1735 | } while (!kthread_should_stop()); | 1739 | } while (!kthread_should_stop()); |
@@ -1767,7 +1771,7 @@ xfs_flush_buftarg( | |||
1767 | continue; | 1771 | continue; |
1768 | } | 1772 | } |
1769 | 1773 | ||
1770 | list_move(&bp->b_list, &tmp); | 1774 | list_move_tail(&bp->b_list, &tmp); |
1771 | } | 1775 | } |
1772 | spin_unlock(dwlk); | 1776 | spin_unlock(dwlk); |
1773 | 1777 | ||
@@ -1776,7 +1780,7 @@ xfs_flush_buftarg( | |||
1776 | */ | 1780 | */ |
1777 | list_for_each_entry_safe(bp, n, &tmp, b_list) { | 1781 | list_for_each_entry_safe(bp, n, &tmp, b_list) { |
1778 | xfs_buf_lock(bp); | 1782 | xfs_buf_lock(bp); |
1779 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q); | 1783 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|_XBF_RUN_QUEUES); |
1780 | bp->b_flags |= XBF_WRITE; | 1784 | bp->b_flags |= XBF_WRITE; |
1781 | if (wait) | 1785 | if (wait) |
1782 | bp->b_flags &= ~XBF_ASYNC; | 1786 | bp->b_flags &= ~XBF_ASYNC; |
@@ -1786,6 +1790,9 @@ xfs_flush_buftarg( | |||
1786 | xfs_buf_iostrategy(bp); | 1790 | xfs_buf_iostrategy(bp); |
1787 | } | 1791 | } |
1788 | 1792 | ||
1793 | if (wait) | ||
1794 | blk_run_address_space(target->bt_mapping); | ||
1795 | |||
1789 | /* | 1796 | /* |
1790 | * Remaining list items must be flushed before returning | 1797 | * Remaining list items must be flushed before returning |
1791 | */ | 1798 | */ |
@@ -1797,9 +1804,6 @@ xfs_flush_buftarg( | |||
1797 | xfs_buf_relse(bp); | 1804 | xfs_buf_relse(bp); |
1798 | } | 1805 | } |
1799 | 1806 | ||
1800 | if (wait) | ||
1801 | blk_run_address_space(target->bt_mapping); | ||
1802 | |||
1803 | return pincount; | 1807 | return pincount; |
1804 | } | 1808 | } |
1805 | 1809 | ||