xfs: reinstate delalloc for RT inodes (if sb_rextsize == 1)
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 11:20:19 +0000 (13:20 +0200)
committerChandan Babu R <chandanbabu@kernel.org>
Mon, 22 Apr 2024 12:30:50 +0000 (18:00 +0530)
Commit aff3a9edb708 ("xfs: Use preallocation for inodes with extsz
hints") disabled delayed allocation for all inodes with extent size
hints due a data exposure problem.  It turns out we fixed this data
exposure problem since by always creating unwritten extents for
delalloc conversions due to more data exposure problems, but the
writeback path doesn't actually support extent size hints when
converting delalloc these days, which probably isn't a problem given
that people using the hints know what they get.

However due to the way how xfs_get_extsz_hint is implemented, it
always claims an extent size hint for RT inodes even if the RT
extent size is a single FSB.  Due to that the above commit effectively
disabled delalloc support for RT inodes.

Switch xfs_get_extsz_hint to return 0 for this case and work around
that in a few places to reinstate delalloc support for RT inodes on
file systems with an sb_rextsize of 1.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
fs/xfs/xfs_inode.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_rtalloc.c

index 2aec7ab59aeb7f3302d193682e1606a365aeb5cc..3c843223b4edd37bc4f569f5df2cf8100636b644 100644 (file)
@@ -58,7 +58,8 @@ xfs_get_extsz_hint(
                return 0;
        if ((ip->i_diflags & XFS_DIFLAG_EXTSIZE) && ip->i_extsize)
                return ip->i_extsize;
-       if (XFS_IS_REALTIME_INODE(ip))
+       if (XFS_IS_REALTIME_INODE(ip) &&
+           ip->i_mount->m_sb.sb_rextsize > 1)
                return ip->i_mount->m_sb.sb_rextsize;
        return 0;
 }
index bba5a0d87d03867e1455f0c045750384ccaf15de..9ce0f6b9df93e6f583f9ac8da19256d359231c3f 100644 (file)
@@ -1001,8 +1001,6 @@ xfs_buffered_write_iomap_begin(
                return xfs_direct_write_iomap_begin(inode, offset, count,
                                flags, iomap, srcmap);
 
-       ASSERT(!XFS_IS_REALTIME_INODE(ip));
-
        error = xfs_qm_dqattach(ip);
        if (error)
                return error;
index 7f0c840f0fd2fb36818d21307d33372e94fae455..ad76704ab1332ffe7290689bacd3dc56112a5b03 100644 (file)
@@ -525,7 +525,7 @@ xfs_stat_blksize(
         * always return the realtime extent size.
         */
        if (XFS_IS_REALTIME_INODE(ip))
-               return XFS_FSB_TO_B(mp, xfs_get_extsz_hint(ip));
+               return XFS_FSB_TO_B(mp, xfs_get_extsz_hint(ip) ? : 1);
 
        /*
         * Allow large block sizes to be reported to userspace programs if the
index 86f928d30feda9f1a1dee6da4efd7e598ca52ebd..b476a876478d93f61eb5018143ae3053588dc25c 100644 (file)
@@ -1341,6 +1341,8 @@ xfs_bmap_rtalloc(
        int                     error;
 
        align = xfs_get_extsz_hint(ap->ip);
+       if (!align)
+               align = 1;
 retry:
        error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev,
                                        align, 1, ap->eof, 0,