Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 952bd3db authored by Nikolay Borisov's avatar Nikolay Borisov Committed by David Sterba
Browse files

btrfs: Ignore errors from btrfs_qgroup_trace_extent_post



Running generic/019 with qgroups on the scratch device enabled is almost
guaranteed to trigger the BUG_ON in btrfs_free_tree_block. It's supposed
to trigger only on -ENOMEM, in reality, however, it's possible to get
-EIO from btrfs_qgroup_trace_extent_post. This function just finds the
roots of the extent being tracked and sets the qrecord->old_roots list.
If this operation fails nothing critical happens except the quota
accounting can be considered wrong. In such case just set the
INCONSISTENT flag for the quota and print a warning, rather than killing
off the system. Additionally, it's possible to trigger a BUG_ON in
btrfs_truncate_inode_items as well.

Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
[ error message adjustments ]
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 900c9981
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -821,7 +821,8 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
	spin_unlock(&delayed_refs->lock);

	if (qrecord_inserted)
		return btrfs_qgroup_trace_extent_post(fs_info, record);
		btrfs_qgroup_trace_extent_post(fs_info, record);

	return 0;

free_head_ref:
+7 −2
Original line number Diff line number Diff line
@@ -1442,8 +1442,13 @@ int btrfs_qgroup_trace_extent_post(struct btrfs_fs_info *fs_info,
	int ret;

	ret = btrfs_find_all_roots(NULL, fs_info, bytenr, 0, &old_root, false);
	if (ret < 0)
		return ret;
	if (ret < 0) {
		fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
		btrfs_warn(fs_info,
"error accounting new delayed refs extent (err code: %d), quota inconsistent",
			ret);
		return 0;
	}

	/*
	 * Here we don't need to get the lock of