]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: enable realtime reflink xfs-realtime-refcount-rebase
authorDarrick J. Wong <djwong@kernel.org>
Wed, 29 May 2024 04:13:30 +0000 (21:13 -0700)
committerChristoph Hellwig <hch@lst.de>
Mon, 12 Aug 2024 11:53:13 +0000 (13:53 +0200)
Enable reflink for realtime devices, sort of.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_rtalloc.c
fs/xfs/xfs_super.c

index db859d626272d4be18b26937385710786db075af..2facc87a87f05a7e8a4e10c39fad224384828636 100644 (file)
@@ -1224,9 +1224,11 @@ xfs_growfs_rt(
                return -EINVAL;
 
        /* Unsupported realtime features. */
-       if (!xfs_has_rtgroups(mp) && xfs_has_rmapbt(mp))
+       if (!xfs_has_rtgroups(mp) && (xfs_has_rmapbt(mp) || xfs_has_reflink(mp)))
                return -EOPNOTSUPP;
-       if (xfs_has_reflink(mp) || xfs_has_quota(mp))
+       if (xfs_has_quota(mp))
+               return -EOPNOTSUPP;
+       if (xfs_has_reflink(mp) && in->extsize != 1)
                return -EOPNOTSUPP;
 
        error = xfs_sb_validate_fsb_count(&mp->m_sb, in->newblocks);
index b9c65a3f354388d2a53f1dda005beefe5add2715..02e16cb5242967082c737fa205ec63f1b96e9fc0 100644 (file)
@@ -1741,14 +1741,27 @@ xfs_fs_fill_super(
 "EXPERIMENTAL realtime superblock 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;
                }