diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 28 | 
1 files changed, 28 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index cb814a71800..a713f69f0c7 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -3626,6 +3626,34 @@ void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,  	trans->bytes_reserved = 0;  } +int btrfs_orphan_reserve_metadata(struct btrfs_trans_handle *trans, +				  struct inode *inode) +{ +	struct btrfs_root *root = BTRFS_I(inode)->root; +	struct btrfs_block_rsv *src_rsv = get_block_rsv(trans, root); +	struct btrfs_block_rsv *dst_rsv = root->orphan_block_rsv; + +	/* +	 * one for deleting orphan item, one for updating inode and +	 * two for calling btrfs_truncate_inode_items. +	 * +	 * btrfs_truncate_inode_items is a delete operation, it frees +	 * more space than it uses in most cases. So two units of +	 * metadata space should be enough for calling it many times. +	 * If all of the metadata space is used, we can commit +	 * transaction and use space it freed. +	 */ +	u64 num_bytes = calc_trans_metadata_size(root, 4); +	return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); +} + +void btrfs_orphan_release_metadata(struct inode *inode) +{ +	struct btrfs_root *root = BTRFS_I(inode)->root; +	u64 num_bytes = calc_trans_metadata_size(root, 4); +	btrfs_block_rsv_release(root, root->orphan_block_rsv, num_bytes); +} +  int btrfs_snap_reserve_metadata(struct btrfs_trans_handle *trans,  				struct btrfs_pending_snapshot *pending)  {  |