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?
*/
|