diff mbox series

btrfs: fix transaction handle leak after verity rollback failure

Message ID b390e518f2091df52fd314806cce52fd00a19a00.1631114872.git.fdmanana@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: fix transaction handle leak after verity rollback failure | expand

Commit Message

Filipe Manana Sept. 8, 2021, 3:29 p.m. UTC
From: Filipe Manana <fdmanana@suse.com>

During a verity rollback, if we fail to update the inode or delete the
orphan, we abort the transaction and return without releasing our
transaction handle. Fix that by releasing the handle.

Fixes: 146054090b0859 ("btrfs: initial fsverity support")
Fixes: 705242538ff348 ("btrfs: verity metadata orphan items")
Signed-off-by: Filipe Manana <fdmanana@suse.com>
---
 fs/btrfs/verity.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Boris Burkov Sept. 8, 2021, 5:12 p.m. UTC | #1
On Wed, Sep 08, 2021 at 04:29:26PM +0100, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> During a verity rollback, if we fail to update the inode or delete the
> orphan, we abort the transaction and return without releasing our
> transaction handle. Fix that by releasing the handle.
> 
> Fixes: 146054090b0859 ("btrfs: initial fsverity support")
> Fixes: 705242538ff348 ("btrfs: verity metadata orphan items")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>
Oops, I thoughtlessly assumed abort also released the handle. Thank you
for the fix!
Reviewed-by: Boris Burkov <boris@bur.io>
> ---
>  fs/btrfs/verity.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/btrfs/verity.c b/fs/btrfs/verity.c
> index 28d443d3ef93..4968535dfff0 100644
> --- a/fs/btrfs/verity.c
> +++ b/fs/btrfs/verity.c
> @@ -451,7 +451,7 @@ static int del_orphan(struct btrfs_trans_handle *trans, struct btrfs_inode *inod
>   */
>  static int rollback_verity(struct btrfs_inode *inode)
>  {
> -	struct btrfs_trans_handle *trans;
> +	struct btrfs_trans_handle *trans = NULL;
>  	struct btrfs_root *root = inode->root;
>  	int ret;
>  
> @@ -473,6 +473,7 @@ static int rollback_verity(struct btrfs_inode *inode)
>  	trans = btrfs_start_transaction(root, 2);
>  	if (IS_ERR(trans)) {
>  		ret = PTR_ERR(trans);
> +		trans = NULL;
>  		btrfs_handle_fs_error(root->fs_info, ret,
>  			"failed to start transaction in verity rollback %llu",
>  			(u64)inode->vfs_inode.i_ino);
> @@ -490,8 +491,9 @@ static int rollback_verity(struct btrfs_inode *inode)
>  		btrfs_abort_transaction(trans, ret);
>  		goto out;
>  	}
> -	btrfs_end_transaction(trans);
>  out:
> +	if (trans)
> +		btrfs_end_transaction(trans);
>  	return ret;
>  }
>  
> -- 
> 2.33.0
>
David Sterba Sept. 9, 2021, 3:28 p.m. UTC | #2
On Wed, Sep 08, 2021 at 04:29:26PM +0100, fdmanana@kernel.org wrote:
> From: Filipe Manana <fdmanana@suse.com>
> 
> During a verity rollback, if we fail to update the inode or delete the
> orphan, we abort the transaction and return without releasing our
> transaction handle. Fix that by releasing the handle.
> 
> Fixes: 146054090b0859 ("btrfs: initial fsverity support")
> Fixes: 705242538ff348 ("btrfs: verity metadata orphan items")
> Signed-off-by: Filipe Manana <fdmanana@suse.com>

Added to misc-next, thanks.
diff mbox series

Patch

diff --git a/fs/btrfs/verity.c b/fs/btrfs/verity.c
index 28d443d3ef93..4968535dfff0 100644
--- a/fs/btrfs/verity.c
+++ b/fs/btrfs/verity.c
@@ -451,7 +451,7 @@  static int del_orphan(struct btrfs_trans_handle *trans, struct btrfs_inode *inod
  */
 static int rollback_verity(struct btrfs_inode *inode)
 {
-	struct btrfs_trans_handle *trans;
+	struct btrfs_trans_handle *trans = NULL;
 	struct btrfs_root *root = inode->root;
 	int ret;
 
@@ -473,6 +473,7 @@  static int rollback_verity(struct btrfs_inode *inode)
 	trans = btrfs_start_transaction(root, 2);
 	if (IS_ERR(trans)) {
 		ret = PTR_ERR(trans);
+		trans = NULL;
 		btrfs_handle_fs_error(root->fs_info, ret,
 			"failed to start transaction in verity rollback %llu",
 			(u64)inode->vfs_inode.i_ino);
@@ -490,8 +491,9 @@  static int rollback_verity(struct btrfs_inode *inode)
 		btrfs_abort_transaction(trans, ret);
 		goto out;
 	}
-	btrfs_end_transaction(trans);
 out:
+	if (trans)
+		btrfs_end_transaction(trans);
 	return ret;
 }