xfs
[Top] [All Lists]

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

To: "Dave Chinner" <david@xxxxxxxxxxxxx>
Subject: RE: [PATCH 3/6] XFS: Convert filestreams code to use per-ag get/putroutines
From: "Alex Elder" <aelder@xxxxxxx>
Date: Tue, 22 Dec 2009 09:08:13 -0600
Cc: <xfs@xxxxxxxxxxx>
In-reply-to: <1260857477-2368-4-git-send-email-david@xxxxxxxxxxxxx>
Thread-index: Acp9UA+wN27VO9SySwWXuwJsVU/zAgFx4PgA
Thread-topic: [PATCH 3/6] XFS: Convert filestreams code to use per-ag get/putroutines
Dave Chinner wrote:
> Signed-off-by: Dave Chinner <david@xxxxxxxxxxxxx>

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

Reviewed-by: Alex Elder <aelder@xxxxxxx>

> ---
>  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 */

<Prev in Thread] Current Thread [Next in Thread>