xfs: xfs_bmap_punch_delalloc_range() should take a byte range
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>
This commit is contained in:
parent
f43dc4dc3e
commit
7348b32233
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue