Re: [PATCH 1/4] xfs: Accounting for AGFL blocks in xfs_spaceman

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>> +     if (error)
>> +             return error;
>> +
>> +     agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
>> +
>> +     for(i = be32_to_cpu(agf->agf_flfirst);
>> +             i <= be32_to_cpu(agf->agf_fllast);) {
>
> Whitespace after the "for" statement, and indentation of logic inside
> for/if/while/etc needs to be aligned to the same column.
>
> As it is, this code doesn't work. Hint: what happens when last wraps
> around back to the start ofthe freelist array? last < first, and
> hence i > last....
>
> Yes, I know it the code is similar to what I suggested last time I
> pointed out the iteration is wrong, but I'm often wrong, especially
> about intricate details that I've just quickly pulled a solution for
> off the top of my head.  IOWs, don't assume what I say is correct -
> verifiy and test it, and then tell me I'm wrong.
>
> So, perhaps a different loop structure is appropriate?

We had addressed this issue in the previous code version, but
changed it when a doubt was raised in the previous patch comments.
We will ensure that we verify and test the feedback we receive from
now on. :)

> Patch as applied to my tree is below. Please apply it to your tree
> and test it.
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@xxxxxxxxxxxxx
>
> xfs: Accounting for AGFL blocks in xfs_spaceman
>
> From: Dhruvesh Rathore <adrscube@xxxxxxxxx>
>
> The xfs_spaceman utility previously failed to account for AGFL
> blocks.  Old output:
>
> $ sudo xfs_spaceman -c "freesp" /media/xfs
>    from      to extents  blocks    pct
>    1024    2047       1    1262   0.04
>    4096    8191       1    5126   0.15
>    8192   16383       3   35344   1.05
>   32768   65535       1   43989   1.31
>  262144  524287       3 1334894  39.78
>  524288  967428       2 1934840  57.66
>
> As you can see the AGFL blocks were unaccounted (4 per AG, and there
> were 4 AGs in this filesystem).  This patch adds a new function
> which accounts for the the free extents tracked by the AGFL.
>
> New output:
>
> $ sudo xfs_spaceman -c "freesp" /media/xfs
>    from      to extents  blocks    pct
>       1       1      16      16   0.00
>    1024    2047       1    1262   0.04
>    4096    8191       1    5126   0.15
>    8192   16383       3   35344   1.05
>   32768   65535       1   43989   1.31
>  262144  524287       3 1334894  39.78
>  524288  967428       2 1934840  57.66
>
> [dchinner: fixed whitespace issues, agfl iteration logic,
>            error handling]
>
> Signed-off-by: Dhruvesh Rathore <dhruvesh_r@xxxxxxxxxxx>
> Signed-off-by: Amey Ruikar <ameyruikar@xxxxxxxxx>
> Signed-off-by: Somdeep Dey <somdeepdey10@xxxxxxxxx>
>
> ---
>  fs/xfs/libxfs/xfs_alloc.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 69 insertions(+)
>
> diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c
> index 1ae53ad..544c945 100644
> --- a/fs/xfs/libxfs/xfs_alloc.c
> +++ b/fs/xfs/libxfs/xfs_alloc.c
> @@ -2633,6 +2633,68 @@ error0:
>  }
>
>  /*
> + * When we map free space we need to take into account the blocks
> + * that are indexed by the AGFL. They aren't found by walking the
> + * free space btrees, so we have to walk each AGFL to find them.
> + */
> +static int
> +xfs_alloc_agfl_freespace_map(
> +       struct xfs_mount        *mp,
> +       struct xfs_agf          *agf,
> +       struct fiemap_extent_info *fieinfo,
> +       xfs_agnumber_t          agno,
> +       xfs_agblock_t           sagbno,
> +       xfs_agblock_t           eagbno)
> +{
> +       xfs_buf_t               *agflbp;
> +       __be32                  *agfl_bno;
> +       int                     i;
> +       int                     error = 0;
> +
> +       error = xfs_alloc_read_agfl(mp, NULL, agno, &agflbp);
> +       if (error)
> +               return error;
> +
> +       agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
> +       for (i = be32_to_cpu(agf->agf_flfirst);;) {
> +               xfs_agblock_t   fbno;
> +               xfs_extlen_t    flen;
> +               xfs_daddr_t     dbno;
> +               xfs_fileoff_t   dlen;
> +               int             flags = 0;
> +
> +               fbno = be32_to_cpu(agfl_bno[i]);
> +               flen = 1;
> +
> +               /* range check - must be wholly withing requested range */
> +               if (fbno < sagbno ||
> +                   (eagbno != NULLAGBLOCK && fbno + flen > eagbno)) {
> +                       xfs_warn(mp, "10: %d/%d, %d/%d",
> +                                sagbno, eagbno, fbno, flen);
> +                       continue;
> +               }
> +
> +               /*
> +                * Use daddr format for all range/len calculations as that is
> +                * the format the range/len variables are supplied in by
> +                * userspace.
> +                */
> +               dbno = XFS_AGB_TO_DADDR(mp, agno, fbno);
> +               dlen = XFS_FSB_TO_BB(mp, flen);
> +               error = fiemap_fill_next_extent(fieinfo, BBTOB(dbno),
> +                                               BBTOB(dbno), BBTOB(dlen), flags);
> +               if (error)
> +                       break;
> +               if (i == be32_to_cpu(agf->agf_fllast))
> +                       break;
> +               if (++i == XFS_AGFL_SIZE(mp))
> +                       i = 0;
> +       }
> +       xfs_buf_relse(agflbp);
> +       return error;
> +}
> +
> +/*
>   * Walk the extents in the tree given by the cursor, and dump them all into the
>   * fieinfo. At the last extent in the tree, set the FIEMAP_EXTENT_LAST flag so
>   * that we return only free space from this tree in a given request.
> @@ -2793,6 +2855,13 @@ xfs_alloc_freespace_map(
>                         goto put_agbp;
>                 }
>
> +               /* Account for the free blocks in AGFL */
> +               error = xfs_alloc_agfl_freespace_map(mp, XFS_BUF_TO_AGF(agbp),
> +                                       fieinfo, agno, sagbno,
> +                                       agno == eagno ? eagbno : NULLAGBLOCK);
> +               if (error)
> +                       goto put_agbp;
> +
>                 cur = xfs_allocbt_init_cursor(mp, NULL, agbp, agno,
>                                               XFS_BTNUM_BNO);
>                 error = xfs_alloc_lookup_ge(cur, sagbno, 1, &i);
>
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

We thank you for taking the time out and working on the patches. We will
apply the above reworked patch and test it, and get back to you.

Regards,
A-DRS

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs




[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux