From: Darrick J. Wong <djwong@xxxxxxxxxx> Now that libxfs_alloc_file_space can allocate and zero blocks, use it to repair the realtime metadata instead of open-coding all this. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- repair/phase6.c | 74 +++++++------------------------------------------------ 1 file changed, 10 insertions(+), 64 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 8828f7f72b9..890bb20bce1 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -695,13 +695,8 @@ mk_rbmino( struct xfs_imeta_update upd; struct xfs_trans *tp; struct xfs_inode *ip; - struct xfs_bmbt_irec *ep; int i; - int nmap; int error; - xfs_fileoff_t bno; - struct xfs_bmbt_irec map[XFS_BMAP_MAX_NMAP]; - uint blocks; error = ensure_imeta_dirpath(mp, &XFS_IMETA_RTBITMAP); if (error) @@ -744,36 +739,15 @@ _("Couldn't find realtime bitmap parent, error %d\n"), * then allocate blocks for file and fill with zeroes (stolen * from mkfs) */ - blocks = mp->m_sb.sb_rbmblocks + - XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1; - error = -libxfs_trans_alloc_rollable(mp, blocks, &tp); - if (error) - res_failed(error); - - libxfs_trans_ijoin(tp, ip, 0); - bno = 0; - while (bno < mp->m_sb.sb_rbmblocks) { - nmap = XFS_BMAP_MAX_NMAP; - error = -libxfs_bmapi_write(tp, ip, bno, - (xfs_extlen_t)(mp->m_sb.sb_rbmblocks - bno), - 0, mp->m_sb.sb_rbmblocks, map, &nmap); + if (mp->m_sb.sb_rbmblocks) { + error = -libxfs_alloc_file_space(ip, 0, + mp->m_sb.sb_rbmblocks << mp->m_sb.sb_blocklog, + XFS_BMAPI_ZERO); if (error) { do_error( - _("couldn't allocate realtime bitmap, error = %d\n"), + _("allocation of the realtime bitmap failed, error = %d\n"), error); } - for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, ep->br_startblock), - XFS_FSB_TO_BB(mp, ep->br_blockcount)); - bno += ep->br_blockcount; - } - } - error = -libxfs_trans_commit(tp); - if (error) { - do_error( - _("allocation of the realtime bitmap failed, error = %d\n"), - error); } libxfs_irele(ip); } @@ -951,14 +925,8 @@ mk_rsumino( struct xfs_imeta_update upd; struct xfs_trans *tp; struct xfs_inode *ip; - struct xfs_bmbt_irec *ep; int i; - int nmap; int error; - int nsumblocks; - xfs_fileoff_t bno; - struct xfs_bmbt_irec map[XFS_BMAP_MAX_NMAP]; - uint blocks; error = ensure_imeta_dirpath(mp, &XFS_IMETA_RTSUMMARY); if (error) @@ -1001,36 +969,14 @@ _("Couldn't find realtime summary parent, error %d\n"), * then allocate blocks for file and fill with zeroes (stolen * from mkfs) */ - nsumblocks = mp->m_rsumsize >> mp->m_sb.sb_blocklog; - blocks = nsumblocks + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1; - error = -libxfs_trans_alloc_rollable(mp, blocks, &tp); - if (error) - res_failed(error); - - libxfs_trans_ijoin(tp, ip, 0); - bno = 0; - while (bno < nsumblocks) { - nmap = XFS_BMAP_MAX_NMAP; - error = -libxfs_bmapi_write(tp, ip, bno, - (xfs_extlen_t)(nsumblocks - bno), - 0, nsumblocks, map, &nmap); + if (mp->m_rsumsize) { + error = -libxfs_alloc_file_space(ip, 0, mp->m_rsumsize, + XFS_BMAPI_ZERO); if (error) { do_error( - _("couldn't allocate realtime summary inode, error = %d\n"), - error); - } - for (i = 0, ep = map; i < nmap; i++, ep++) { - libxfs_device_zero(mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, ep->br_startblock), - XFS_FSB_TO_BB(mp, ep->br_blockcount)); - bno += ep->br_blockcount; - } - } - error = -libxfs_trans_commit(tp); - if (error) { - do_error( _("allocation of the realtime summary ino failed, error = %d\n"), - error); + error); + } } libxfs_irele(ip); }