Re: [PATCH 15/28] repair: handle sparse format inobt record freecount correctly

Dave Chinner
2015-06-05T00:53:31Z

On Tue, Jun 02, 2015 at 02:41:48PM -0400, Brian Foster wrote:
> The sparse inode chunk feature introduces a new inobt record format that
> converts ir_freecount from 4 bytes to 1 byte. ir_freecount references
> throughout repair currently assume the 'full' format and endian-convert
> from the 32-bit value.
>
> Update the xfs_repair inobt scan and tree rebuild codepaths to use the
> correct record format for ir_freecount when sparse inodes is enabled.
>
> Signed-off-by: Brian Foster <bfoster@redhat.com>
> ---
> repair/phase5.c | 6 +++++-
> repair/scan.c | 37 +++++++++++++++++++++++++------------
> 2 files changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/repair/phase5.c b/repair/phase5.c
> index d01e72b..04bf049 100644
> --- a/repair/phase5.c
> +++ b/repair/phase5.c
> @@ -1240,7 +1240,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno,
> inocnt += is_inode_free(ino_rec, k);
> }
>
> - bt_rec[j].ir_u.f.ir_freecount = cpu_to_be32(inocnt);
> + if (xfs_sb_version_hassparseinodes(&mp->m_sb))
> + bt_rec[j].ir_u.sp.ir_freecount = inocnt;
> + else
> + bt_rec[j].ir_u.f.ir_freecount =
> + cpu_to_be32(inocnt);
> freecount += inocnt;
> count += XFS_INODES_PER_CHUNK;

Can you make this a "inorec_set_freecount(mp, rec, count)" helper?

> diff --git a/repair/scan.c b/repair/scan.c
> index e64d0e5..f42459c 100644
> --- a/repair/scan.c
> +++ b/repair/scan.c
> @@ -751,11 +751,16 @@ scan_single_ino_chunk(
> int off;
> int state;
> ino_tree_node_t *ino_rec, *first_rec, *last_rec;
> + int freecount;
>
> ino = be32_to_cpu(rp->ir_startino);
> off = XFS_AGINO_TO_OFFSET(mp, ino);
> agbno = XFS_AGINO_TO_AGBNO(mp, ino);
> lino = XFS_AGINO_TO_INO(mp, agno, ino);
> + if (xfs_sb_version_hassparseinodes(&mp->m_sb))
> + freecount = rp->ir_u.sp.ir_freecount;
> + else
> + freecount = be32_to_cpu(rp->ir_u.f.ir_freecount);

And this a "freecount = inorec_get_freecount(mp, rec)" helper?

The code is otherwise fine, so I'll apply this patch as is to keep
working through the series. Can you send the helper update as a
delta patch that applies at the end of the entire series?

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com