Message ID | 33736c36355cd1d902b9f2ccc65d5f6fc13c5e56.1686164806.git.fdmanana@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: some fixes and updates around handling errors for tree mod log operations | expand |
On 2023/6/8 03:24, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > At __btrfs_cow_block(), instead of doing a BUG_ON() in case we fail to > record a tree mod log root insertion operation, do a transaction abort > instead. There's really no need for the BUG_ON(), we can properly > release all resources in this context and turn the filesystem to RO mode > and in an error state instead. > > Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > --- > fs/btrfs/ctree.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c > index 8496535828de..d6c29564ce49 100644 > --- a/fs/btrfs/ctree.c > +++ b/fs/btrfs/ctree.c > @@ -584,9 +584,14 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, > btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV) > parent_start = buf->start; > > - atomic_inc(&cow->refs); > ret = btrfs_tree_mod_log_insert_root(root->node, cow, true); > - BUG_ON(ret < 0); > + if (ret < 0) { > + btrfs_tree_unlock(cow); > + free_extent_buffer(cow); > + btrfs_abort_transaction(trans, ret); > + return ret; > + } > + atomic_inc(&cow->refs); > rcu_assign_pointer(root->node, cow); > > btrfs_free_tree_block(trans, btrfs_root_id(root), buf,
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 8496535828de..d6c29564ce49 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -584,9 +584,14 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV) parent_start = buf->start; - atomic_inc(&cow->refs); ret = btrfs_tree_mod_log_insert_root(root->node, cow, true); - BUG_ON(ret < 0); + if (ret < 0) { + btrfs_tree_unlock(cow); + free_extent_buffer(cow); + btrfs_abort_transaction(trans, ret); + return ret; + } + atomic_inc(&cow->refs); rcu_assign_pointer(root->node, cow); btrfs_free_tree_block(trans, btrfs_root_id(root), buf,