Hi, Qu,
On 2015/09/08 18:22, Qu Wenruo wrote:
> Add new function __btrfs_check_data_free_space() to do precious space
> reservation.
>
> The new function will replace old btrfs_check_data_free_space(), but
> until all the change is done, let's just use the new name.
>
> Also, export internal use function btrfs_alloc_data_chunk_ondemand(), as
> now qgroup reserve requires precious bytes, which can only be got in
> later loop(like fallocate).
> But data space info check and data chunk allocate doesn't need to be
> that accurate, and can be called at the beginning.
>
> So export it for later operations.
>
> Signed-off-by: Qu Wenruo <quwenruo@xxxxxxxxxxxxxx>
> ---
> fs/btrfs/ctree.h | 2 ++
> fs/btrfs/extent-tree.c | 50 +++++++++++++++++++++++++++++++++++++++++---------
> 2 files changed, 43 insertions(+), 9 deletions(-)
>
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index ae86025..c1a0aaf 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -3453,6 +3453,8 @@ enum btrfs_reserve_flush_enum {
> };
>
> int btrfs_check_data_free_space(struct inode *inode, u64 bytes, u64 write_bytes);
> +int __btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len);
> +int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes);
> void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes);
> void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
> struct btrfs_root *root);
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 402415c..61366ca 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -3907,11 +3907,7 @@ u64 btrfs_get_alloc_profile(struct btrfs_root *root, int data)
> return ret;
> }
>
> -/*
> - * This will check the space that the inode allocates from to make sure we have
> - * enough space for bytes.
> - */
> -int btrfs_check_data_free_space(struct inode *inode, u64 bytes, u64 write_bytes)
> +int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes)
> {
> struct btrfs_space_info *data_sinfo;
> struct btrfs_root *root = BTRFS_I(inode)->root;
> @@ -4032,19 +4028,55 @@ commit_trans:
> data_sinfo->flags, bytes, 1);
> return -ENOSPC;
> }
> - ret = btrfs_qgroup_reserve(root, write_bytes);
> - if (ret)
> - goto out;
> data_sinfo->bytes_may_use += bytes;
> trace_btrfs_space_reservation(root->fs_info, "space_info",
> data_sinfo->flags, bytes, 1);
> -out:
> spin_unlock(&data_sinfo->lock);
>
> return ret;
> }
>
> /*
> + * This will check the space that the inode allocates from to make sure we have
> + * enough space for bytes.
> + */
> +int btrfs_check_data_free_space(struct inode *inode, u64 bytes, u64 write_bytes)
> +{
> + struct btrfs_root *root = BTRFS_I(inode)->root;
> + int ret;
> +
> + ret = btrfs_alloc_data_chunk_ondemand(inode, bytes);
> + if (ret < 0)
> + return ret;
> + ret = btrfs_qgroup_reserve(root, write_bytes);
> + return ret;
> +}
> +
> +/*
> + * New check_data_free_space() with ability for precious data reserveation
reservation
Thanks,
Tsutomu
> + * Will replace old btrfs_check_data_free_space(), but for patch split,
> + * add a new function first and then replace it.
> + */
> +int __btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len)
> +{
> + struct btrfs_root *root = BTRFS_I(inode)->root;
> + int ret;
> +
> + /* align the range */
> + len = round_up(start + len, root->sectorsize) -
> + round_down(start, root->sectorsize);
> + start = round_down(start, root->sectorsize);
> +
> + ret = btrfs_alloc_data_chunk_ondemand(inode, len);
> + if (ret < 0)
> + return ret;
> +
> + /* Use new btrfs_qgroup_reserve_data to reserve precious data space */
> + ret = btrfs_qgroup_reserve_data(inode, start, len);
> + return ret;
> +}
> +
> +/*
> * Called if we need to clear a data reservation for this inode.
> */
> void btrfs_free_reserved_data_space(struct inode *inode, u64 bytes)
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html