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

Commit 6f97077f authored by Darrick J. Wong's avatar Darrick J. Wong Committed by Dave Chinner
Browse files

xfs: rework refcount cow recovery error handling



The error handling in xfs_refcount_recover_cow_leftovers is confused
and can potentially leak memory, so rework it to release resources
correctly on error.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reported-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 1987fd74
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -1643,7 +1643,7 @@ xfs_refcount_recover_cow_leftovers(
	error = xfs_btree_query_range(cur, &low, &high,
			xfs_refcount_recover_extent, &debris);
	if (error)
		goto out_error;
		goto out_cursor;
	xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
	xfs_buf_relse(agbp);

@@ -1675,14 +1675,8 @@ xfs_refcount_recover_cow_leftovers(

		error = xfs_trans_commit(tp);
		if (error)
			goto out_cancel;
	}
			goto out_free;

out_defer:
	xfs_defer_cancel(&dfops);
out_cancel:
	xfs_trans_cancel(tp);
	}

out_free:
	/* Free the leftover list */
@@ -1690,11 +1684,15 @@ xfs_refcount_recover_cow_leftovers(
		list_del(&rr->rr_list);
		kmem_free(rr);
	}

	return error;

out_error:
out_cursor:
	xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
	xfs_buf_relse(agbp);
	return error;
	goto out_free;

out_defer:
	xfs_defer_cancel(&dfops);
	xfs_trans_cancel(tp);
	goto out_free;
}