xfs: xfs_bmap_punch_delalloc_range() should take a byte range
authorDave Chinner <dchinner@redhat.com>
Mon, 28 Nov 2022 22:09:17 +0000 (09:09 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 28 Nov 2022 22:09:17 +0000 (09:09 +1100)
All the callers of xfs_bmap_punch_delalloc_range() jump through
hoops to convert a byte range to filesystem blocks before calling
xfs_bmap_punch_delalloc_range(). Instead, pass the byte range to
xfs_bmap_punch_delalloc_range() and have it do the conversion to
filesystem blocks internally.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_aops.c
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_bmap_util.h
fs/xfs/xfs_iomap.c

index 5d1a995..6aadc58 100644 (file)
@@ -114,9 +114,8 @@ xfs_end_ioend(
        if (unlikely(error)) {
                if (ioend->io_flags & IOMAP_F_SHARED) {
                        xfs_reflink_cancel_cow_range(ip, offset, size, true);
-                       xfs_bmap_punch_delalloc_range(ip,
-                                                     XFS_B_TO_FSBT(mp, offset),
-                                                     XFS_B_TO_FSB(mp, size));
+                       xfs_bmap_punch_delalloc_range(ip, offset,
+                                       offset + size);
                }
                goto done;
        }
@@ -455,12 +454,8 @@ xfs_discard_folio(
        struct folio            *folio,
        loff_t                  pos)
 {
-       struct inode            *inode = folio->mapping->host;
-       struct xfs_inode        *ip = XFS_I(inode);
+       struct xfs_inode        *ip = XFS_I(folio->mapping->host);
        struct xfs_mount        *mp = ip->i_mount;
-       size_t                  offset = offset_in_folio(folio, pos);
-       xfs_fileoff_t           start_fsb = XFS_B_TO_FSBT(mp, pos);
-       xfs_fileoff_t           pageoff_fsb = XFS_B_TO_FSBT(mp, offset);
        int                     error;
 
        if (xfs_is_shutdown(mp))
@@ -470,8 +465,9 @@ xfs_discard_folio(
                "page discard on page "PTR_FMT", inode 0x%llx, pos %llu.",
                        folio, ip->i_ino, pos);
 
-       error = xfs_bmap_punch_delalloc_range(ip, start_fsb,
-                       i_blocks_per_folio(inode, folio) - pageoff_fsb);
+       error = xfs_bmap_punch_delalloc_range(ip, pos,
+                       round_up(pos, folio_size(folio)));
+
        if (error && !xfs_is_shutdown(mp))
                xfs_alert(mp, "page discard unable to remove delalloc mapping.");
 }
index 04d0c2b..867645b 100644 (file)
@@ -590,11 +590,13 @@ out_unlock_iolock:
 int
 xfs_bmap_punch_delalloc_range(
        struct xfs_inode        *ip,
-       xfs_fileoff_t           start_fsb,
-       xfs_fileoff_t           length)
+       xfs_off_t               start_byte,
+       xfs_off_t               end_byte)
 {
+       struct xfs_mount        *mp = ip->i_mount;
        struct xfs_ifork        *ifp = &ip->i_df;
-       xfs_fileoff_t           end_fsb = start_fsb + length;
+       xfs_fileoff_t           start_fsb = XFS_B_TO_FSBT(mp, start_byte);
+       xfs_fileoff_t           end_fsb = XFS_B_TO_FSB(mp, end_byte);
        struct xfs_bmbt_irec    got, del;
        struct xfs_iext_cursor  icur;
        int                     error = 0;
@@ -607,7 +609,7 @@ xfs_bmap_punch_delalloc_range(
 
        while (got.br_startoff + got.br_blockcount > start_fsb) {
                del = got;
-               xfs_trim_extent(&del, start_fsb, length);
+               xfs_trim_extent(&del, start_fsb, end_fsb - start_fsb);
 
                /*
                 * A delete can push the cursor forward. Step back to the
index 24b37d2..6888078 100644 (file)
@@ -31,7 +31,7 @@ xfs_bmap_rtalloc(struct xfs_bmalloca *ap)
 #endif /* CONFIG_XFS_RT */
 
 int    xfs_bmap_punch_delalloc_range(struct xfs_inode *ip,
-               xfs_fileoff_t start_fsb, xfs_fileoff_t length);
+               xfs_off_t start_byte, xfs_off_t end_byte);
 
 struct kgetbmap {
        __s64           bmv_offset;     /* file offset of segment in blocks */
index ea96e8a..09676ff 100644 (file)
@@ -1126,12 +1126,8 @@ xfs_buffered_write_delalloc_punch(
        loff_t                  offset,
        loff_t                  length)
 {
-       struct xfs_mount        *mp = XFS_M(inode->i_sb);
-       xfs_fileoff_t           start_fsb = XFS_B_TO_FSBT(mp, offset);
-       xfs_fileoff_t           end_fsb = XFS_B_TO_FSB(mp, offset + length);
-
-       return xfs_bmap_punch_delalloc_range(XFS_I(inode), start_fsb,
-                               end_fsb - start_fsb);
+       return xfs_bmap_punch_delalloc_range(XFS_I(inode), offset,
+                       offset + length);
 }
 
 static int