|
@@ -168,8 +168,10 @@ typedef struct xfs_sb {
|
|
|
__uint32_t sb_features_compat;
|
|
|
__uint32_t sb_features_ro_compat;
|
|
|
__uint32_t sb_features_incompat;
|
|
|
+ __uint32_t sb_features_log_incompat;
|
|
|
|
|
|
__uint32_t sb_crc; /* superblock crc */
|
|
|
+ __uint32_t sb_pad;
|
|
|
|
|
|
xfs_ino_t sb_pquotino; /* project quota inode */
|
|
|
xfs_lsn_t sb_lsn; /* last write sequence */
|
|
@@ -250,8 +252,10 @@ typedef struct xfs_dsb {
|
|
|
__be32 sb_features_compat;
|
|
|
__be32 sb_features_ro_compat;
|
|
|
__be32 sb_features_incompat;
|
|
|
+ __be32 sb_features_log_incompat;
|
|
|
|
|
|
__le32 sb_crc; /* superblock crc */
|
|
|
+ __be32 sb_pad;
|
|
|
|
|
|
__be64 sb_pquotino; /* project quota inode */
|
|
|
__be64 sb_lsn; /* last write sequence */
|
|
@@ -276,7 +280,8 @@ typedef enum {
|
|
|
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_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT,
|
|
|
- XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, XFS_SBS_CRC,
|
|
|
+ XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT,
|
|
|
+ XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD,
|
|
|
XFS_SBS_PQUOTINO, XFS_SBS_LSN,
|
|
|
XFS_SBS_FIELDCOUNT
|
|
|
} xfs_sb_field_t;
|
|
@@ -306,6 +311,7 @@ typedef enum {
|
|
|
#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT)
|
|
|
#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT)
|
|
|
#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT)
|
|
|
+#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT)
|
|
|
#define XFS_SB_CRC XFS_SB_MVAL(CRC)
|
|
|
#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO)
|
|
|
#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT)
|
|
@@ -316,7 +322,8 @@ typedef enum {
|
|
|
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_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \
|
|
|
- XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | XFS_SB_PQUOTINO)
|
|
|
+ XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \
|
|
|
+ XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO)
|
|
|
|
|
|
|
|
|
/*
|
|
@@ -552,6 +559,65 @@ static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp)
|
|
|
return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/*
|
|
|
+ * Extended v5 superblock feature masks. These are to be used for new v5
|
|
|
+ * superblock features only.
|
|
|
+ *
|
|
|
+ * Compat features are new features that old kernels will not notice or affect
|
|
|
+ * and so can mount read-write without issues.
|
|
|
+ *
|
|
|
+ * RO-Compat (read only) are features that old kernels can read but will break
|
|
|
+ * if they write. Hence only read-only mounts of such filesystems are allowed on
|
|
|
+ * kernels that don't support the feature bit.
|
|
|
+ *
|
|
|
+ * InCompat features are features which old kernels will not understand and so
|
|
|
+ * must not mount.
|
|
|
+ *
|
|
|
+ * Log-InCompat features are for changes to log formats or new transactions that
|
|
|
+ * can't be replayed on older kernels. The fields are set when the filesystem is
|
|
|
+ * mounted, and a clean unmount clears the fields.
|
|
|
+ */
|
|
|
+#define XFS_SB_FEAT_COMPAT_ALL 0
|
|
|
+#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL
|
|
|
+static inline bool
|
|
|
+xfs_sb_has_compat_feature(
|
|
|
+ struct xfs_sb *sbp,
|
|
|
+ __uint32_t feature)
|
|
|
+{
|
|
|
+ return (sbp->sb_features_compat & feature) != 0;
|
|
|
+}
|
|
|
+
|
|
|
+#define XFS_SB_FEAT_RO_COMPAT_ALL 0
|
|
|
+#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL
|
|
|
+static inline bool
|
|
|
+xfs_sb_has_ro_compat_feature(
|
|
|
+ struct xfs_sb *sbp,
|
|
|
+ __uint32_t feature)
|
|
|
+{
|
|
|
+ return (sbp->sb_features_ro_compat & feature) != 0;
|
|
|
+}
|
|
|
+
|
|
|
+#define XFS_SB_FEAT_INCOMPAT_ALL 0
|
|
|
+#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL
|
|
|
+static inline bool
|
|
|
+xfs_sb_has_incompat_feature(
|
|
|
+ struct xfs_sb *sbp,
|
|
|
+ __uint32_t feature)
|
|
|
+{
|
|
|
+ return (sbp->sb_features_incompat & feature) != 0;
|
|
|
+}
|
|
|
+
|
|
|
+#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0
|
|
|
+#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL
|
|
|
+static inline bool
|
|
|
+xfs_sb_has_incompat_log_feature(
|
|
|
+ struct xfs_sb *sbp,
|
|
|
+ __uint32_t feature)
|
|
|
+{
|
|
|
+ return (sbp->sb_features_log_incompat & feature) != 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* end of superblock version macros
|
|
|
*/
|