Commit c0bd736d authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

xfs: fixup the metabtree reservation in xrep_reap_metadir_fsblocks



All callers of xrep_reap_metadir_fsblocks need to fix up the metabtree
reservation, otherwise they'd leave the reservations in an incoherent
state.  Move the call to xrep_reset_metafile_resv into
xrep_reap_metadir_fsblocks so it always is taken care of, and remove
now superfluous helper functions in the callers.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
parent a0760cca
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -935,10 +935,13 @@ xrep_reap_metadir_fsblocks(
	if (error)
		return error;

	if (xreap_dirty(&rs))
		return xrep_defer_finish(sc);
	if (xreap_dirty(&rs)) {
		error = xrep_defer_finish(sc);
		if (error)
			return error;
	}

	return 0;
	return xrep_reset_metafile_resv(sc);
}

/*
+6 −28
Original line number Diff line number Diff line
@@ -697,32 +697,6 @@ xrep_rtrefc_build_new_tree(
	return error;
}

/*
 * Now that we've logged the roots of the new btrees, invalidate all of the
 * old blocks and free them.
 */
STATIC int
xrep_rtrefc_remove_old_tree(
	struct xrep_rtrefc	*rr)
{
	int			error;

	/*
	 * Free all the extents that were allocated to the former rtrefcountbt
	 * and aren't cross-linked with something else.
	 */
	error = xrep_reap_metadir_fsblocks(rr->sc,
			&rr->old_rtrefcountbt_blocks);
	if (error)
		return error;

	/*
	 * Ensure the proper reservation for the rtrefcount inode so that we
	 * don't fail to expand the btree.
	 */
	return xrep_reset_metafile_resv(rr->sc);
}

/* Rebuild the rt refcount btree. */
int
xrep_rtrefcountbt(
@@ -769,8 +743,12 @@ xrep_rtrefcountbt(
	if (error)
		goto out_bitmap;

	/* Kill the old tree. */
	error = xrep_rtrefc_remove_old_tree(rr);
	/*
	 * Free all the extents that were allocated to the former rtrefcountbt
	 * and aren't cross-linked with something else.
	 */
	error = xrep_reap_metadir_fsblocks(rr->sc,
			&rr->old_rtrefcountbt_blocks);
	if (error)
		goto out_bitmap;

+5 −24
Original line number Diff line number Diff line
@@ -810,28 +810,6 @@ xrep_rtrmap_build_new_tree(

/* Reaping the old btree. */

/* Reap the old rtrmapbt blocks. */
STATIC int
xrep_rtrmap_remove_old_tree(
	struct xrep_rtrmap	*rr)
{
	int			error;

	/*
	 * Free all the extents that were allocated to the former rtrmapbt and
	 * aren't cross-linked with something else.
	 */
	error = xrep_reap_metadir_fsblocks(rr->sc, &rr->old_rtrmapbt_blocks);
	if (error)
		return error;

	/*
	 * Ensure the proper reservation for the rtrmap inode so that we don't
	 * fail to expand the new btree.
	 */
	return xrep_reset_metafile_resv(rr->sc);
}

static inline bool
xrep_rtrmapbt_want_live_update(
	struct xchk_iscan		*iscan,
@@ -995,8 +973,11 @@ xrep_rtrmapbt(
	if (error)
		goto out_records;

	/* Kill the old tree. */
	error = xrep_rtrmap_remove_old_tree(rr);
	/*
	 * Free all the extents that were allocated to the former rtrmapbt and
	 * aren't cross-linked with something else.
	 */
	error = xrep_reap_metadir_fsblocks(rr->sc, &rr->old_rtrmapbt_blocks);
	if (error)
		goto out_records;