Commit 53c1c822 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino
Browse files

xfs: refactor GC zone selection helpers



Merge xfs_zone_gc_ensure_target into xfs_zone_gc_select_target
to keep all zone selection code together.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHans Holmberg <hans.holmberg@wdc.com>
Reviewed-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarCarlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent ca0170a7
Loading
Loading
Loading
Loading
+22 −23
Original line number Diff line number Diff line
@@ -552,6 +552,9 @@ xfs_zone_gc_steal_open(
	return 0;
}

/*
 * Ensure we have a valid open zone to write to.
 */
static struct xfs_open_zone *
xfs_zone_gc_select_target(
	struct xfs_mount	*mp)
@@ -559,12 +562,25 @@ xfs_zone_gc_select_target(
	struct xfs_zone_info	*zi = mp->m_zone_info;
	struct xfs_open_zone	*oz = zi->zi_open_gc_zone;

	if (oz) {
		/*
		 * If we have space available, just keep using the existing
		 * zone.
		 */
		if (oz->oz_allocated < rtg_blocks(oz->oz_rtg))
			return oz;

		/*
	 * We need to wait for pending writes to finish.
		 * Wait for all writes to the current zone to finish before
		 * picking a new one.
		 */
	if (oz && oz->oz_written < rtg_blocks(oz->oz_rtg))
		if (oz->oz_written < rtg_blocks(oz->oz_rtg))
			return NULL;
	}

	/*
	 * Open a new zone when there is none currently in use.
	 */
	ASSERT(zi->zi_nr_open_zones <=
		mp->m_max_open_zones - XFS_OPEN_GC_ZONES);
	oz = xfs_open_zone(mp, WRITE_LIFE_NOT_SET, true);
@@ -576,23 +592,6 @@ xfs_zone_gc_select_target(
	return oz;
}

/*
 * Ensure we have a valid open zone to write the GC data to.
 *
 * If the current target zone has space keep writing to it, else first wait for
 * all pending writes and then pick a new one.
 */
static struct xfs_open_zone *
xfs_zone_gc_ensure_target(
	struct xfs_mount	*mp)
{
	struct xfs_open_zone	*oz = mp->m_zone_info->zi_open_gc_zone;

	if (!oz || oz->oz_allocated == rtg_blocks(oz->oz_rtg))
		return xfs_zone_gc_select_target(mp);
	return oz;
}

static void
xfs_zone_gc_end_io(
	struct bio		*bio)
@@ -615,7 +614,7 @@ xfs_zone_gc_alloc_blocks(
	struct xfs_mount	*mp = data->mp;
	struct xfs_open_zone	*oz;

	oz = xfs_zone_gc_ensure_target(mp);
	oz = xfs_zone_gc_select_target(mp);
	if (!oz)
		return NULL;

@@ -1019,7 +1018,7 @@ xfs_zone_gc_should_start_new_work(
	if (!data->scratch_available)
		return false;

	oz = xfs_zone_gc_ensure_target(data->mp);
	oz = xfs_zone_gc_select_target(data->mp);
	if (!oz || oz->oz_allocated == rtg_blocks(oz->oz_rtg))
		return false;