diff options
Diffstat (limited to 'mm/page-writeback.c')
| -rw-r--r-- | mm/page-writeback.c | 41 | 
1 files changed, 9 insertions, 32 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index c81624bc3969..72b0ff0d4bae 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -41,6 +41,7 @@  #include <trace/events/writeback.h>  #include "internal.h" +#include "swap.h"  /*   * Sleep at most 200ms at a time in balance_dirty_pages(). @@ -520,8 +521,8 @@ static int dirty_ratio_handler(const struct ctl_table *table, int write, void *b  	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);  	if (ret == 0 && write && vm_dirty_ratio != old_ratio) { -		writeback_set_ratelimit();  		vm_dirty_bytes = 0; +		writeback_set_ratelimit();  	}  	return ret;  } @@ -607,7 +608,7 @@ EXPORT_SYMBOL_GPL(wb_writeout_inc);   */  static void writeout_period(struct timer_list *t)  { -	struct wb_domain *dom = from_timer(dom, t, period_timer); +	struct wb_domain *dom = timer_container_of(dom, t, period_timer);  	int miss_periods = (jiffies - dom->period_time) /  						 VM_COMPLETIONS_PERIOD_LEN; @@ -2202,7 +2203,7 @@ static int dirty_writeback_centisecs_handler(const struct ctl_table *table, int  void laptop_mode_timer_fn(struct timer_list *t)  {  	struct backing_dev_info *backing_dev_info = -		from_timer(backing_dev_info, t, laptop_mode_wb_timer); +		timer_container_of(backing_dev_info, t, laptop_mode_wb_timer);  	wakeup_flusher_threads_bdi(backing_dev_info, WB_REASON_LAPTOP_TIMER);  } @@ -2564,11 +2565,11 @@ struct folio *writeback_iter(struct address_space *mapping,  	if (!folio) {  		/*  		 * To avoid deadlocks between range_cyclic writeback and callers -		 * that hold pages in PageWriteback to aggregate I/O until +		 * that hold folios in writeback to aggregate I/O until  		 * the writeback iteration finishes, we do not loop back to the -		 * start of the file.  Doing so causes a page lock/page +		 * start of the file.  Doing so causes a folio lock/folio  		 * writeback access order inversion - we should only ever lock -		 * multiple pages in ascending page->index order, and looping +		 * multiple folios in ascending folio->index order, and looping  		 * back to the start of the file violates that rule and causes  		 * deadlocks.  		 */ @@ -2621,27 +2622,6 @@ int write_cache_pages(struct address_space *mapping,  }  EXPORT_SYMBOL(write_cache_pages); -static int writeback_use_writepage(struct address_space *mapping, -		struct writeback_control *wbc) -{ -	struct folio *folio = NULL; -	struct blk_plug plug; -	int err; - -	blk_start_plug(&plug); -	while ((folio = writeback_iter(mapping, wbc, folio, &err))) { -		err = mapping->a_ops->writepage(&folio->page, wbc); -		if (err == AOP_WRITEPAGE_ACTIVATE) { -			folio_unlock(folio); -			err = 0; -		} -		mapping_set_error(mapping, err); -	} -	blk_finish_plug(&plug); - -	return err; -} -  int do_writepages(struct address_space *mapping, struct writeback_control *wbc)  {  	int ret; @@ -2652,14 +2632,11 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)  	wb = inode_to_wb_wbc(mapping->host, wbc);  	wb_bandwidth_estimate_start(wb);  	while (1) { -		if (mapping->a_ops->writepages) { +		if (mapping->a_ops->writepages)  			ret = mapping->a_ops->writepages(mapping, wbc); -		} else if (mapping->a_ops->writepage) { -			ret = writeback_use_writepage(mapping, wbc); -		} else { +		else  			/* deal with chardevs and other special files */  			ret = 0; -		}  		if (ret != -ENOMEM || wbc->sync_mode != WB_SYNC_ALL)  			break;  | 
