Patch "btrfs: handle errors while updating refcounts in update_ref_for_cow" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
btrfs: handle errors while updating refcounts in update_ref_for_cow
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
btrfs-handle-errors-while-updating-refcounts-in-update_ref_for_cow.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
692826b2738101549f032a761a9191636e83be4eMon Sep 17 00:00:00 2001
From: Jeff Mahoney <[email protected]>
Date: Tue, 21 Nov 2017 13:58:49 -0500
Subject: btrfs: handle errors while updating refcounts in update_ref_for_cow
From: Jeff Mahoney <[email protected]>
commit 692826b2738101549f032a761a9191636e83be4e upstream.
Since commit fb235dc06fa (btrfs: qgroup: Move half of the qgroup accounting time out of commit trans) the assumption that btrfs_add_delayed_{data,tree}_ref can only return 0 or -ENOMEM has been false. The qgroup operations call into btrfs_search_slot and friends and can now return the full spectrum of error codes.
Fortunately, the fix here is easy since update_ref_for_cow failing is already handled so we just need to bail early with the error code.
--- fs/btrfs/ctree.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
fs/btrfs/ctree.c +12 -6
@@ -1032,14 +1032,17 @@ static noinline int update_ref_for_cow(s root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { ret =btrfs_inc_ref (trans, root, buf,1 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret;if (root->root_key.objectid ==BTRFS_TREE_RELOC_OBJECTID ) { ret =btrfs_dec_ref (trans, root, buf,0 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret; ret =btrfs_inc_ref (trans, root, cow,1 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret; } new_flags |=BTRFS_BLOCK_FLAG_FULL_BACKREF ; } else {
@@ -1049,7 +1052,8 @@ static noinline int update_ref_for_cow(s ret =btrfs_inc_ref (trans, root, cow,1 ); else ret =btrfs_inc_ref (trans, root, cow,0 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret; }if (new_flags !=0 ) {int level =btrfs_header_level (buf);
@@ -1068,9 +1072,11 @@ static noinline int update_ref_for_cow(s ret =btrfs_inc_ref (trans, root, cow,1 ); else ret =btrfs_inc_ref (trans, root, cow,0 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret; ret =btrfs_dec_ref (trans, root, buf,1 ); -BUG_ON (ret);/* -ENOMEM */ +if (ret) +return ret; }clean_tree_block (fs_info, buf); *last_ref =1 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/btrfs-fix-missing-error-return-in-btrfs_drop_snapshot.patch queue-4.14/btrfs-handle-errors-while-updating-refcounts-in-update_ref_for_cow.patch