From: Darrick J. Wong <djwong@xxxxxxxxxx> Use the new iget function for these metadata files so that we can check types, etc. Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --- repair/phase6.c | 23 +++++++++-------------- repair/quotacheck.c | 17 ++++++++++++++--- repair/rt.c | 29 ++++++++++++++++++++++------- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index e15d728ddc0469..84d2676e34fa53 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -484,6 +484,11 @@ ensure_rtino( struct xfs_mount *mp = tp->t_mountp; int error; + /* + * Don't use metafile iget here because we're resetting sb-rooted + * inodes that live at fixed inumbers, but these inodes could be in + * an arbitrary state. + */ error = -libxfs_iget(mp, tp, ino, 0, ipp); if (error) return error; @@ -524,16 +529,11 @@ static void fill_rbmino( struct xfs_mount *mp) { - struct xfs_trans *tp; struct xfs_inode *ip; int error; - error = -libxfs_trans_alloc_rollable(mp, 10, &tp); - if (error) - res_failed(error); - - error = -libxfs_iget(mp, tp, mp->m_sb.sb_rbmino, 0, &ip); - libxfs_trans_cancel(tp); + error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rbmino, + XFS_METAFILE_RTBITMAP, &ip); if (error) do_error( _("couldn't iget realtime bitmap inode, error %d\n"), error); @@ -551,16 +551,11 @@ static void fill_rsumino( struct xfs_mount *mp) { - struct xfs_trans *tp; struct xfs_inode *ip; int error; - error = -libxfs_trans_alloc_rollable(mp, 10, &tp); - if (error) - res_failed(error); - - error = -libxfs_iget(mp, tp, mp->m_sb.sb_rsumino, 0, &ip); - libxfs_trans_cancel(tp); + error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rsumino, + XFS_METAFILE_RTSUMMARY, &ip); if (error) do_error( _("couldn't iget realtime summary inode, error %d\n"), error); diff --git a/repair/quotacheck.c b/repair/quotacheck.c index 4cb38db3ddd6d7..d9e08059927f80 100644 --- a/repair/quotacheck.c +++ b/repair/quotacheck.c @@ -403,21 +403,26 @@ quotacheck_verify( struct xfs_ifork *ifp; struct qc_dquots *dquots = NULL; struct avl64node *node, *n; + struct xfs_trans *tp; xfs_ino_t ino = NULLFSINO; + enum xfs_metafile_type metafile_type; int error; switch (type) { case XFS_DQTYPE_USER: ino = mp->m_sb.sb_uquotino; dquots = user_dquots; + metafile_type = XFS_METAFILE_USRQUOTA; break; case XFS_DQTYPE_GROUP: ino = mp->m_sb.sb_gquotino; dquots = group_dquots; + metafile_type = XFS_METAFILE_GRPQUOTA; break; case XFS_DQTYPE_PROJ: ino = mp->m_sb.sb_pquotino; dquots = proj_dquots; + metafile_type = XFS_METAFILE_PRJQUOTA; break; } @@ -429,17 +434,21 @@ quotacheck_verify( if (!dquots || !chkd_flags) return; - error = -libxfs_iget(mp, NULL, ino, 0, &ip); + error = -libxfs_trans_alloc_empty(mp, &tp); + if (error) + do_error(_("could not alloc transaction to open quota file\n")); + + error = -libxfs_trans_metafile_iget(tp, ino, metafile_type, &ip); if (error) { do_warn( _("could not open %s inode %"PRIu64" for quotacheck, err=%d\n"), qflags_typestr(type), ino, error); chkd_flags = 0; - return; + goto out_trans; } ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK); - error = -libxfs_iread_extents(NULL, ip, XFS_DATA_FORK); + error = -libxfs_iread_extents(tp, ip, XFS_DATA_FORK); if (error) { do_warn( _("could not read %s inode %"PRIu64" extents, err=%d\n"), @@ -477,6 +486,8 @@ _("%s record for id %u not found on disk (bcount %"PRIu64" rtbcount %"PRIu64" ic } err: libxfs_irele(ip); +out_trans: + libxfs_trans_cancel(tp); } /* diff --git a/repair/rt.c b/repair/rt.c index 721c363cc1dd10..9ae421168e84b4 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -144,18 +144,34 @@ generate_rtinfo( static void check_rtfile_contents( struct xfs_mount *mp, - const char *filename, - xfs_ino_t ino, - void *buf, + enum xfs_metafile_type metafile_type, xfs_fileoff_t filelen) { struct xfs_bmbt_irec map; struct xfs_buf *bp; struct xfs_inode *ip; + const char *filename; + void *buf; + xfs_ino_t ino; xfs_fileoff_t bno = 0; int error; - error = -libxfs_iget(mp, NULL, ino, 0, &ip); + switch (metafile_type) { + case XFS_METAFILE_RTBITMAP: + ino = mp->m_sb.sb_rbmino; + filename = "rtbitmap"; + buf = btmcompute; + break; + case XFS_METAFILE_RTSUMMARY: + ino = mp->m_sb.sb_rsumino; + filename = "rtsummary"; + buf = sumcompute; + break; + default: + return; + } + + error = -libxfs_metafile_iget(mp, ino, metafile_type, &ip); if (error) { do_warn(_("unable to open %s file, err %d\n"), filename, error); return; @@ -216,7 +232,7 @@ check_rtbitmap( if (need_rbmino) return; - check_rtfile_contents(mp, "rtbitmap", mp->m_sb.sb_rbmino, btmcompute, + check_rtfile_contents(mp, XFS_METAFILE_RTBITMAP, mp->m_sb.sb_rbmblocks); } @@ -227,6 +243,5 @@ check_rtsummary( if (need_rsumino) return; - check_rtfile_contents(mp, "rtsummary", mp->m_sb.sb_rsumino, sumcompute, - mp->m_rsumblocks); + check_rtfile_contents(mp, XFS_METAFILE_RTSUMMARY, mp->m_rsumblocks); }