btrfs: Fix an error handling path in btrfs_defrag_leaves()

Message ID 9a1d857866d4768090d7f89869076b7a5a85116b.1670875295.git.christophe.jaillet@wanadoo.fr
State New
Headers
Series btrfs: Fix an error handling path in btrfs_defrag_leaves() |

Commit Message

Christophe JAILLET Dec. 12, 2022, 8:01 p.m. UTC
  All error handling paths end to 'out', except this memory allocation
failure.

This is spurious. So branch to the error handling path also in this case.
It will add a call to:
	memset(&root->defrag_progress, 0,
	       sizeof(root->defrag_progress));

Fixes: 6702ed490ca0 ("Btrfs: Add run time btree defrag, and an ioctl to force btree defrag")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
This patch is completely speculative.

Review with care !
---
 fs/btrfs/defrag.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
  

Comments

David Sterba Dec. 13, 2022, 6:45 p.m. UTC | #1
On Mon, Dec 12, 2022 at 09:01:43PM +0100, Christophe JAILLET wrote:
> All error handling paths end to 'out', except this memory allocation
> failure.
> 
> This is spurious. So branch to the error handling path also in this case.
> It will add a call to:
> 	memset(&root->defrag_progress, 0,
> 	       sizeof(root->defrag_progress));
> 
> Fixes: 6702ed490ca0 ("Btrfs: Add run time btree defrag, and an ioctl to force btree defrag")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> ---
> This patch is completely speculative.
> 
> Review with care !

I think it's correct, using goto for cleanup is for consistency and the
memset is not necessary on error paths but again for consistency with
what other types of errors in the functions lead to. Added to misc-next,
thanks.
  

Patch

diff --git a/fs/btrfs/defrag.c b/fs/btrfs/defrag.c
index 0a3c261b69c9..d81b764a7644 100644
--- a/fs/btrfs/defrag.c
+++ b/fs/btrfs/defrag.c
@@ -358,8 +358,10 @@  int btrfs_defrag_leaves(struct btrfs_trans_handle *trans,
 		goto out;
 
 	path = btrfs_alloc_path();
-	if (!path)
-		return -ENOMEM;
+	if (!path) {
+		ret = -ENOMEM;
+		goto out;
+	}
 
 	level = btrfs_header_level(root->node);