|
@@ -456,6 +456,7 @@ xfs_sb_has_compat_feature(
|
|
|
|
|
|
#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */
|
|
#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */
|
|
#define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */
|
|
#define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */
|
|
|
|
+#define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */
|
|
#define XFS_SB_FEAT_RO_COMPAT_ALL \
|
|
#define XFS_SB_FEAT_RO_COMPAT_ALL \
|
|
(XFS_SB_FEAT_RO_COMPAT_FINOBT | \
|
|
(XFS_SB_FEAT_RO_COMPAT_FINOBT | \
|
|
XFS_SB_FEAT_RO_COMPAT_RMAPBT)
|
|
XFS_SB_FEAT_RO_COMPAT_RMAPBT)
|
|
@@ -546,6 +547,12 @@ static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp)
|
|
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT);
|
|
(sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp)
|
|
|
|
+{
|
|
|
|
+ return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 &&
|
|
|
|
+ (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK);
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* end of superblock version macros
|
|
* end of superblock version macros
|
|
*/
|
|
*/
|
|
@@ -641,14 +648,17 @@ typedef struct xfs_agf {
|
|
uuid_t agf_uuid; /* uuid of filesystem */
|
|
uuid_t agf_uuid; /* uuid of filesystem */
|
|
|
|
|
|
__be32 agf_rmap_blocks; /* rmapbt blocks used */
|
|
__be32 agf_rmap_blocks; /* rmapbt blocks used */
|
|
- __be32 agf_padding; /* padding */
|
|
|
|
|
|
+ __be32 agf_refcount_blocks; /* refcountbt blocks used */
|
|
|
|
+
|
|
|
|
+ __be32 agf_refcount_root; /* refcount tree root block */
|
|
|
|
+ __be32 agf_refcount_level; /* refcount btree levels */
|
|
|
|
|
|
/*
|
|
/*
|
|
* reserve some contiguous space for future logged fields before we add
|
|
* reserve some contiguous space for future logged fields before we add
|
|
* the unlogged fields. This makes the range logging via flags and
|
|
* the unlogged fields. This makes the range logging via flags and
|
|
* structure offsets much simpler.
|
|
* structure offsets much simpler.
|
|
*/
|
|
*/
|
|
- __be64 agf_spare64[15];
|
|
|
|
|
|
+ __be64 agf_spare64[14];
|
|
|
|
|
|
/* unlogged fields, written during buffer writeback. */
|
|
/* unlogged fields, written during buffer writeback. */
|
|
__be64 agf_lsn; /* last write sequence */
|
|
__be64 agf_lsn; /* last write sequence */
|
|
@@ -1041,9 +1051,14 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev)
|
|
* 16 bits of the XFS_XFLAG_s range.
|
|
* 16 bits of the XFS_XFLAG_s range.
|
|
*/
|
|
*/
|
|
#define XFS_DIFLAG2_DAX_BIT 0 /* use DAX for this inode */
|
|
#define XFS_DIFLAG2_DAX_BIT 0 /* use DAX for this inode */
|
|
|
|
+#define XFS_DIFLAG2_REFLINK_BIT 1 /* file's blocks may be shared */
|
|
|
|
+#define XFS_DIFLAG2_COWEXTSIZE_BIT 2 /* copy on write extent size hint */
|
|
#define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT)
|
|
#define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT)
|
|
|
|
+#define XFS_DIFLAG2_REFLINK (1 << XFS_DIFLAG2_REFLINK_BIT)
|
|
|
|
+#define XFS_DIFLAG2_COWEXTSIZE (1 << XFS_DIFLAG2_COWEXTSIZE_BIT)
|
|
|
|
|
|
-#define XFS_DIFLAG2_ANY (XFS_DIFLAG2_DAX)
|
|
|
|
|
|
+#define XFS_DIFLAG2_ANY \
|
|
|
|
+ (XFS_DIFLAG2_DAX | XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)
|
|
|
|
|
|
/*
|
|
/*
|
|
* Inode number format:
|
|
* Inode number format:
|
|
@@ -1353,7 +1368,8 @@ struct xfs_owner_info {
|
|
#define XFS_RMAP_OWN_AG (-5ULL) /* AG freespace btree blocks */
|
|
#define XFS_RMAP_OWN_AG (-5ULL) /* AG freespace btree blocks */
|
|
#define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */
|
|
#define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */
|
|
#define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */
|
|
#define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */
|
|
-#define XFS_RMAP_OWN_MIN (-8ULL) /* guard */
|
|
|
|
|
|
+#define XFS_RMAP_OWN_REFC (-8ULL) /* refcount tree */
|
|
|
|
+#define XFS_RMAP_OWN_MIN (-9ULL) /* guard */
|
|
|
|
|
|
#define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63)))
|
|
#define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63)))
|
|
|
|
|
|
@@ -1433,6 +1449,13 @@ typedef __be32 xfs_rmap_ptr_t;
|
|
XFS_FIBT_BLOCK(mp) + 1 : \
|
|
XFS_FIBT_BLOCK(mp) + 1 : \
|
|
XFS_IBT_BLOCK(mp) + 1)
|
|
XFS_IBT_BLOCK(mp) + 1)
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Reference Count Btree format definitions
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+#define XFS_REFC_CRC_MAGIC 0x52334643 /* 'R3FC' */
|
|
|
|
+
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* BMAP Btree format definitions
|
|
* BMAP Btree format definitions
|
|
*
|
|
*
|