diff options
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 17 | 
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 28076562ada..6401cd76f10 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -658,14 +658,21 @@ long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages)  	return nr_pages - work.nr_pages;  } -static inline bool over_bground_thresh(void) +static bool over_bground_thresh(struct backing_dev_info *bdi)  {  	unsigned long background_thresh, dirty_thresh;  	global_dirty_limits(&background_thresh, &dirty_thresh); -	return (global_page_state(NR_FILE_DIRTY) + -		global_page_state(NR_UNSTABLE_NFS) > background_thresh); +	if (global_page_state(NR_FILE_DIRTY) + +	    global_page_state(NR_UNSTABLE_NFS) > background_thresh) +		return true; + +	if (bdi_stat(bdi, BDI_RECLAIMABLE) > +				bdi_dirty_limit(bdi, background_thresh)) +		return true; + +	return false;  }  /* @@ -727,7 +734,7 @@ static long wb_writeback(struct bdi_writeback *wb,  		 * For background writeout, stop when we are below the  		 * background dirty threshold  		 */ -		if (work->for_background && !over_bground_thresh()) +		if (work->for_background && !over_bground_thresh(wb->bdi))  			break;  		if (work->for_kupdate) { @@ -811,7 +818,7 @@ static unsigned long get_nr_dirty_pages(void)  static long wb_check_background_flush(struct bdi_writeback *wb)  { -	if (over_bground_thresh()) { +	if (over_bground_thresh(wb->bdi)) {  		struct wb_writeback_work work = {  			.nr_pages	= LONG_MAX,  |