Skip to content

Commit 1ada3a6

Browse files
Qu Wenruomasoncl
authored andcommitted
btrfs: extent-tree: Add new version of btrfs_delalloc_reserve/release_space
Add new version of btrfs_delalloc_reserve_space() and btrfs_delalloc_release_space() functions, which supports accurate qgroup reserve. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
1 parent d9d8b2a commit 1ada3a6

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

fs/btrfs/ctree.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3473,7 +3473,9 @@ void btrfs_subvolume_release_metadata(struct btrfs_root *root,
34733473
int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes);
34743474
void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes);
34753475
int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes);
3476+
int __btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len);
34763477
void btrfs_delalloc_release_space(struct inode *inode, u64 num_bytes);
3478+
void __btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len);
34773479
void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type);
34783480
struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root,
34793481
unsigned short type);

fs/btrfs/extent-tree.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5714,6 +5714,44 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes)
57145714
to_free);
57155715
}
57165716

5717+
/**
5718+
* __btrfs_delalloc_reserve_space - reserve data and metadata space for
5719+
* delalloc
5720+
* @inode: inode we're writing to
5721+
* @start: start range we are writing to
5722+
* @len: how long the range we are writing to
5723+
*
5724+
* TODO: This function will finally replace old btrfs_delalloc_reserve_space()
5725+
*
5726+
* This will do the following things
5727+
*
5728+
* o reserve space in data space info for num bytes
5729+
* and reserve precious corresponding qgroup space
5730+
* (Done in check_data_free_space)
5731+
*
5732+
* o reserve space for metadata space, based on the number of outstanding
5733+
* extents and how much csums will be needed
5734+
* also reserve metadata space in a per root over-reserve method.
5735+
* o add to the inodes->delalloc_bytes
5736+
* o add it to the fs_info's delalloc inodes list.
5737+
* (Above 3 all done in delalloc_reserve_metadata)
5738+
*
5739+
* Return 0 for success
5740+
* Return <0 for error(-ENOSPC or -EQUOT)
5741+
*/
5742+
int __btrfs_delalloc_reserve_space(struct inode *inode, u64 start, u64 len)
5743+
{
5744+
int ret;
5745+
5746+
ret = __btrfs_check_data_free_space(inode, start, len);
5747+
if (ret < 0)
5748+
return ret;
5749+
ret = btrfs_delalloc_reserve_metadata(inode, len);
5750+
if (ret < 0)
5751+
__btrfs_free_reserved_data_space(inode, start, len);
5752+
return ret;
5753+
}
5754+
57175755
/**
57185756
* btrfs_delalloc_reserve_space - reserve data and metadata space for delalloc
57195757
* @inode: inode we're writing to
@@ -5746,6 +5784,27 @@ int btrfs_delalloc_reserve_space(struct inode *inode, u64 num_bytes)
57465784
return 0;
57475785
}
57485786

5787+
/**
5788+
* __btrfs_delalloc_release_space - release data and metadata space for delalloc
5789+
* @inode: inode we're releasing space for
5790+
* @start: start position of the space already reserved
5791+
* @len: the len of the space already reserved
5792+
*
5793+
* This must be matched with a call to btrfs_delalloc_reserve_space. This is
5794+
* called in the case that we don't need the metadata AND data reservations
5795+
* anymore. So if there is an error or we insert an inline extent.
5796+
*
5797+
* This function will release the metadata space that was not used and will
5798+
* decrement ->delalloc_bytes and remove it from the fs_info delalloc_inodes
5799+
* list if there are no delalloc bytes left.
5800+
* Also it will handle the qgroup reserved space.
5801+
*/
5802+
void __btrfs_delalloc_release_space(struct inode *inode, u64 start, u64 len)
5803+
{
5804+
btrfs_delalloc_release_metadata(inode, len);
5805+
__btrfs_free_reserved_data_space(inode, start, len);
5806+
}
5807+
57495808
/**
57505809
* btrfs_delalloc_release_space - release data and metadata space for delalloc
57515810
* @inode: inode we're releasing space for

0 commit comments

Comments
 (0)