xfs
[Top] [All Lists]

[PATCH 08/12] repair: handle filesystems with the log in allocation grou

To: xfs@xxxxxxxxxxx
Subject: [PATCH 08/12] repair: handle filesystems with the log in allocation group 0
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Fri, 02 Dec 2011 12:46:27 -0500
References: <20111202174619.179530033@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: quilt/0.48-1
Sindre Skogen reported that repair chokes on a very small filesystem created
by mkfs.xfs from xfsprogs 2.9.4.  It turned out that for some reason this
filesystem had the log in allocation group 0 and thus repairs validation
of the root inode number was off.  Fix this by adding the log blocks if
the log is allocated in allocation group 0.

Reported-by: Sindre Skogen <sindre@xxxxxxxxxxx>
Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: xfsprogs-dev/repair/xfs_repair.c
===================================================================
--- xfsprogs-dev.orig/repair/xfs_repair.c       2011-12-01 16:17:07.000000000 
+0000
+++ xfsprogs-dev/repair/xfs_repair.c    2011-12-01 16:17:58.000000000 +0000
@@ -417,12 +417,16 @@ calc_mkfs(xfs_mount_t *mp)
        fino_bno = inobt_root + XFS_MIN_FREELIST_RAW(1, 1, mp) + 1;
 
        /*
-        * If we only have a single allocation group the log is also allocated
-        * in the first allocation group and we need to add the number of
-        * blocks used by the log to the above calculation.
-        * All this of course doesn't apply if we have an external log.
+        * If the log is allocated in the first allocation group we need to
+        * add the number of blocks used by the log to the above calculation.
+        *
+        * This can happens with filesystems that only have a single
+        * allocation group, or very odd geometries created by old mkfs
+        * versions on very small filesystems.
         */
-       if (mp->m_sb.sb_agcount == 1 && mp->m_sb.sb_logstart) {
+       if (mp->m_sb.sb_logstart &&
+           XFS_FSB_TO_AGNO(mp, mp->m_sb.sb_logstart) == 0) {
+
                /*
                 * XXX(hch): verify that sb_logstart makes sense?
                 */

<Prev in Thread] Current Thread [Next in Thread>