On 2019/5/10 下午12:45, Qu Wenruo wrote: > Commit ddf30cf03fb5 ("btrfs: extent-tree: Use btrfs_ref to refactor > add_pinned_bytes()") refactored add_pinned_bytes(), but during that > refactor, there are two callers which add the pinned bytes instead > of subtracting. > > That refactor misses those two caller, causing incorrect pinned bytes > calculation and resulting unexpected ENOSPC error. > > Fix it by adding a new parameter @sign to restore the original behavior. > > Reported-by: kernel test robot <rong.a.c...@intel.com> > Fixes: ddf30cf03fb5 ("btrfs: extent-tree: Use btrfs_ref to refactor > add_pinned_bytes()")
Gentle ping. This patch is needed to fix generic/108 and should reach current rc. Thanks, Qu > Signed-off-by: Qu Wenruo <w...@suse.com> > --- > fs/btrfs/extent-tree.c | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index f79e477a378e..8592d31e321c 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -757,12 +757,14 @@ static struct btrfs_space_info > *__find_space_info(struct btrfs_fs_info *info, > } > > static void add_pinned_bytes(struct btrfs_fs_info *fs_info, > - struct btrfs_ref *ref) > + struct btrfs_ref *ref, int sign) > { > struct btrfs_space_info *space_info; > - s64 num_bytes = -ref->len; > + s64 num_bytes; > u64 flags; > > + ASSERT(sign == 1 || sign == -1); > + num_bytes = sign * ref->len; > if (ref->type == BTRFS_REF_METADATA) { > if (ref->tree_ref.root == BTRFS_CHUNK_TREE_OBJECTID) > flags = BTRFS_BLOCK_GROUP_SYSTEM; > @@ -2063,7 +2065,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle > *trans, > btrfs_ref_tree_mod(fs_info, generic_ref); > > if (ret == 0 && old_ref_mod < 0 && new_ref_mod >= 0) > - add_pinned_bytes(fs_info, generic_ref); > + add_pinned_bytes(fs_info, generic_ref, -1); > > return ret; > } > @@ -7190,7 +7192,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle > *trans, > } > out: > if (pin) > - add_pinned_bytes(fs_info, &generic_ref); > + add_pinned_bytes(fs_info, &generic_ref, 1); > > if (last_ref) { > /* > @@ -7238,7 +7240,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, > struct btrfs_ref *ref) > btrfs_ref_tree_mod(fs_info, ref); > > if (ret == 0 && old_ref_mod >= 0 && new_ref_mod < 0) > - add_pinned_bytes(fs_info, ref); > + add_pinned_bytes(fs_info, ref, 1); > > return ret; > } >
signature.asc
Description: OpenPGP digital signature