diff options
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 33 | 
1 files changed, 11 insertions, 22 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e0259a163f98..d754e3cf99a8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -40,18 +40,13 @@  struct wb_writeback_work {  	long nr_pages;  	struct super_block *sb; -	/* -	 * Write only inodes dirtied before this time. Don't forget to set -	 * older_than_this_is_set when you set this. -	 */ -	unsigned long older_than_this; +	unsigned long *older_than_this;  	enum writeback_sync_modes sync_mode;  	unsigned int tagged_writepages:1;  	unsigned int for_kupdate:1;  	unsigned int range_cyclic:1;  	unsigned int for_background:1;  	unsigned int for_sync:1;	/* sync(2) WB_SYNC_ALL writeback */ -	unsigned int older_than_this_is_set:1;  	enum wb_reason reason;		/* why was writeback initiated? */  	struct list_head list;		/* pending work list */ @@ -252,10 +247,10 @@ static int move_expired_inodes(struct list_head *delaying_queue,  	int do_sb_sort = 0;  	int moved = 0; -	WARN_ON_ONCE(!work->older_than_this_is_set);  	while (!list_empty(delaying_queue)) {  		inode = wb_inode(delaying_queue->prev); -		if (inode_dirtied_after(inode, work->older_than_this)) +		if (work->older_than_this && +		    inode_dirtied_after(inode, *work->older_than_this))  			break;  		list_move(&inode->i_wb_list, &tmp);  		moved++; @@ -742,8 +737,6 @@ static long writeback_inodes_wb(struct bdi_writeback *wb, long nr_pages,  		.sync_mode	= WB_SYNC_NONE,  		.range_cyclic	= 1,  		.reason		= reason, -		.older_than_this = jiffies, -		.older_than_this_is_set = 1,  	};  	spin_lock(&wb->list_lock); @@ -802,13 +795,12 @@ static long wb_writeback(struct bdi_writeback *wb,  {  	unsigned long wb_start = jiffies;  	long nr_pages = work->nr_pages; +	unsigned long oldest_jif;  	struct inode *inode;  	long progress; -	if (!work->older_than_this_is_set) { -		work->older_than_this = jiffies; -		work->older_than_this_is_set = 1; -	} +	oldest_jif = jiffies; +	work->older_than_this = &oldest_jif;  	spin_lock(&wb->list_lock);  	for (;;) { @@ -842,10 +834,10 @@ static long wb_writeback(struct bdi_writeback *wb,  		 * safe.  		 */  		if (work->for_kupdate) { -			work->older_than_this = jiffies - +			oldest_jif = jiffies -  				msecs_to_jiffies(dirty_expire_interval * 10);  		} else if (work->for_background) -			work->older_than_this = jiffies; +			oldest_jif = jiffies;  		trace_writeback_start(wb->bdi, work);  		if (list_empty(&wb->b_io)) @@ -1357,21 +1349,18 @@ EXPORT_SYMBOL(try_to_writeback_inodes_sb);  /**   * sync_inodes_sb	-	sync sb inode pages - * @sb:			the superblock - * @older_than_this:	timestamp + * @sb: the superblock   *   * This function writes and waits on any dirty inode belonging to this - * superblock that has been dirtied before given timestamp. + * super_block.   */ -void sync_inodes_sb(struct super_block *sb, unsigned long older_than_this) +void sync_inodes_sb(struct super_block *sb)  {  	DECLARE_COMPLETION_ONSTACK(done);  	struct wb_writeback_work work = {  		.sb		= sb,  		.sync_mode	= WB_SYNC_ALL,  		.nr_pages	= LONG_MAX, -		.older_than_this = older_than_this, -		.older_than_this_is_set = 1,  		.range_cyclic	= 0,  		.done		= &done,  		.reason		= WB_REASON_SYNC,  | 
