From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Qu Wenruo <wqu@suse.com>, linux-btrfs@vger.kernel.org
Cc: dsterba@suse.cz
Subject: Re: [PATCH v2.2 04/10] btrfs: qgroup: Use separate meta reservation type for delalloc
Date: Tue, 26 Dec 2017 13:40:06 +0800 [thread overview]
Message-ID: <b70cd6d9-c1e6-29f1-a96f-711edeb37261@gmx.com> (raw)
In-Reply-To: <20171226053727.25505-1-wqu@suse.com>
[-- Attachment #1.1: Type: text/plain, Size: 21404 bytes --]
And for anyone who wants to test the latest version of the patchset, it
can be fetched from the following branch:
https://github.com/adam900710/linux/tree/qgroup_meta_rework
And now, the branch can pass the existing qgroup tests without problem.
Thanks,
Qu
On 2017年12月26日 13:37, Qu Wenruo wrote:
> Before this patch, btrfs qgroup is mixing per-transcation meta rsv with
> preallocated meta rsv, making it quite easy to underflow qgroup meta
> reservation.
>
> Since we have the new qgroup meta rsv types, apply it to delalloc
> reservation.
>
> Now for delalloc, most of its reserved space will use META_PREALLOC qgroup
> rsv type.
>
> And for callers reducing outstanding extent like btrfs_finish_ordered_io(),
> they will convert corresponding META_PREALLOC reservation to
> META_PERTRANS.
>
> This is mainly due to the fact that current qgroup numbers will only be
> updated in btrfs_commit_transaction(), that's to say if we don't keep
> such placeholder reservation, we can exceed qgroup limitation.
>
> And for callers freeing outstanding extent in error handler, we will
> just free META_PREALLOC bytes.
>
> This behavior makes callers of btrfs_qgroup_release_meta() or
> btrfs_qgroup_convert_meta() to be aware of which type they are.
> So in this patch, btrfs_delalloc_release_metadata() and its callers get
> an extra parameter to info qgroup to do correct meta convert/release.
>
> The good news is, even we use the wrong type (convert or free), it won't
> cause obvious bug, as prealloc type is always in good shape, and the
> type only affects how per-trans meta is increased or not.
>
> So the worst case will be at most metadata limitation can be sometimes
> exceeded (no convert at all) or metadata limitation is reached too soon
> (no free at all).
>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
> changelog:
> v2.2
> Fix the wrong parameter in __btrfs_buffered_write(), where qgroup
> should be freed but not converted.
> Wrongly convert the reserved meta will easily flood the pertrans rsv,
> as each successful buffered write will increase pertrans usage, which
> results too early EDQUOT.
> ---
> fs/btrfs/ctree.h | 9 ++++++---
> fs/btrfs/extent-tree.c | 45 +++++++++++++++++++++++++--------------------
> fs/btrfs/file.c | 15 ++++++++-------
> fs/btrfs/free-space-cache.c | 2 +-
> fs/btrfs/inode-map.c | 4 ++--
> fs/btrfs/inode.c | 27 ++++++++++++++-------------
> fs/btrfs/ioctl.c | 10 ++++++----
> fs/btrfs/ordered-data.c | 2 +-
> fs/btrfs/relocation.c | 9 +++++----
> 9 files changed, 68 insertions(+), 55 deletions(-)
>
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index bd2bf589e6c8..091c0e06b32e 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -2728,7 +2728,8 @@ int btrfs_check_data_free_space(struct inode *inode,
> void btrfs_free_reserved_data_space(struct inode *inode,
> struct extent_changeset *reserved, u64 start, u64 len);
> void btrfs_delalloc_release_space(struct inode *inode,
> - struct extent_changeset *reserved, u64 start, u64 len);
> + struct extent_changeset *reserved,
> + u64 start, u64 len, bool qgroup_free);
> void btrfs_free_reserved_data_space_noquota(struct inode *inode, u64 start,
> u64 len);
> void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
> @@ -2743,10 +2744,12 @@ int btrfs_subvolume_reserve_metadata(struct btrfs_root *root,
> u64 *qgroup_reserved, bool use_global_rsv);
> void btrfs_subvolume_release_metadata(struct btrfs_fs_info *fs_info,
> struct btrfs_block_rsv *rsv);
> -void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes);
> +void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes,
> + bool qgroup_free);
>
> int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes);
> -void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes);
> +void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes,
> + bool qgroup_free);
> int btrfs_delalloc_reserve_space(struct inode *inode,
> struct extent_changeset **reserved, u64 start, u64 len);
> void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type);
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 20923fce06c4..986660f301de 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -5754,6 +5754,9 @@ int btrfs_inode_rsv_refill(struct btrfs_inode *inode,
> if (num_bytes == 0)
> return 0;
>
> + ret = btrfs_qgroup_reserve_meta_prealloc(root, num_bytes, true);
> + if (ret)
> + return ret;
> ret = reserve_metadata_bytes(root, block_rsv, num_bytes, flush);
> if (!ret) {
> block_rsv_add_bytes(block_rsv, num_bytes, 0);
> @@ -5766,11 +5769,16 @@ int btrfs_inode_rsv_refill(struct btrfs_inode *inode,
> /**
> * btrfs_inode_rsv_release - release any excessive reservation.
> * @inode - the inode we need to release from.
> + * @qgroup_free - free or convert qgroup meta.
> + * Unlike normal operation, qgroup meta reservation needs to know if
> + * we are freeing qgroup reservation or just convert them into per-trans.
> + * Normally @qgroup_free is true for error handler, and false for normal
> + * release.
> *
> * This is the same as btrfs_block_rsv_release, except that it handles the
> * tracepoint for the reservation.
> */
> -void btrfs_inode_rsv_release(struct btrfs_inode *inode)
> +void btrfs_inode_rsv_release(struct btrfs_inode *inode, bool qgroup_free)
> {
> struct btrfs_fs_info *fs_info = inode->root->fs_info;
> struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
> @@ -5786,6 +5794,10 @@ void btrfs_inode_rsv_release(struct btrfs_inode *inode)
> if (released > 0)
> trace_btrfs_space_reservation(fs_info, "delalloc",
> btrfs_ino(inode), released, 0);
> + if (qgroup_free)
> + btrfs_qgroup_free_meta_prealloc(inode->root, released);
> + else
> + btrfs_qgroup_convert_reserved_meta(inode->root, released);
> }
>
> void btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
> @@ -6045,7 +6057,6 @@ static void btrfs_calculate_inode_block_rsv_size(struct btrfs_fs_info *fs_info,
> int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes)
> {
> struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
> - struct btrfs_root *root = inode->root;
> unsigned nr_extents;
> enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL;
> int ret = 0;
> @@ -6083,19 +6094,9 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes)
> btrfs_calculate_inode_block_rsv_size(fs_info, inode);
> spin_unlock(&inode->lock);
>
> - if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) {
> - ret = btrfs_qgroup_reserve_meta_prealloc(root,
> - nr_extents * fs_info->nodesize, true);
> - if (ret)
> - goto out_fail;
> - }
> -
> ret = btrfs_inode_rsv_refill(inode, flush);
> - if (unlikely(ret)) {
> - btrfs_qgroup_free_meta_prealloc(root,
> - nr_extents * fs_info->nodesize);
> + if (unlikely(ret))
> goto out_fail;
> - }
>
> if (delalloc_lock)
> mutex_unlock(&inode->delalloc_mutex);
> @@ -6109,7 +6110,7 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes)
> btrfs_calculate_inode_block_rsv_size(fs_info, inode);
> spin_unlock(&inode->lock);
>
> - btrfs_inode_rsv_release(inode);
> + btrfs_inode_rsv_release(inode, true);
> if (delalloc_lock)
> mutex_unlock(&inode->delalloc_mutex);
> return ret;
> @@ -6119,12 +6120,14 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes)
> * btrfs_delalloc_release_metadata - release a metadata reservation for an inode
> * @inode: the inode to release the reservation for.
> * @num_bytes: the number of bytes we are releasing.
> + * @qgroup_free: free qgroup reservation or convert it to per-trans reservation
> *
> * This will release the metadata reservation for an inode. This can be called
> * once we complete IO for a given set of bytes to release their metadata
> * reservations, or on error for the same reason.
> */
> -void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes)
> +void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes,
> + bool qgroup_free)
> {
> struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
>
> @@ -6137,13 +6140,14 @@ void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes)
> if (btrfs_is_testing(fs_info))
> return;
>
> - btrfs_inode_rsv_release(inode);
> + btrfs_inode_rsv_release(inode, qgroup_free);
> }
>
> /**
> * btrfs_delalloc_release_extents - release our outstanding_extents
> * @inode: the inode to balance the reservation for.
> * @num_bytes: the number of bytes we originally reserved with
> + * @qgroup_free: do we need to free qgroup meta reservation or convert them.
> *
> * When we reserve space we increase outstanding_extents for the extents we may
> * add. Once we've set the range as delalloc or created our ordered extents we
> @@ -6151,7 +6155,8 @@ void btrfs_delalloc_release_metadata(struct btrfs_inode *inode, u64 num_bytes)
> * temporarily tracked outstanding_extents. This _must_ be used in conjunction
> * with btrfs_delalloc_reserve_metadata.
> */
> -void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes)
> +void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes,
> + bool qgroup_free)
> {
> struct btrfs_fs_info *fs_info = btrfs_sb(inode->vfs_inode.i_sb);
> unsigned num_extents;
> @@ -6165,7 +6170,7 @@ void btrfs_delalloc_release_extents(struct btrfs_inode *inode, u64 num_bytes)
> if (btrfs_is_testing(fs_info))
> return;
>
> - btrfs_inode_rsv_release(inode);
> + btrfs_inode_rsv_release(inode, qgroup_free);
> }
>
> /**
> @@ -6221,9 +6226,9 @@ int btrfs_delalloc_reserve_space(struct inode *inode,
> */
> void btrfs_delalloc_release_space(struct inode *inode,
> struct extent_changeset *reserved,
> - u64 start, u64 len)
> + u64 start, u64 len, bool qgroup_free)
> {
> - btrfs_delalloc_release_metadata(BTRFS_I(inode), len);
> + btrfs_delalloc_release_metadata(BTRFS_I(inode), len, qgroup_free);
> btrfs_free_reserved_data_space(inode, reserved, start, len);
> }
>
> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
> index eb1bac7c8553..3bf186746119 100644
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -1690,7 +1690,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> force_page_uptodate);
> if (ret) {
> btrfs_delalloc_release_extents(BTRFS_I(inode),
> - reserve_bytes);
> + reserve_bytes, true);
> break;
> }
>
> @@ -1702,7 +1702,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> if (extents_locked == -EAGAIN)
> goto again;
> btrfs_delalloc_release_extents(BTRFS_I(inode),
> - reserve_bytes);
> + reserve_bytes, true);
> ret = extents_locked;
> break;
> }
> @@ -1737,7 +1737,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> fs_info->sb->s_blocksize_bits;
> if (only_release_metadata) {
> btrfs_delalloc_release_metadata(BTRFS_I(inode),
> - release_bytes);
> + release_bytes, true);
> } else {
> u64 __pos;
>
> @@ -1746,7 +1746,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> (dirty_pages << PAGE_SHIFT);
> btrfs_delalloc_release_space(inode,
> data_reserved, __pos,
> - release_bytes);
> + release_bytes, true);
> }
> }
>
> @@ -1760,7 +1760,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> unlock_extent_cached(&BTRFS_I(inode)->io_tree,
> lockstart, lockend, &cached_state,
> GFP_NOFS);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), reserve_bytes);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), reserve_bytes,
> + true);
> if (ret) {
> btrfs_drop_pages(pages, num_pages);
> break;
> @@ -1800,11 +1801,11 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
> if (only_release_metadata) {
> btrfs_end_write_no_snapshotting(root);
> btrfs_delalloc_release_metadata(BTRFS_I(inode),
> - release_bytes);
> + release_bytes, true);
> } else {
> btrfs_delalloc_release_space(inode, data_reserved,
> round_down(pos, fs_info->sectorsize),
> - release_bytes);
> + release_bytes, true);
> }
> }
>
> diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
> index 4426d1c73e50..fbd831044a1d 100644
> --- a/fs/btrfs/free-space-cache.c
> +++ b/fs/btrfs/free-space-cache.c
> @@ -3548,7 +3548,7 @@ int btrfs_write_out_ino_cache(struct btrfs_root *root,
> if (ret) {
> if (release_metadata)
> btrfs_delalloc_release_metadata(BTRFS_I(inode),
> - inode->i_size);
> + inode->i_size, true);
> #ifdef DEBUG
> btrfs_err(fs_info,
> "failed to write free ino cache for root %llu",
> diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c
> index 022b19336fee..9409dcc7020d 100644
> --- a/fs/btrfs/inode-map.c
> +++ b/fs/btrfs/inode-map.c
> @@ -500,12 +500,12 @@ int btrfs_save_ino_cache(struct btrfs_root *root,
> ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, prealloc,
> prealloc, prealloc, &alloc_hint);
> if (ret) {
> - btrfs_delalloc_release_extents(BTRFS_I(inode), prealloc);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), prealloc, true);
> goto out_put;
> }
>
> ret = btrfs_write_out_ino_cache(root, trans, path, inode);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), prealloc);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), prealloc, false);
> out_put:
> iput(inode);
> out_release:
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index e1a7f3cb5be9..76a1b4819607 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -1839,7 +1839,7 @@ static void btrfs_clear_bit_hook(void *private_data,
> */
> if (*bits & EXTENT_CLEAR_META_RESV &&
> root != fs_info->tree_root)
> - btrfs_delalloc_release_metadata(inode, len);
> + btrfs_delalloc_release_metadata(inode, len, false);
>
> /* For sanity tests. */
> if (btrfs_is_testing(fs_info))
> @@ -2102,7 +2102,7 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work)
> 0);
> ClearPageChecked(page);
> set_page_dirty(page);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, false);
> out:
> unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end,
> &cached_state, GFP_NOFS);
> @@ -4760,8 +4760,8 @@ int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len,
> page = find_or_create_page(mapping, index, mask);
> if (!page) {
> btrfs_delalloc_release_space(inode, data_reserved,
> - block_start, blocksize);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), blocksize);
> + block_start, blocksize, true);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), blocksize, true);
> ret = -ENOMEM;
> goto out;
> }
> @@ -4829,8 +4829,8 @@ int btrfs_truncate_block(struct inode *inode, loff_t from, loff_t len,
> out_unlock:
> if (ret)
> btrfs_delalloc_release_space(inode, data_reserved, block_start,
> - blocksize);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), blocksize);
> + blocksize, true);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), blocksize, (ret != 0));
> unlock_page(page);
> put_page(page);
> out:
> @@ -8814,7 +8814,7 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
> if (ret < 0 && ret != -EIOCBQUEUED) {
> if (dio_data.reserve)
> btrfs_delalloc_release_space(inode, data_reserved,
> - offset, dio_data.reserve);
> + offset, dio_data.reserve, true);
> /*
> * On error we might have left some ordered extents
> * without submitting corresponding bios for them, so
> @@ -8830,8 +8830,8 @@ static ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
> false);
> } else if (ret >= 0 && (size_t)ret < count)
> btrfs_delalloc_release_space(inode, data_reserved,
> - offset, count - (size_t)ret);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), count);
> + offset, count - (size_t)ret, true);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), count, false);
> }
> out:
> if (wakeup)
> @@ -9150,7 +9150,8 @@ int btrfs_page_mkwrite(struct vm_fault *vmf)
> if (reserved_space < PAGE_SIZE) {
> end = page_start + reserved_space - 1;
> btrfs_delalloc_release_space(inode, data_reserved,
> - page_start, PAGE_SIZE - reserved_space);
> + page_start, PAGE_SIZE - reserved_space,
> + true);
> }
> }
>
> @@ -9200,16 +9201,16 @@ int btrfs_page_mkwrite(struct vm_fault *vmf)
>
> out_unlock:
> if (!ret) {
> - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true);
> sb_end_pagefault(inode->i_sb);
> extent_changeset_free(data_reserved);
> return VM_FAULT_LOCKED;
> }
> unlock_page(page);
> out:
> - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, (ret != 0));
> btrfs_delalloc_release_space(inode, data_reserved, page_start,
> - reserved_space);
> + reserved_space, (ret != 0));
> out_noreserve:
> sb_end_pagefault(inode->i_sb);
> extent_changeset_free(data_reserved);
> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
> index 2ef8acaac688..9c46b89de591 100644
> --- a/fs/btrfs/ioctl.c
> +++ b/fs/btrfs/ioctl.c
> @@ -1198,7 +1198,7 @@ static int cluster_pages_for_defrag(struct inode *inode,
> spin_unlock(&BTRFS_I(inode)->lock);
> btrfs_delalloc_release_space(inode, data_reserved,
> start_index << PAGE_SHIFT,
> - (page_cnt - i_done) << PAGE_SHIFT);
> + (page_cnt - i_done) << PAGE_SHIFT, true);
> }
>
>
> @@ -1217,7 +1217,8 @@ static int cluster_pages_for_defrag(struct inode *inode,
> unlock_page(pages[i]);
> put_page(pages[i]);
> }
> - btrfs_delalloc_release_extents(BTRFS_I(inode), page_cnt << PAGE_SHIFT);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), page_cnt << PAGE_SHIFT,
> + false);
> extent_changeset_free(data_reserved);
> return i_done;
> out:
> @@ -1227,8 +1228,9 @@ static int cluster_pages_for_defrag(struct inode *inode,
> }
> btrfs_delalloc_release_space(inode, data_reserved,
> start_index << PAGE_SHIFT,
> - page_cnt << PAGE_SHIFT);
> - btrfs_delalloc_release_extents(BTRFS_I(inode), page_cnt << PAGE_SHIFT);
> + page_cnt << PAGE_SHIFT, true);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), page_cnt << PAGE_SHIFT,
> + true);
> extent_changeset_free(data_reserved);
> return ret;
>
> diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
> index 5b311aeddcc8..c6f5f7e274a5 100644
> --- a/fs/btrfs/ordered-data.c
> +++ b/fs/btrfs/ordered-data.c
> @@ -610,7 +610,7 @@ void btrfs_remove_ordered_extent(struct inode *inode,
> btrfs_mod_outstanding_extents(btrfs_inode, -1);
> spin_unlock(&btrfs_inode->lock);
> if (root != fs_info->tree_root)
> - btrfs_delalloc_release_metadata(btrfs_inode, entry->len);
> + btrfs_delalloc_release_metadata(btrfs_inode, entry->len, false);
>
> tree = &btrfs_inode->ordered_tree;
> spin_lock_irq(&tree->lock);
> diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> index f0c3f00e97cb..632129024c5f 100644
> --- a/fs/btrfs/relocation.c
> +++ b/fs/btrfs/relocation.c
> @@ -3226,7 +3226,7 @@ static int relocate_file_extent_cluster(struct inode *inode,
> mask);
> if (!page) {
> btrfs_delalloc_release_metadata(BTRFS_I(inode),
> - PAGE_SIZE);
> + PAGE_SIZE, true);
> ret = -ENOMEM;
> goto out;
> }
> @@ -3245,9 +3245,9 @@ static int relocate_file_extent_cluster(struct inode *inode,
> unlock_page(page);
> put_page(page);
> btrfs_delalloc_release_metadata(BTRFS_I(inode),
> - PAGE_SIZE);
> + PAGE_SIZE, true);
> btrfs_delalloc_release_extents(BTRFS_I(inode),
> - PAGE_SIZE);
> + PAGE_SIZE, true);
> ret = -EIO;
> goto out;
> }
> @@ -3278,7 +3278,8 @@ static int relocate_file_extent_cluster(struct inode *inode,
> put_page(page);
>
> index++;
> - btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE);
> + btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE,
> + false);
> balance_dirty_pages_ratelimited(inode->i_mapping);
> btrfs_throttle(fs_info);
> }
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 520 bytes --]
next prev parent reply other threads:[~2017-12-26 5:40 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-22 6:18 [PATCH v2 00/10] Use split qgroup rsv type Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 01/10] btrfs: qgroup: Split meta rsv type into meta_prealloc and meta_pertrans Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 02/10] btrfs: qgroup: Don't use root->qgroup_meta_rsv for qgroup Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 03/10] btrfs: qgroup: Introduce function to convert META_PREALLOC into META_PERTRANS Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 04/10] btrfs: qgroup: Use separate meta reservation type for delalloc Qu Wenruo
2017-12-26 5:37 ` [PATCH v2.2 " Qu Wenruo
2017-12-26 5:40 ` Qu Wenruo [this message]
2017-12-26 7:10 ` Lakshmipathi.G
2017-12-22 6:18 ` [PATCH v2 05/10] btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 06/10] btrfs: qgroup: Use root->qgroup_meta_rsv_* to record qgroup meta reserved space Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 07/10] btrfs: qgroup: Update trace events for metadata reservation Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 08/10] Revert "btrfs: qgroups: Retry after commit on getting EDQUOT" Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 09/10] btrfs: qgroup: Commit transaction in advance to reduce early EDQUOT Qu Wenruo
2017-12-22 8:06 ` [PATCH v2.1 " Qu Wenruo
2017-12-22 6:18 ` [PATCH v2 10/10] btrfs: qgroup: Use independent and accurate per inode qgroup rsv Qu Wenruo
2018-02-22 22:44 ` Jeff Mahoney
2018-02-22 23:34 ` Qu Wenruo
2018-02-23 8:14 ` Nikolay Borisov
2018-02-23 9:06 ` Qu Wenruo
2018-02-23 11:00 ` Nikolay Borisov
2018-02-23 11:22 ` Qu Wenruo
2018-02-23 14:43 ` Jeff Mahoney
2018-04-03 7:30 ` Qu Wenruo
2018-04-04 8:53 ` Nikolay Borisov
2018-04-04 12:17 ` Qu Wenruo
2018-04-12 0:03 ` Omar Sandoval
2018-04-12 12:46 ` David Sterba
2018-04-12 13:13 ` David Sterba
2018-04-16 7:53 ` Misono Tomohiro
2018-04-16 17:27 ` David Sterba
2018-04-17 0:14 ` Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b70cd6d9-c1e6-29f1-a96f-711edeb37261@gmx.com \
--to=quwenruo.btrfs@gmx.com \
--cc=dsterba@suse.cz \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).