diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 40 | 
1 files changed, 9 insertions, 31 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index b20f1121efa..aff571cb6e0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -3752,13 +3752,9 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,  					int mark)  {  	int ret; -	struct page *page; -	struct inode *btree_inode = root->fs_info->btree_inode;  	struct extent_buffer *eb;  	u64 start = 0;  	u64 end; -	u64 offset; -	unsigned long index;  	while (1) {  		ret = find_first_extent_bit(dirty_pages, start, &start, &end, @@ -3768,35 +3764,17 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,  		clear_extent_bits(dirty_pages, start, end, mark, GFP_NOFS);  		while (start <= end) { -			index = start >> PAGE_CACHE_SHIFT; -			start = (u64)(index + 1) << PAGE_CACHE_SHIFT; -			page = find_get_page(btree_inode->i_mapping, index); -			if (!page) +			eb = btrfs_find_tree_block(root, start, +						   root->leafsize); +			start += eb->len; +			if (!eb)  				continue; -			offset = page_offset(page); - -			spin_lock(&dirty_pages->buffer_lock); -			eb = radix_tree_lookup( -			     &(&BTRFS_I(page->mapping->host)->io_tree)->buffer, -					       offset >> PAGE_CACHE_SHIFT); -			spin_unlock(&dirty_pages->buffer_lock); -			if (eb) -				ret = test_and_clear_bit(EXTENT_BUFFER_DIRTY, -							 &eb->bflags); -			lock_page(page); - -			wait_on_page_writeback(page); -			if (PageDirty(page)) { -				clear_page_dirty_for_io(page); -				spin_lock_irq(&page->mapping->tree_lock); -				radix_tree_tag_clear(&page->mapping->page_tree, -							page_index(page), -							PAGECACHE_TAG_DIRTY); -				spin_unlock_irq(&page->mapping->tree_lock); -			} +			wait_on_extent_buffer_writeback(eb); -			unlock_page(page); -			page_cache_release(page); +			if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, +					       &eb->bflags)) +				clear_extent_buffer_dirty(eb); +			free_extent_buffer_stale(eb);  		}  	}  |