30
30
* Physical superblock buffer manipulations. Shared with libxfs in userspace.
31
31
*/
32
32
33
+ /*
34
+ * Check that all the V4 feature bits that the V5 filesystem format requires are
35
+ * correctly set.
36
+ */
37
+ static bool
38
+ xfs_sb_validate_v5_features (
39
+ struct xfs_sb * sbp )
40
+ {
41
+ /* We must not have any unknown V4 feature bits set */
42
+ if (sbp -> sb_versionnum & ~XFS_SB_VERSION_OKBITS )
43
+ return false;
44
+
45
+ /*
46
+ * The CRC bit is considered an invalid V4 flag, so we have to add it
47
+ * manually to the OKBITS mask.
48
+ */
49
+ if (sbp -> sb_features2 & ~(XFS_SB_VERSION2_OKBITS |
50
+ XFS_SB_VERSION2_CRCBIT ))
51
+ return false;
52
+
53
+ /* Now check all the required V4 feature flags are set. */
54
+
55
+ #define V5_VERS_FLAGS (XFS_SB_VERSION_NLINKBIT | \
56
+ XFS_SB_VERSION_ALIGNBIT | \
57
+ XFS_SB_VERSION_LOGV2BIT | \
58
+ XFS_SB_VERSION_EXTFLGBIT | \
59
+ XFS_SB_VERSION_DIRV2BIT | \
60
+ XFS_SB_VERSION_MOREBITSBIT)
61
+
62
+ #define V5_FEAT_FLAGS (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
63
+ XFS_SB_VERSION2_ATTR2BIT | \
64
+ XFS_SB_VERSION2_PROJID32BIT | \
65
+ XFS_SB_VERSION2_CRCBIT)
66
+
67
+ if ((sbp -> sb_versionnum & V5_VERS_FLAGS ) != V5_VERS_FLAGS )
68
+ return false;
69
+ if ((sbp -> sb_features2 & V5_FEAT_FLAGS ) != V5_FEAT_FLAGS )
70
+ return false;
71
+ return true;
72
+ }
73
+
33
74
/*
34
75
* We support all XFS versions newer than a v4 superblock with V2 directories.
35
76
*/
36
77
bool
37
78
xfs_sb_good_version (
38
79
struct xfs_sb * sbp )
39
80
{
40
- /* all v5 filesystems are supported */
81
+ /*
82
+ * All v5 filesystems are supported, but we must check that all the
83
+ * required v4 feature flags are enabled correctly as the code checks
84
+ * those flags and not for v5 support.
85
+ */
41
86
if (xfs_sb_is_v5 (sbp ))
42
- return true;
87
+ return xfs_sb_validate_v5_features (sbp );
88
+
89
+ /* We must not have any unknown v4 feature bits set */
90
+ if ((sbp -> sb_versionnum & ~XFS_SB_VERSION_OKBITS ) ||
91
+ ((sbp -> sb_versionnum & XFS_SB_VERSION_MOREBITSBIT ) &&
92
+ (sbp -> sb_features2 & ~XFS_SB_VERSION2_OKBITS )))
93
+ return false;
43
94
44
95
/* versions prior to v4 are not supported */
45
96
if (XFS_SB_VERSION_NUM (sbp ) < XFS_SB_VERSION_4 )
@@ -51,12 +102,6 @@ xfs_sb_good_version(
51
102
if (!(sbp -> sb_versionnum & XFS_SB_VERSION_EXTFLGBIT ))
52
103
return false;
53
104
54
- /* And must not have any unknown v4 feature bits set */
55
- if ((sbp -> sb_versionnum & ~XFS_SB_VERSION_OKBITS ) ||
56
- ((sbp -> sb_versionnum & XFS_SB_VERSION_MOREBITSBIT ) &&
57
- (sbp -> sb_features2 & ~XFS_SB_VERSION2_OKBITS )))
58
- return false;
59
-
60
105
/* It's a supported v4 filesystem */
61
106
return true;
62
107
}
@@ -267,12 +312,15 @@ xfs_validate_sb_common(
267
312
bool has_dalign ;
268
313
269
314
if (!xfs_verify_magic (bp , dsb -> sb_magicnum )) {
270
- xfs_warn (mp , "bad magic number" );
315
+ xfs_warn (mp ,
316
+ "Superblock has bad magic number 0x%x. Not an XFS filesystem?" ,
317
+ be32_to_cpu (dsb -> sb_magicnum ));
271
318
return - EWRONGFS ;
272
319
}
273
320
274
321
if (!xfs_sb_good_version (sbp )) {
275
- xfs_warn (mp , "bad version" );
322
+ xfs_warn (mp ,
323
+ "Superblock has unknown features enabled or corrupted feature masks." );
276
324
return - EWRONGFS ;
277
325
}
278
326
0 commit comments