diff options
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index aed881a76b22..f027382b54be 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -707,6 +707,17 @@ get_next_work_item(struct backing_dev_info *bdi) | |||
707 | return work; | 707 | return work; |
708 | } | 708 | } |
709 | 709 | ||
710 | /* | ||
711 | * Add in the number of potentially dirty inodes, because each inode | ||
712 | * write can dirty pagecache in the underlying blockdev. | ||
713 | */ | ||
714 | static unsigned long get_nr_dirty_pages(void) | ||
715 | { | ||
716 | return global_page_state(NR_FILE_DIRTY) + | ||
717 | global_page_state(NR_UNSTABLE_NFS) + | ||
718 | get_nr_dirty_inodes(); | ||
719 | } | ||
720 | |||
710 | static long wb_check_old_data_flush(struct bdi_writeback *wb) | 721 | static long wb_check_old_data_flush(struct bdi_writeback *wb) |
711 | { | 722 | { |
712 | unsigned long expired; | 723 | unsigned long expired; |
@@ -724,13 +735,7 @@ static long wb_check_old_data_flush(struct bdi_writeback *wb) | |||
724 | return 0; | 735 | return 0; |
725 | 736 | ||
726 | wb->last_old_flush = jiffies; | 737 | wb->last_old_flush = jiffies; |
727 | /* | 738 | nr_pages = get_nr_dirty_pages(); |
728 | * Add in the number of potentially dirty inodes, because each inode | ||
729 | * write can dirty pagecache in the underlying blockdev. | ||
730 | */ | ||
731 | nr_pages = global_page_state(NR_FILE_DIRTY) + | ||
732 | global_page_state(NR_UNSTABLE_NFS) + | ||
733 | get_nr_dirty_inodes(); | ||
734 | 739 | ||
735 | if (nr_pages) { | 740 | if (nr_pages) { |
736 | struct wb_writeback_work work = { | 741 | struct wb_writeback_work work = { |
@@ -1086,8 +1091,6 @@ static void wait_sb_inodes(struct super_block *sb) | |||
1086 | */ | 1091 | */ |
1087 | void writeback_inodes_sb(struct super_block *sb) | 1092 | void writeback_inodes_sb(struct super_block *sb) |
1088 | { | 1093 | { |
1089 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); | ||
1090 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); | ||
1091 | DECLARE_COMPLETION_ONSTACK(done); | 1094 | DECLARE_COMPLETION_ONSTACK(done); |
1092 | struct wb_writeback_work work = { | 1095 | struct wb_writeback_work work = { |
1093 | .sb = sb, | 1096 | .sb = sb, |
@@ -1097,7 +1100,7 @@ void writeback_inodes_sb(struct super_block *sb) | |||
1097 | 1100 | ||
1098 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | 1101 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); |
1099 | 1102 | ||
1100 | work.nr_pages = nr_dirty + nr_unstable + get_nr_dirty_inodes(); | 1103 | work.nr_pages = get_nr_dirty_pages(); |
1101 | 1104 | ||
1102 | bdi_queue_work(sb->s_bdi, &work); | 1105 | bdi_queue_work(sb->s_bdi, &work); |
1103 | wait_for_completion(&done); | 1106 | wait_for_completion(&done); |