diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 35 | 
1 files changed, 8 insertions, 27 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 4b833972273..571ad3c13b4 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -112,8 +112,6 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans,  	int err = 0;  	int i;  	struct inode *inode = fdentry(file)->d_inode; -	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; -	u64 hint_byte;  	u64 num_bytes;  	u64 start_pos;  	u64 end_of_last_block; @@ -125,22 +123,6 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans,  		    root->sectorsize - 1) & ~((u64)root->sectorsize - 1);  	end_of_last_block = start_pos + num_bytes - 1; - -	lock_extent(io_tree, start_pos, end_of_last_block, GFP_NOFS); -	trans = btrfs_join_transaction(root, 1); -	if (!trans) { -		err = -ENOMEM; -		goto out_unlock; -	} -	btrfs_set_trans_block_group(trans, inode); -	hint_byte = 0; - -	set_extent_uptodate(io_tree, start_pos, end_of_last_block, GFP_NOFS); - -	/* check for reserved extents on each page, we don't want -	 * to reset the delalloc bit on things that already have -	 * extents reserved. -	 */  	btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block);  	for (i = 0; i < num_pages; i++) {  		struct page *p = pages[i]; @@ -155,9 +137,6 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans,  		 * at this time.  		 */  	} -	err = btrfs_end_transaction(trans, root); -out_unlock: -	unlock_extent(io_tree, start_pos, end_of_last_block, GFP_NOFS);  	return err;  } @@ -189,18 +168,18 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,  		if (!split2)  			split2 = alloc_extent_map(GFP_NOFS); -		spin_lock(&em_tree->lock); +		write_lock(&em_tree->lock);  		em = lookup_extent_mapping(em_tree, start, len);  		if (!em) { -			spin_unlock(&em_tree->lock); +			write_unlock(&em_tree->lock);  			break;  		}  		flags = em->flags;  		if (skip_pinned && test_bit(EXTENT_FLAG_PINNED, &em->flags)) { -			spin_unlock(&em_tree->lock);  			if (em->start <= start &&  			    (!testend || em->start + em->len >= start + len)) {  				free_extent_map(em); +				write_unlock(&em_tree->lock);  				break;  			}  			if (start < em->start) { @@ -210,6 +189,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,  				start = em->start + em->len;  			}  			free_extent_map(em); +			write_unlock(&em_tree->lock);  			continue;  		}  		compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); @@ -260,7 +240,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,  			free_extent_map(split);  			split = NULL;  		} -		spin_unlock(&em_tree->lock); +		write_unlock(&em_tree->lock);  		/* once for us */  		free_extent_map(em); @@ -289,7 +269,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end,  noinline int btrfs_drop_extents(struct btrfs_trans_handle *trans,  		       struct btrfs_root *root, struct inode *inode,  		       u64 start, u64 end, u64 locked_end, -		       u64 inline_limit, u64 *hint_byte) +		       u64 inline_limit, u64 *hint_byte, int drop_cache)  {  	u64 extent_end = 0;  	u64 search_start = start; @@ -314,7 +294,8 @@ noinline int btrfs_drop_extents(struct btrfs_trans_handle *trans,  	int ret;  	inline_limit = 0; -	btrfs_drop_extent_cache(inode, start, end - 1, 0); +	if (drop_cache) +		btrfs_drop_extent_cache(inode, start, end - 1, 0);  	path = btrfs_alloc_path();  	if (!path)  | 
