63f1a9
From d0a896275ec2969f507e6b60c75a4b24c7fd5bd5 Mon Sep 17 00:00:00 2001
63f1a9
From: Eric Sandeen <sandeen@sandeen.net>
63f1a9
Date: Tue, 15 May 2018 14:55:55 -0500
31cddd
Subject: [PATCH] xfs: accept filesystem with sparse inodes
63f1a9
63f1a9
The sparse inode metadata format became a mkfs.xfs default in
63f1a9
xfsprogs-4.16.0, and such filesystems are now rejected by grub as
63f1a9
containing an incompatible feature.
63f1a9
63f1a9
In essence, this feature allows xfs to allocate inodes into fragmented
63f1a9
freespace.  (Without this feature, if xfs could not allocate contiguous
63f1a9
space for 64 new inodes, inode creation would fail.)
63f1a9
63f1a9
In practice, the disk format change is restricted to the inode btree,
63f1a9
which as far as I can tell is not used by grub.  If all you're doing
63f1a9
today is parsing a directory, reading an inode number, and converting
63f1a9
that inode number to a disk location, then ignoring this feature
63f1a9
should be fine, so I've added it to XFS_SB_FEAT_INCOMPAT_SUPPORTED
63f1a9
63f1a9
I did some brief testing of this patch by hacking up the regression
63f1a9
tests to completely fragment freespace on the test xfs filesystem, and
63f1a9
then write a large-ish number of inodes to consume any existing
63f1a9
contiguous 64-inode chunk.  This way any files the grub tests add and
63f1a9
traverse would be in such a fragmented inode allocation.  Tests passed,
63f1a9
but I'm not sure how to cleanly integrate that into the test harness.
63f1a9
63f1a9
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
63f1a9
---
63f1a9
 grub-core/fs/xfs.c | 11 ++++++++++-
63f1a9
 1 file changed, 10 insertions(+), 1 deletion(-)
63f1a9
63f1a9
diff --git a/grub-core/fs/xfs.c b/grub-core/fs/xfs.c
63f1a9
index 9f66dd6e4c6..d7222b529f5 100644
63f1a9
--- a/grub-core/fs/xfs.c
63f1a9
+++ b/grub-core/fs/xfs.c
63f1a9
@@ -79,9 +79,18 @@ GRUB_MOD_LICENSE ("GPLv3+");
63f1a9
 #define XFS_SB_FEAT_INCOMPAT_SPINODES   (1 << 1)        /* sparse inode chunks */
63f1a9
 #define XFS_SB_FEAT_INCOMPAT_META_UUID  (1 << 2)        /* metadata UUID */
63f1a9
 
63f1a9
-/* We do not currently verify metadata UUID so it is safe to read such filesystem */
63f1a9
+/*
63f1a9
+ * Directory entries with ftype are explicitly handled by grub code.
63f1a9
+ *
63f1a9
+ * We do not currently verify metadata UUID, so it is safe to read filesystems
63f1a9
+ * with the XFS_SB_FEAT_INCOMPAT_META_UUID feature.
63f1a9
+ *
63f1a9
+ * We do not currently read the inode btrees, so it is safe to read filesystems
63f1a9
+ * with the XFS_SB_FEAT_INCOMPAT_SPINODES feature.
63f1a9
+ */
63f1a9
 #define XFS_SB_FEAT_INCOMPAT_SUPPORTED \
63f1a9
 	(XFS_SB_FEAT_INCOMPAT_FTYPE | \
63f1a9
+	 XFS_SB_FEAT_INCOMPAT_SPINODES | \
63f1a9
 	 XFS_SB_FEAT_INCOMPAT_META_UUID)
63f1a9
 
63f1a9
 struct grub_xfs_sblock