RE: [PATCH 3/6] XFS: Convert filestreams code to use per-ag get/putroutines

Alex Elder
2009-12-22T15:07:47Z

Dave Chinner wrote:
> Signed-off-by: Dave Chinner <david@fromorbit.com>

Looks good. I'll add a short one-line explanation at the
top of the patch for you.

Reviewed-by: Alex Elder <aelder@sgi.com>

> ---
> fs/xfs/xfs_filestream.c | 19 ++++++++++++-------
> fs/xfs/xfs_filestream.h | 27 ++++++++++++++++++++++++---
> 2 files changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c
> index a631e14..e61f2aa 100644
> --- a/fs/xfs/xfs_filestream.c
> +++ b/fs/xfs/xfs_filestream.c

. . .

> @@ -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;
> }
> diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h
> index 4aba67c..58378b2 100644
> --- a/fs/xfs/xfs_filestream.h
> +++ b/fs/xfs/xfs_filestream.h
> @@ -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 */