diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-11-21 21:56:56 +0000 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-11-21 21:56:56 +0000 | 
| commit | 2d13ccaa8797d7e599f3792aed4b1e44b47f94a5 (patch) | |
| tree | 7079c1610373fc6709c3a285a53099beaf21295a /fs/btrfs/extent-tree.c | |
| parent | 59136ef3c596606d3eef920dc3e0fdfa2ce52c6f (diff) | |
| parent | 11f1c5de7be06bbb51363002ebc4d00edc2677df (diff) | |
| download | olio-linux-3.10-2d13ccaa8797d7e599f3792aed4b1e44b47f94a5.tar.xz olio-linux-3.10-2d13ccaa8797d7e599f3792aed4b1e44b47f94a5.zip  | |
Merge branch 'irqchip-consolidation' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into devel-stable
Conflicts:
	arch/arm/mach-omap2/board-4430sdp.c
	arch/arm/mach-omap2/board-omap4panda.c
	arch/arm/mach-omap2/include/mach/omap4-common.h
	arch/arm/plat-omap/include/plat/irqs.h
The changes to omap4-common.h were moved to arch/arm/mach-omap2/common.h
and the other trivial conflicts resolved.  The now empty ifdef in irqs.h
was also eliminated.
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 50 | 
1 files changed, 31 insertions, 19 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 9879bd47463..b232150b5b6 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3797,16 +3797,16 @@ void btrfs_free_block_rsv(struct btrfs_root *root,  	kfree(rsv);  } -int btrfs_block_rsv_add(struct btrfs_root *root, -			struct btrfs_block_rsv *block_rsv, -			u64 num_bytes) +static inline int __block_rsv_add(struct btrfs_root *root, +				  struct btrfs_block_rsv *block_rsv, +				  u64 num_bytes, int flush)  {  	int ret;  	if (num_bytes == 0)  		return 0; -	ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1); +	ret = reserve_metadata_bytes(root, block_rsv, num_bytes, flush);  	if (!ret) {  		block_rsv_add_bytes(block_rsv, num_bytes, 1);  		return 0; @@ -3815,22 +3815,18 @@ int btrfs_block_rsv_add(struct btrfs_root *root,  	return ret;  } +int btrfs_block_rsv_add(struct btrfs_root *root, +			struct btrfs_block_rsv *block_rsv, +			u64 num_bytes) +{ +	return __block_rsv_add(root, block_rsv, num_bytes, 1); +} +  int btrfs_block_rsv_add_noflush(struct btrfs_root *root,  				struct btrfs_block_rsv *block_rsv,  				u64 num_bytes)  { -	int ret; - -	if (num_bytes == 0) -		return 0; - -	ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 0); -	if (!ret) { -		block_rsv_add_bytes(block_rsv, num_bytes, 1); -		return 0; -	} - -	return ret; +	return __block_rsv_add(root, block_rsv, num_bytes, 0);  }  int btrfs_block_rsv_check(struct btrfs_root *root, @@ -4064,23 +4060,30 @@ int btrfs_snap_reserve_metadata(struct btrfs_trans_handle *trans,   */  static unsigned drop_outstanding_extent(struct inode *inode)  { +	unsigned drop_inode_space = 0;  	unsigned dropped_extents = 0;  	BUG_ON(!BTRFS_I(inode)->outstanding_extents);  	BTRFS_I(inode)->outstanding_extents--; +	if (BTRFS_I(inode)->outstanding_extents == 0 && +	    BTRFS_I(inode)->delalloc_meta_reserved) { +		drop_inode_space = 1; +		BTRFS_I(inode)->delalloc_meta_reserved = 0; +	} +  	/*  	 * If we have more or the same amount of outsanding extents than we have  	 * reserved then we need to leave the reserved extents count alone.  	 */  	if (BTRFS_I(inode)->outstanding_extents >=  	    BTRFS_I(inode)->reserved_extents) -		return 0; +		return drop_inode_space;  	dropped_extents = BTRFS_I(inode)->reserved_extents -  		BTRFS_I(inode)->outstanding_extents;  	BTRFS_I(inode)->reserved_extents -= dropped_extents; -	return dropped_extents; +	return dropped_extents + drop_inode_space;  }  /** @@ -4166,9 +4169,18 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)  		nr_extents = BTRFS_I(inode)->outstanding_extents -  			BTRFS_I(inode)->reserved_extents;  		BTRFS_I(inode)->reserved_extents += nr_extents; +	} -		to_reserve = btrfs_calc_trans_metadata_size(root, nr_extents); +	/* +	 * Add an item to reserve for updating the inode when we complete the +	 * delalloc io. +	 */ +	if (!BTRFS_I(inode)->delalloc_meta_reserved) { +		nr_extents++; +		BTRFS_I(inode)->delalloc_meta_reserved = 1;  	} + +	to_reserve = btrfs_calc_trans_metadata_size(root, nr_extents);  	to_reserve += calc_csum_metadata_size(inode, num_bytes, 1);  	spin_unlock(&BTRFS_I(inode)->lock);  |