summaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2020-11-29 16:33:39 -0800
committerDarrick J. Wong <darrick.wong@oracle.com>2020-12-09 09:49:38 -0800
commitda5de110296c329461bb7b1caa2d993648db324f (patch)
treefd396575f409c69396bbd3cda7b206f8ee0e69fb /fs/xfs
parent7396c7fbe07e3c33b578bd9d36e48d42d2acdeb2 (diff)
downloadlinux-da5de110296c329461bb7b1caa2d993648db324f.tar.gz
linux-da5de110296c329461bb7b1caa2d993648db324f.tar.bz2
linux-da5de110296c329461bb7b1caa2d993648db324f.zip
xfs: validate feature support when recovering rmap/refcount intents
The rmap, and refcount log intent items were added to support the rmap and reflink features. Because these features come with changes to the ondisk format, the log items aren't tied to a log incompat flag. However, the log recovery routines don't actually check for those feature flags. The kernel has no business replayng an intent item for a feature that isn't enabled, so check that as part of recovered log item validation. (Note that kernels pre-dating rmap and reflink already fail log recovery on the unknown log item type code.) Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_refcount_item.c3
-rw-r--r--fs/xfs/xfs_rmap_item.c3
2 files changed, 6 insertions, 0 deletions
diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c
index c24f2da0f795..937d482c9be4 100644
--- a/fs/xfs/xfs_refcount_item.c
+++ b/fs/xfs/xfs_refcount_item.c
@@ -423,6 +423,9 @@ xfs_cui_validate_phys(
struct xfs_mount *mp,
struct xfs_phys_extent *refc)
{
+ if (!xfs_sb_version_hasreflink(&mp->m_sb))
+ return false;
+
if (refc->pe_flags & ~XFS_REFCOUNT_EXTENT_FLAGS)
return false;
diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c
index 6f3250a22093..9b84017184d9 100644
--- a/fs/xfs/xfs_rmap_item.c
+++ b/fs/xfs/xfs_rmap_item.c
@@ -466,6 +466,9 @@ xfs_rui_validate_map(
struct xfs_mount *mp,
struct xfs_map_extent *rmap)
{
+ if (!xfs_sb_version_hasrmapbt(&mp->m_sb))
+ return false;
+
if (rmap->me_flags & ~XFS_RMAP_EXTENT_FLAGS)
return false;