factor out xfs_read_agf helper
PATCH 2/2 factor out xfs_read_agf helper
Add a helper to read the AGF header and perform basic verification. Based on hunks from a larger patch from Dave Chinner.
Signed-off-by Christoph Hellwig <[email protected]>
fs/xfs/xfs_ag.h +2 -0
@@ -91,6 +91,8 @@ typedef struct xfs_agf {#define XFS_AGF_BLOCK (mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))#define XFS_BUF_TO_AGF (bp) ((xfs_agf_t *)XFS_BUF_PTR(bp)) +extern int xfs_read_agf (struct xfs_mount *mp,struct xfs_trans *tp, +xfs_agnumber_t agno,int flags,struct xfs_buf **bpp);/* * Size of the unlinked inode hash table in the agi.
fs/xfs/xfs_alloc.c +45 -21
104 lines not on this page · raw message
fs/xfs/xfs_log_recover.c +11 -15
@@ -4001,7 +4001,6 @@ xlog_recover_check_summary(xfs_agi_t *agip;xfs_buf_t *agfbp;xfs_buf_t *agibp; -xfs_daddr_t agfdaddr;xfs_buf_t *sbbp;#ifdef XFS_LOUD_RECOVERY xfs_sb_t *sbp;
@@ -4018,21 +4017,18 @@ xlog_recover_check_summary( itotal =0LL ; ifree =0LL ;for (agno =0 ; agno < mp->m_sb.sb_agcount; agno++) { - agfdaddr =XFS_AG_DADDR (mp, agno,XFS_AGF_DADDR (mp)); - agfbp =xfs_buf_read (mp->m_ddev_targp, agfdaddr, -XFS_FSS_TO_BB (mp,1 ),0 ); -if (XFS_BUF_ISERROR (agfbp)) { -xfs_ioerror_alert ("xlog_recover_check_summary(agf)" , - mp, agfbp, agfdaddr); + error =xfs_read_agf (mp,NULL , agno,0 , &agfbp); +if (error) { +xfs_fs_cmn_err (CE_ALERT , mp, +"xlog_recover_check_summary(agf)" +"agf read failed agno %d error %d" , + agno, error); + }else { + agfp =XFS_BUF_TO_AGF (agfbp); + freeblks +=be32_to_cpu (agfp->agf_freeblks) + +be32_to_cpu (agfp->agf_flcount); +xfs_buf_relse (agfbp); } - agfp =XFS_BUF_TO_AGF (agfbp); -ASSERT (XFS_AGF_MAGIC ==be32_to_cpu (agfp->agf_magicnum)); -ASSERT (XFS_AGF_GOOD_VERSION (be32_to_cpu (agfp->agf_versionnum))); -ASSERT (be32_to_cpu (agfp->agf_seqno) == agno); - - freeblks +=be32_to_cpu (agfp->agf_freeblks) + -be32_to_cpu (agfp->agf_flcount); -xfs_buf_relse (agfbp); error =xfs_read_agi (mp,NULL , agno, &agibp);if (error) {