diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 26 | 
1 files changed, 13 insertions, 13 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 665d446b25bc..891e1c78e4f1 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -760,15 +760,9 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);   * If warn is true, then emit a warning if the page is not uptodate and has   * not been truncated.   */ -static int __set_page_dirty(struct page *page, +static void __set_page_dirty(struct page *page,  		struct address_space *mapping, int warn)  { -	if (unlikely(!mapping)) -		return !TestSetPageDirty(page); - -	if (TestSetPageDirty(page)) -		return 0; -  	spin_lock_irq(&mapping->tree_lock);  	if (page->mapping) {	/* Race with truncate? */  		WARN_ON_ONCE(warn && !PageUptodate(page)); @@ -777,6 +771,7 @@ static int __set_page_dirty(struct page *page,  			__inc_zone_page_state(page, NR_FILE_DIRTY);  			__inc_bdi_stat(mapping->backing_dev_info,  					BDI_RECLAIMABLE); +			task_dirty_inc(current);  			task_io_account_write(PAGE_CACHE_SIZE);  		}  		radix_tree_tag_set(&mapping->page_tree, @@ -784,8 +779,6 @@ static int __set_page_dirty(struct page *page,  	}  	spin_unlock_irq(&mapping->tree_lock);  	__mark_inode_dirty(mapping->host, I_DIRTY_PAGES); - -	return 1;  }  /* @@ -815,6 +808,7 @@ static int __set_page_dirty(struct page *page,   */  int __set_page_dirty_buffers(struct page *page)  { +	int newly_dirty;  	struct address_space *mapping = page_mapping(page);  	if (unlikely(!mapping)) @@ -830,9 +824,12 @@ int __set_page_dirty_buffers(struct page *page)  			bh = bh->b_this_page;  		} while (bh != head);  	} +	newly_dirty = !TestSetPageDirty(page);  	spin_unlock(&mapping->private_lock); -	return __set_page_dirty(page, mapping, 1); +	if (newly_dirty) +		__set_page_dirty(page, mapping, 1); +	return newly_dirty;  }  EXPORT_SYMBOL(__set_page_dirty_buffers); @@ -1261,8 +1258,11 @@ void mark_buffer_dirty(struct buffer_head *bh)  			return;  	} -	if (!test_set_buffer_dirty(bh)) -		__set_page_dirty(bh->b_page, page_mapping(bh->b_page), 0); +	if (!test_set_buffer_dirty(bh)) { +		struct page *page = bh->b_page; +		if (!TestSetPageDirty(page)) +			__set_page_dirty(page, page_mapping(page), 0); +	}  }  /* @@ -3108,7 +3108,7 @@ int sync_dirty_buffer(struct buffer_head *bh)  	if (test_clear_buffer_dirty(bh)) {  		get_bh(bh);  		bh->b_end_io = end_buffer_write_sync; -		ret = submit_bh(WRITE_SYNC, bh); +		ret = submit_bh(WRITE, bh);  		wait_on_buffer(bh);  		if (buffer_eopnotsupp(bh)) {  			clear_buffer_eopnotsupp(bh);  |