|
@@ -89,6 +89,7 @@ struct xfs_mount;
|
|
|
|
|
|
/*
|
|
|
* Superblock - in core version. Must match the ondisk version below.
|
|
|
+ * Must be padded to 64 bit alignment.
|
|
|
*/
|
|
|
typedef struct xfs_sb {
|
|
|
__uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
|
@@ -145,10 +146,21 @@ typedef struct xfs_sb {
|
|
|
__uint16_t sb_logsectsize; /* sector size for the log, bytes */
|
|
|
__uint32_t sb_logsunit; /* stripe unit size for the log */
|
|
|
__uint32_t sb_features2; /* additional feature bits */
|
|
|
+
|
|
|
+ /*
|
|
|
+ * bad features2 field as a result of failing to pad the sb
|
|
|
+ * structure to 64 bits. Some machines will be using this field
|
|
|
+ * for features2 bits. Easiest just to mark it bad and not use
|
|
|
+ * it for anything else.
|
|
|
+ */
|
|
|
+ __uint32_t sb_bad_features2;
|
|
|
+
|
|
|
+ /* must be padded to 64 bit alignment */
|
|
|
} xfs_sb_t;
|
|
|
|
|
|
/*
|
|
|
- * Superblock - on disk version. Must match the in core version below.
|
|
|
+ * Superblock - on disk version. Must match the in core version above.
|
|
|
+ * Must be padded to 64 bit alignment.
|
|
|
*/
|
|
|
typedef struct xfs_dsb {
|
|
|
__be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
|
@@ -205,6 +217,15 @@ typedef struct xfs_dsb {
|
|
|
__be16 sb_logsectsize; /* sector size for the log, bytes */
|
|
|
__be32 sb_logsunit; /* stripe unit size for the log */
|
|
|
__be32 sb_features2; /* additional feature bits */
|
|
|
+ /*
|
|
|
+ * bad features2 field as a result of failing to pad the sb
|
|
|
+ * structure to 64 bits. Some machines will be using this field
|
|
|
+ * for features2 bits. Easiest just to mark it bad and not use
|
|
|
+ * it for anything else.
|
|
|
+ */
|
|
|
+ __be32 sb_bad_features2;
|
|
|
+
|
|
|
+ /* must be padded to 64 bit alignment */
|
|
|
} xfs_dsb_t;
|
|
|
|
|
|
/*
|
|
@@ -223,7 +244,7 @@ typedef enum {
|
|
|
XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN,
|
|
|
XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG,
|
|
|
XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT,
|
|
|
- XFS_SBS_FEATURES2,
|
|
|
+ XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2,
|
|
|
XFS_SBS_FIELDCOUNT
|
|
|
} xfs_sb_field_t;
|
|
|
|
|
@@ -248,13 +269,15 @@ typedef enum {
|
|
|
#define XFS_SB_IFREE XFS_SB_MVAL(IFREE)
|
|
|
#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS)
|
|
|
#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2)
|
|
|
+#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2)
|
|
|
#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT)
|
|
|
#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1)
|
|
|
#define XFS_SB_MOD_BITS \
|
|
|
(XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \
|
|
|
XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \
|
|
|
XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \
|
|
|
- XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2)
|
|
|
+ XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \
|
|
|
+ XFS_SB_BAD_FEATURES2)
|
|
|
|
|
|
|
|
|
/*
|
|
@@ -296,6 +319,14 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp)
|
|
|
}
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
|
|
+/*
|
|
|
+ * Detect a bad features2 field
|
|
|
+ */
|
|
|
+static inline int xfs_sb_has_bad_features2(xfs_sb_t *sbp)
|
|
|
+{
|
|
|
+ return (sbp->sb_bad_features2 != 0);
|
|
|
+}
|
|
|
+
|
|
|
static inline unsigned xfs_sb_version_tonew(unsigned v)
|
|
|
{
|
|
|
return ((((v) == XFS_SB_VERSION_1) ? \
|