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

Commit 4196ac08 authored by Dave Chinner's avatar Dave Chinner Committed by Alex Elder
Browse files

xfs: Convert filestreams code to use per-ag get/put routines



Use xfs_perag_get() and xfs_perag_put() in the filestreams code.

Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
parent a862e0fd
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ _xfs_filestream_pick_ag(
	int		flags,
	xfs_extlen_t	minlen)
{
	int		streams, max_streams;
	int		err, trylock, nscan;
	xfs_extlen_t	longest, free, minfree, maxfree = 0;
	xfs_agnumber_t	ag, max_ag = NULLAGNUMBER;
@@ -155,16 +156,16 @@ _xfs_filestream_pick_ag(
	trylock = XFS_ALLOC_FLAG_TRYLOCK;

	for (nscan = 0; 1; nscan++) {

		TRACE_AG_SCAN(mp, ag, xfs_filestream_peek_ag(mp, ag));

		pag = mp->m_perag + ag;
		pag = xfs_perag_get(mp, ag);
		TRACE_AG_SCAN(mp, ag, atomic_read(&pag->pagf_fstrms));

		if (!pag->pagf_init) {
			err = xfs_alloc_pagf_init(mp, NULL, ag, trylock);
			if (err && !trylock)
			if (err && !trylock) {
				xfs_perag_put(pag);
				return err;
			}
		}

		/* Might fail sometimes during the 1st pass with trylock set. */
		if (!pag->pagf_init)
@@ -173,6 +174,7 @@ _xfs_filestream_pick_ag(
		/* Keep track of the AG with the most free blocks. */
		if (pag->pagf_freeblks > maxfree) {
			maxfree = pag->pagf_freeblks;
			max_streams = atomic_read(&pag->pagf_fstrms);
			max_ag = ag;
		}

@@ -195,6 +197,8 @@ _xfs_filestream_pick_ag(

			/* Break out, retaining the reference on the AG. */
			free = pag->pagf_freeblks;
			streams = atomic_read(&pag->pagf_fstrms);
			xfs_perag_put(pag);
			*agp = ag;
			break;
		}
@@ -202,6 +206,7 @@ _xfs_filestream_pick_ag(
		/* Drop the reference on this AG, it's not usable. */
		xfs_filestream_put_ag(mp, ag);
next_ag:
		xfs_perag_put(pag);
		/* Move to the next AG, wrapping to AG 0 if necessary. */
		if (++ag >= mp->m_sb.sb_agcount)
			ag = 0;
@@ -229,6 +234,7 @@ next_ag:
		if (max_ag != NULLAGNUMBER) {
			xfs_filestream_get_ag(mp, max_ag);
			TRACE_AG_PICK1(mp, max_ag, maxfree);
			streams = max_streams;
			free = maxfree;
			*agp = max_ag;
			break;
@@ -240,8 +246,7 @@ next_ag:
		return 0;
	}

	TRACE_AG_PICK2(mp, startag, *agp, xfs_filestream_peek_ag(mp, *agp),
			free, nscan, flags);
	TRACE_AG_PICK2(mp, startag, *agp, streams, free, nscan, flags);

	return 0;
}
+24 −3
Original line number Diff line number Diff line
@@ -79,12 +79,21 @@ extern ktrace_t *xfs_filestreams_trace_buf;
 * the cache that reference per-ag array elements that have since been
 * reallocated.
 */
/*
 * xfs_filestream_peek_ag is only used in tracing code
 */
static inline int
xfs_filestream_peek_ag(
	xfs_mount_t	*mp,
	xfs_agnumber_t	agno)
{
	return atomic_read(&mp->m_perag[agno].pagf_fstrms);
	struct xfs_perag *pag;
	int		ret;

	pag = xfs_perag_get(mp, agno);
	ret = atomic_read(&pag->pagf_fstrms);
	xfs_perag_put(pag);
	return ret;
}

static inline int
@@ -92,7 +101,13 @@ xfs_filestream_get_ag(
	xfs_mount_t	*mp,
	xfs_agnumber_t	agno)
{
	return atomic_inc_return(&mp->m_perag[agno].pagf_fstrms);
	struct xfs_perag *pag;
	int		ret;

	pag = xfs_perag_get(mp, agno);
	ret = atomic_inc_return(&pag->pagf_fstrms);
	xfs_perag_put(pag);
	return ret;
}

static inline int
@@ -100,7 +115,13 @@ xfs_filestream_put_ag(
	xfs_mount_t	*mp,
	xfs_agnumber_t	agno)
{
	return atomic_dec_return(&mp->m_perag[agno].pagf_fstrms);
	struct xfs_perag *pag;
	int		ret;

	pag = xfs_perag_get(mp, agno);
	ret = atomic_dec_return(&pag->pagf_fstrms);
	xfs_perag_put(pag);
	return ret;
}

/* allocation selection flags */