]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
xfs: allow inodes to have the realtime and reflink flags
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:21:00 +0000 (16:21 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 23 Dec 2024 21:06:13 +0000 (13:06 -0800)
Now that we can share blocks between realtime files, allow this
combination.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/scrub/inode.c
fs/xfs/scrub/inode_repair.c
fs/xfs/xfs_ioctl.c

index 65eec8f60376d3d41d98f95fa159adcf34b84f51..4273d096fb0a9c3b5369c4156f19adfd80e6268b 100644 (file)
@@ -748,7 +748,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 8e702121dc869919f368e0dec7361fc0807ec4fc..c7bbc3f78e90b17a7725d8bb2c20cd288a8f2906 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 d7e3f033b160738b556d3732d6a06786786c1146..938a18721f3697382168fb9dd38b3856766282e0 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))
@@ -1790,10 +1788,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 0789c18aaa1871a6210a75cadec5a7c29322bef2..4caf29cc59b9efbe908a172111d6468af507b611 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. */