]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: allow inodes to have the realtime and reflink flags
authorDarrick J. Wong <djwong@kernel.org>
Tue, 15 Oct 2024 19:40:27 +0000 (12:40 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 1 Nov 2024 20:47:10 +0000 (13:47 -0700)
Now that we can share blocks between realtime files, allow this
combination.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/scrub/inode.c
fs/xfs/scrub/inode_repair.c
fs/xfs/xfs_ioctl.c

index 1e2dfd023dcd400c0a108bed474731d9f989b5f2..dbd1334afb701aec5a4a9c2e013f55f72a9f3fdf 100644 (file)
@@ -743,7 +743,8 @@ xfs_dinode_verify(
                return __this_address;
 
        /* don't let reflink and realtime mix */
-       if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME))
+       if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME) &&
+           !xfs_has_rtreflink(mp))
                return __this_address;
 
        /* COW extent size hint validation */
index a6262740251d0c73aba8764ce5060c100c1159f5..162159dd21dbd73efb5d64357353d2c675e3fd91 100644 (file)
@@ -360,8 +360,9 @@ xchk_inode_flags2(
        if ((flags2 & XFS_DIFLAG2_REFLINK) && !S_ISREG(mode))
                goto bad;
 
-       /* realtime and reflink make no sense, currently */
-       if ((flags & XFS_DIFLAG_REALTIME) && (flags2 & XFS_DIFLAG2_REFLINK))
+       /* realtime and reflink don't always go together */
+       if ((flags & XFS_DIFLAG_REALTIME) && (flags2 & XFS_DIFLAG2_REFLINK) &&
+           !xfs_has_rtreflink(mp))
                goto bad;
 
        /* no bigtime iflag without the bigtime feature */
index 7a1433782bcf6d7043c4417ace9b2ffc471aec97..75200609344b1c38e070b82aac22a086cf290a7c 100644 (file)
@@ -564,8 +564,6 @@ xrep_dinode_flags(
                flags2 |= XFS_DIFLAG2_REFLINK;
        else
                flags2 &= ~(XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE);
-       if (flags & XFS_DIFLAG_REALTIME)
-               flags2 &= ~XFS_DIFLAG2_REFLINK;
        if (!xfs_has_bigtime(mp))
                flags2 &= ~XFS_DIFLAG2_BIGTIME;
        if (!xfs_has_large_extent_counts(mp))
@@ -1765,10 +1763,6 @@ xrep_inode_flags(
        /* DAX only applies to files and dirs. */
        if (!(S_ISREG(mode) || S_ISDIR(mode)))
                sc->ip->i_diflags2 &= ~XFS_DIFLAG2_DAX;
-
-       /* No reflink files on the realtime device. */
-       if (sc->ip->i_diflags & XFS_DIFLAG_REALTIME)
-               sc->ip->i_diflags2 &= ~XFS_DIFLAG2_REFLINK;
 }
 
 /*
index 30420b09115e005fdba860c178f4bdd2a6c60440..1e843de4d54bcbd1b621a783c3ba1f9f873134a8 100644 (file)
@@ -541,10 +541,6 @@ xfs_ioctl_setattr_xflags(
                if (mp->m_sb.sb_rblocks == 0 || mp->m_sb.sb_rextsize == 0 ||
                    xfs_extlen_to_rtxmod(mp, ip->i_extsize))
                        return -EINVAL;
-
-               /* Clear reflink if we are actually able to set the rt flag. */
-               if (xfs_is_reflink_inode(ip))
-                       ip->i_diflags2 &= ~XFS_DIFLAG2_REFLINK;
        }
 
        /* diflags2 only valid for v3 inodes. */