xfs_daddr_t     head_blk,
        xfs_daddr_t     tail_blk)
 {
+       struct xfs_mount *mp = log->l_mp;
        int             error;
        xfs_buf_t       *bp;
        xfs_sb_t        *sbp;
        /*
         * If IO errors happened during recovery, bail out.
         */
-       if (XFS_FORCED_SHUTDOWN(log->l_mp)) {
+       if (XFS_FORCED_SHUTDOWN(mp)) {
                return -EIO;
        }
 
         * or iunlinks they will have some entries in the AIL; so we look at
         * the AIL to determine how to set the tail_lsn.
         */
-       xlog_assign_tail_lsn(log->l_mp);
+       xlog_assign_tail_lsn(mp);
 
        /*
         * Now that we've finished replaying all buffer and inode
         * updates, re-read in the superblock and reverify it.
         */
-       bp = xfs_getsb(log->l_mp, 0);
+       bp = xfs_getsb(mp, 0);
        bp->b_flags &= ~(XBF_DONE | XBF_ASYNC);
        ASSERT(!(bp->b_flags & XBF_WRITE));
        bp->b_flags |= XBF_READ;
 
        error = xfs_buf_submit_wait(bp);
        if (error) {
-               if (!XFS_FORCED_SHUTDOWN(log->l_mp)) {
+               if (!XFS_FORCED_SHUTDOWN(mp)) {
                        xfs_buf_ioerror_alert(bp, __func__);
                        ASSERT(0);
                }
        }
 
        /* Convert superblock from on-disk format */
-       sbp = &log->l_mp->m_sb;
+       sbp = &mp->m_sb;
        xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp));
-       ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC);
-       ASSERT(xfs_sb_good_version(sbp));
-       xfs_reinit_percpu_counters(log->l_mp);
-
        xfs_buf_relse(bp);
 
+       /* re-initialise in-core superblock and geometry structures */
+       xfs_reinit_percpu_counters(mp);
+       error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
+       if (error) {
+               xfs_warn(mp, "Failed post-recovery per-ag init: %d", error);
+               return error;
+       }
 
        xlog_recover_check_summary(log);