summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2021-09-01 11:19:48 -0700
committerDarrick J. Wong <djwong@kernel.org>2021-12-15 17:29:25 -0800
commite1883ae3214f6b344d5b21a36c9c6d9748ea9127 (patch)
tree654094a430d0e615b9cbcd22d8b3e41658472e0d
parenta5f5361297868edbaf48a74a42fd720dafb2a928 (diff)
xfs: enable realtime reflinkrealtime-reflink_2021-12-15
Enable reflink for realtime devices, sort of. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/xfs_super.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 514f89e01992..6d3f8df845f4 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1682,14 +1682,27 @@ xfs_fs_fill_super(
"EXPERIMENTAL metadata directory feature in use. Use at your own risk!");
if (xfs_has_reflink(mp)) {
- if (mp->m_sb.sb_rblocks) {
+ /*
+ * Reflink doesn't support rt extent sizes larger than a single
+ * block because we would have to perform unshare-around for
+ * rtext-unaligned write requests.
+ */
+ if (xfs_has_realtime(mp) && mp->m_sb.sb_rextsize != 1) {
xfs_alert(mp,
- "reflink not compatible with realtime device!");
+ "reflink not compatible with realtime extent size %u!",
+ mp->m_sb.sb_rextsize);
error = -EINVAL;
goto out_filestream_unmount;
}
- if (xfs_globals.always_cow) {
+ /*
+ * always-cow mode is not supported on filesystems with rt
+ * extent sizes larger than a single block because we'd have
+ * to perform write-around for unaligned writes because remap
+ * requests must be aligned to an rt extent.
+ */
+ if (xfs_globals.always_cow &&
+ (!xfs_has_realtime(mp) || mp->m_sb.sb_rextsize == 1)) {
xfs_info(mp, "using DEBUG-only always_cow mode.");
mp->m_always_cow = true;
}