diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
| -rw-r--r-- | fs/btrfs/extent_io.c | 25 | 
1 files changed, 18 insertions, 7 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index eeb75281894e..cceaf05aada2 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -1938,9 +1938,9 @@ out:  }  void extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, -				 u64 delalloc_end, struct page *locked_page, -				 unsigned clear_bits, -				 unsigned long page_ops) +				  struct page *locked_page, +				  unsigned clear_bits, +				  unsigned long page_ops)  {  	clear_extent_bit(&BTRFS_I(inode)->io_tree, start, end, clear_bits, 1, 0,  			 NULL); @@ -3745,12 +3745,21 @@ err_unlock:  static void set_btree_ioerr(struct page *page)  {  	struct extent_buffer *eb = (struct extent_buffer *)page->private; +	struct btrfs_fs_info *fs_info;  	SetPageError(page);  	if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags))  		return;  	/* +	 * If we error out, we should add back the dirty_metadata_bytes +	 * to make it consistent. +	 */ +	fs_info = eb->fs_info; +	percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, +				 eb->len, fs_info->dirty_metadata_batch); + +	/*  	 * If writeback for a btree extent that doesn't belong to a log tree  	 * failed, increment the counter transaction->eb_write_errors.  	 * We do this because while the transaction is running and before it's @@ -3986,6 +3995,10 @@ retry:  			if (!ret) {  				free_extent_buffer(eb);  				continue; +			} else if (ret < 0) { +				done = 1; +				free_extent_buffer(eb); +				break;  			}  			ret = write_one_eb(eb, wbc, &epd); @@ -4339,10 +4352,8 @@ int extent_invalidatepage(struct extent_io_tree *tree,  	lock_extent_bits(tree, start, end, &cached_state);  	wait_on_page_writeback(page); -	clear_extent_bit(tree, start, end, -			 EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | -			 EXTENT_DO_ACCOUNTING, -			 1, 1, &cached_state); +	clear_extent_bit(tree, start, end, EXTENT_LOCKED | EXTENT_DELALLOC | +			 EXTENT_DO_ACCOUNTING, 1, 1, &cached_state);  	return 0;  }  |