On Fri, Sep 28, 2018 at 07:17:46AM -0400, Josef Bacik wrote: > may_commit_transaction will skip committing the transaction if we don't > have enough pinned space or if we're trying to find space for a SYSTEM > chunk. However if we have pending free block groups in this transaction > we still want to commit as we may be able to allocate a chunk to make > our reservation. So instead of just returning ENOSPC, check if we have > free block groups pending, and if so commit the transaction to allow us > to use that free space. > > Signed-off-by: Josef Bacik <jo...@toxicpanda.com> > Reviewed-by: Omar Sandoval <osan...@fb.com> > --- > fs/btrfs/extent-tree.c | 33 +++++++++++++++++++-------------- > 1 file changed, 19 insertions(+), 14 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 1213f573eea2..da73b3e5bc39 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -4830,10 +4830,18 @@ static int may_commit_transaction(struct > btrfs_fs_info *fs_info, > if (!bytes) > return 0; > > - /* See if there is enough pinned space to make this reservation */ > - if (__percpu_counter_compare(&space_info->total_bytes_pinned, > - bytes, > - BTRFS_TOTAL_BYTES_PINNED_BATCH) >= 0) > + trans = btrfs_join_transaction(fs_info->extent_root); > + if (IS_ERR(trans)) > + return -ENOSPC;
Why do you set override the error to ENOSPC, instead of passing PTR_ERR(trans)? There are more reasons why btrfs_join_transaction could fail: EROFS after error, EDQUOT when quotas say no, ENOMEM from ulist_add, that's just a sample I quickly found.