Message ID | 20240327110318.2776850-14-hch@lst.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | [01/13] xfs: make XFS_TRANS_LOWMODE match the other XFS_TRANS_ definitions | expand |
On Wed, Mar 27, 2024 at 12:03:18PM +0100, Christoph Hellwig wrote: > 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: Darrick J. Wong <djwong@kernel.org> Looks OK. Reviewed-by: Dave Chinner <dchinner@redhat.com>
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ea48774f6b76d3..aa62fe2ed76834 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -60,7 +60,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; } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index e0c205bcf03404..f6fd9aed3a7f4b 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1000,8 +1000,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; diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 66f8c47642e884..62f91392b281dc 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -521,7 +521,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 diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 86f928d30feda9..b476a876478d93 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -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,