for-6.14-rc1-tag
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE8rQSAMVO+zA4DBdWxWXV+ddtWDsFAmejbmkACgkQxWXV+ddt WDuXuQ/8DETuhqww7hwrDgHyDHRgj/783Oy1+V/jJPQZ1hpjAbSJBU7aKxneAMMc Gj4ExbDfjd8kRAvsE71/1McJqVBd6CiuBG/k65vjqVS4lM8mEasVefCa4OsOR3iB gGzQeNbrDzIs3IOg8hM1l1iPDkI/AyOyeysD/qNMdWO4mcKEMwrBYkQJhL6+DzfE BKVP+NAdK4iv/W/EngAqvcd7mq2RdxeR9nBesHnKTzPCVFf6bBT3b3Qem/ovY6Td ZNQLjx9GXumDj0jSiyRI5rxjSYOrqSU4JV+1C7ghOwBj2uD2SZxAvghuRSuUTKnN 9/9x1RNO7i+FE3GHzYWShhHkNuuLZspmi2J1neSttQ5Jy/PFJR/tUAED5zY6Nl0X 73GWSzLlmaJ+E77DkTJksBYmRrnwtA6plMKD4umDCHw0lNu/0GCvxtZY1T1ZiKy2 yK37Ja559+k7RPIdKoyHo81A7num4gLeBZTqd9F/XPjU26b57Qnqk1LetgGeT8xk IZFQtz9HdmvLwwbxWwNvp1ttRf+1dj1lpVnb5n6r0d8Uyta9tgQpDvwhNjluBsEx AQxK9yUZ5kAXEEbEyDwoOsZ5yjwkaMzqRpQWWappb0jCLm5dADI87odFRaOSlgWS WoXL6Vbod8G5vaEVwPDl6yuSS+609c7M8ftBlgvcx3XZ5/N6y2M= =YjCE -----END PGP SIGNATURE----- Merge tag 'for-6.14-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux Pull btrfs fixes from David Sterba: - add lockdep annotation for relocation root to fix a splat warning while merging roots - fix assertion failure when splitting ordered extent after transaction abort - don't print 'qgroup inconsistent' message when rescan process updates qgroup data sooner than the subvolume deletion process - fix use-after-free (accessing the error number) when attempting to join an aborted transaction - avoid starting new transaction if not necessary when cleaning qgroup during subvolume drop * tag 'for-6.14-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: avoid starting new transaction when cleaning qgroup during subvolume drop btrfs: fix use-after-free when attempting to join an aborted transaction btrfs: do not output error message if a qgroup has been already cleaned up btrfs: fix assertion failure when splitting ordered extent after transaction abort btrfs: fix lockdep splat while merging a relocation root
This commit is contained in:
commit
92514ef226
4 changed files with 22 additions and 7 deletions
|
@ -1496,6 +1496,7 @@ read_block_for_search(struct btrfs_root *root, struct btrfs_path *p,
|
||||||
|
|
||||||
if (!p->skip_locking) {
|
if (!p->skip_locking) {
|
||||||
btrfs_unlock_up_safe(p, parent_level + 1);
|
btrfs_unlock_up_safe(p, parent_level + 1);
|
||||||
|
btrfs_maybe_reset_lockdep_class(root, tmp);
|
||||||
tmp_locked = true;
|
tmp_locked = true;
|
||||||
btrfs_tree_read_lock(tmp);
|
btrfs_tree_read_lock(tmp);
|
||||||
btrfs_release_path(p);
|
btrfs_release_path(p);
|
||||||
|
@ -1539,6 +1540,7 @@ read_block_for_search(struct btrfs_root *root, struct btrfs_path *p,
|
||||||
|
|
||||||
if (!p->skip_locking) {
|
if (!p->skip_locking) {
|
||||||
ASSERT(ret == -EAGAIN);
|
ASSERT(ret == -EAGAIN);
|
||||||
|
btrfs_maybe_reset_lockdep_class(root, tmp);
|
||||||
tmp_locked = true;
|
tmp_locked = true;
|
||||||
btrfs_tree_read_lock(tmp);
|
btrfs_tree_read_lock(tmp);
|
||||||
btrfs_release_path(p);
|
btrfs_release_path(p);
|
||||||
|
|
|
@ -1229,6 +1229,18 @@ struct btrfs_ordered_extent *btrfs_split_ordered_extent(
|
||||||
*/
|
*/
|
||||||
if (WARN_ON_ONCE(len >= ordered->num_bytes))
|
if (WARN_ON_ONCE(len >= ordered->num_bytes))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
/*
|
||||||
|
* If our ordered extent had an error there's no point in continuing.
|
||||||
|
* The error may have come from a transaction abort done either by this
|
||||||
|
* task or some other concurrent task, and the transaction abort path
|
||||||
|
* iterates over all existing ordered extents and sets the flag
|
||||||
|
* BTRFS_ORDERED_IOERR on them.
|
||||||
|
*/
|
||||||
|
if (unlikely(flags & (1U << BTRFS_ORDERED_IOERR))) {
|
||||||
|
const int fs_error = BTRFS_FS_ERROR(fs_info);
|
||||||
|
|
||||||
|
return fs_error ? ERR_PTR(fs_error) : ERR_PTR(-EIO);
|
||||||
|
}
|
||||||
/* We cannot split partially completed ordered extents. */
|
/* We cannot split partially completed ordered extents. */
|
||||||
if (ordered->bytes_left) {
|
if (ordered->bytes_left) {
|
||||||
ASSERT(!(flags & ~BTRFS_ORDERED_TYPE_FLAGS));
|
ASSERT(!(flags & ~BTRFS_ORDERED_TYPE_FLAGS));
|
||||||
|
|
|
@ -1880,11 +1880,7 @@ int btrfs_qgroup_cleanup_dropped_subvolume(struct btrfs_fs_info *fs_info, u64 su
|
||||||
* Commit current transaction to make sure all the rfer/excl numbers
|
* Commit current transaction to make sure all the rfer/excl numbers
|
||||||
* get updated.
|
* get updated.
|
||||||
*/
|
*/
|
||||||
trans = btrfs_start_transaction(fs_info->quota_root, 0);
|
ret = btrfs_commit_current_transaction(fs_info->quota_root);
|
||||||
if (IS_ERR(trans))
|
|
||||||
return PTR_ERR(trans);
|
|
||||||
|
|
||||||
ret = btrfs_commit_transaction(trans);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -1897,8 +1893,11 @@ int btrfs_qgroup_cleanup_dropped_subvolume(struct btrfs_fs_info *fs_info, u64 su
|
||||||
/*
|
/*
|
||||||
* It's squota and the subvolume still has numbers needed for future
|
* It's squota and the subvolume still has numbers needed for future
|
||||||
* accounting, in this case we can not delete it. Just skip it.
|
* accounting, in this case we can not delete it. Just skip it.
|
||||||
|
*
|
||||||
|
* Or the qgroup is already removed by a qgroup rescan. For both cases we're
|
||||||
|
* safe to ignore them.
|
||||||
*/
|
*/
|
||||||
if (ret == -EBUSY)
|
if (ret == -EBUSY || ret == -ENOENT)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,8 +274,10 @@ loop:
|
||||||
cur_trans = fs_info->running_transaction;
|
cur_trans = fs_info->running_transaction;
|
||||||
if (cur_trans) {
|
if (cur_trans) {
|
||||||
if (TRANS_ABORTED(cur_trans)) {
|
if (TRANS_ABORTED(cur_trans)) {
|
||||||
|
const int abort_error = cur_trans->aborted;
|
||||||
|
|
||||||
spin_unlock(&fs_info->trans_lock);
|
spin_unlock(&fs_info->trans_lock);
|
||||||
return cur_trans->aborted;
|
return abort_error;
|
||||||
}
|
}
|
||||||
if (btrfs_blocked_trans_types[cur_trans->state] & type) {
|
if (btrfs_blocked_trans_types[cur_trans->state] & type) {
|
||||||
spin_unlock(&fs_info->trans_lock);
|
spin_unlock(&fs_info->trans_lock);
|
||||||
|
|
Loading…
Add table
Reference in a new issue