Message ID | 20190909182722.16783-14-hch@lst.de (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | [01/19] iomap: better document the IOMAP_F_* flags | expand |
Looks Ok to me: Reviewed-by: Allison Collins <allison.henderson@oracle.com> On 9/9/19 11:27 AM, Christoph Hellwig wrote: > We have lots of places that want to calculate the final fsb for > a offset + count in bytes and check that the result fits into > s_maxbytes. Factor out a helper for that. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > fs/xfs/xfs_iomap.c | 40 ++++++++++++++++++++-------------------- > 1 file changed, 20 insertions(+), 20 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index d12eacdc9bba..0ba67a8d8169 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -102,6 +102,17 @@ xfs_hole_to_iomap( > iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip)); > } > > +static inline xfs_fileoff_t > +xfs_iomap_end_fsb( > + struct xfs_mount *mp, > + loff_t offset, > + loff_t count) > +{ > + ASSERT(offset <= mp->m_super->s_maxbytes); > + return min(XFS_B_TO_FSB(mp, offset + count), > + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > +} > + > xfs_extlen_t > xfs_eof_alignment( > struct xfs_inode *ip, > @@ -172,8 +183,8 @@ xfs_iomap_write_direct( > int nmaps) > { > xfs_mount_t *mp = ip->i_mount; > - xfs_fileoff_t offset_fsb; > - xfs_fileoff_t last_fsb; > + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > + xfs_fileoff_t last_fsb = xfs_iomap_end_fsb(mp, offset, count); > xfs_filblks_t count_fsb, resaligned; > xfs_extlen_t extsz; > int nimaps; > @@ -192,8 +203,6 @@ xfs_iomap_write_direct( > > ASSERT(xfs_isilocked(ip, lockmode)); > > - offset_fsb = XFS_B_TO_FSBT(mp, offset); > - last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); > if ((offset + count) > XFS_ISIZE(ip)) { > /* > * Assert that the in-core extent list is present since this can > @@ -533,9 +542,7 @@ xfs_file_iomap_begin_delay( > struct xfs_inode *ip = XFS_I(inode); > struct xfs_mount *mp = ip->i_mount; > xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > - xfs_fileoff_t maxbytes_fsb = > - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); > - xfs_fileoff_t end_fsb; > + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, count); > struct xfs_bmbt_irec imap, cmap; > struct xfs_iext_cursor icur, ccur; > xfs_fsblock_t prealloc_blocks = 0; > @@ -565,8 +572,6 @@ xfs_file_iomap_begin_delay( > goto out_unlock; > } > > - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); > - > /* > * Search the data fork fork first to look up our source mapping. We > * always need the data fork map, as we have to return it to the > @@ -648,7 +653,7 @@ xfs_file_iomap_begin_delay( > * the lower level functions are updated. > */ > count = min_t(loff_t, count, 1024 * PAGE_SIZE); > - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); > + end_fsb = xfs_iomap_end_fsb(mp, offset, count); > > if (xfs_is_always_cow_inode(ip)) > whichfork = XFS_COW_FORK; > @@ -674,7 +679,8 @@ xfs_file_iomap_begin_delay( > if (align) > p_end_fsb = roundup_64(p_end_fsb, align); > > - p_end_fsb = min(p_end_fsb, maxbytes_fsb); > + p_end_fsb = min(p_end_fsb, > + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > ASSERT(p_end_fsb > offset_fsb); > prealloc_blocks = p_end_fsb - end_fsb; > } > @@ -937,7 +943,8 @@ xfs_file_iomap_begin( > struct xfs_inode *ip = XFS_I(inode); > struct xfs_mount *mp = ip->i_mount; > struct xfs_bmbt_irec imap, cmap; > - xfs_fileoff_t offset_fsb, end_fsb; > + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, length); > int nimaps = 1, error = 0; > bool shared = false; > u16 iomap_flags = 0; > @@ -963,12 +970,6 @@ xfs_file_iomap_begin( > if (error) > return error; > > - ASSERT(offset <= mp->m_super->s_maxbytes); > - if (offset > mp->m_super->s_maxbytes - length) > - length = mp->m_super->s_maxbytes - offset; > - offset_fsb = XFS_B_TO_FSBT(mp, offset); > - end_fsb = XFS_B_TO_FSB(mp, offset + length); > - > error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, > &nimaps, 0); > if (error) > @@ -1189,8 +1190,7 @@ xfs_seek_iomap_begin( > /* > * Fake a hole until the end of the file. > */ > - data_fsb = min(XFS_B_TO_FSB(mp, offset + length), > - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > + data_fsb = xfs_iomap_end_fsb(mp, offset, length); > } > > /* >
On Mon, Sep 09, 2019 at 08:27:16PM +0200, Christoph Hellwig wrote: > We have lots of places that want to calculate the final fsb for > a offset + count in bytes and check that the result fits into > s_maxbytes. Factor out a helper for that. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > fs/xfs/xfs_iomap.c | 40 ++++++++++++++++++++-------------------- > 1 file changed, 20 insertions(+), 20 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index d12eacdc9bba..0ba67a8d8169 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -102,6 +102,17 @@ xfs_hole_to_iomap( > iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip)); > } > > +static inline xfs_fileoff_t > +xfs_iomap_end_fsb( I wonder if this function ought to have a comment that it returns the offset block number of offset + count clamped to the highest offset supported by the page cache, but ... eh. Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --D > + struct xfs_mount *mp, > + loff_t offset, > + loff_t count) > +{ > + ASSERT(offset <= mp->m_super->s_maxbytes); > + return min(XFS_B_TO_FSB(mp, offset + count), > + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > +} > + > xfs_extlen_t > xfs_eof_alignment( > struct xfs_inode *ip, > @@ -172,8 +183,8 @@ xfs_iomap_write_direct( > int nmaps) > { > xfs_mount_t *mp = ip->i_mount; > - xfs_fileoff_t offset_fsb; > - xfs_fileoff_t last_fsb; > + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > + xfs_fileoff_t last_fsb = xfs_iomap_end_fsb(mp, offset, count); > xfs_filblks_t count_fsb, resaligned; > xfs_extlen_t extsz; > int nimaps; > @@ -192,8 +203,6 @@ xfs_iomap_write_direct( > > ASSERT(xfs_isilocked(ip, lockmode)); > > - offset_fsb = XFS_B_TO_FSBT(mp, offset); > - last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); > if ((offset + count) > XFS_ISIZE(ip)) { > /* > * Assert that the in-core extent list is present since this can > @@ -533,9 +542,7 @@ xfs_file_iomap_begin_delay( > struct xfs_inode *ip = XFS_I(inode); > struct xfs_mount *mp = ip->i_mount; > xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > - xfs_fileoff_t maxbytes_fsb = > - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); > - xfs_fileoff_t end_fsb; > + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, count); > struct xfs_bmbt_irec imap, cmap; > struct xfs_iext_cursor icur, ccur; > xfs_fsblock_t prealloc_blocks = 0; > @@ -565,8 +572,6 @@ xfs_file_iomap_begin_delay( > goto out_unlock; > } > > - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); > - > /* > * Search the data fork fork first to look up our source mapping. We > * always need the data fork map, as we have to return it to the > @@ -648,7 +653,7 @@ xfs_file_iomap_begin_delay( > * the lower level functions are updated. > */ > count = min_t(loff_t, count, 1024 * PAGE_SIZE); > - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); > + end_fsb = xfs_iomap_end_fsb(mp, offset, count); > > if (xfs_is_always_cow_inode(ip)) > whichfork = XFS_COW_FORK; > @@ -674,7 +679,8 @@ xfs_file_iomap_begin_delay( > if (align) > p_end_fsb = roundup_64(p_end_fsb, align); > > - p_end_fsb = min(p_end_fsb, maxbytes_fsb); > + p_end_fsb = min(p_end_fsb, > + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > ASSERT(p_end_fsb > offset_fsb); > prealloc_blocks = p_end_fsb - end_fsb; > } > @@ -937,7 +943,8 @@ xfs_file_iomap_begin( > struct xfs_inode *ip = XFS_I(inode); > struct xfs_mount *mp = ip->i_mount; > struct xfs_bmbt_irec imap, cmap; > - xfs_fileoff_t offset_fsb, end_fsb; > + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, length); > int nimaps = 1, error = 0; > bool shared = false; > u16 iomap_flags = 0; > @@ -963,12 +970,6 @@ xfs_file_iomap_begin( > if (error) > return error; > > - ASSERT(offset <= mp->m_super->s_maxbytes); > - if (offset > mp->m_super->s_maxbytes - length) > - length = mp->m_super->s_maxbytes - offset; > - offset_fsb = XFS_B_TO_FSBT(mp, offset); > - end_fsb = XFS_B_TO_FSB(mp, offset + length); > - > error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, > &nimaps, 0); > if (error) > @@ -1189,8 +1190,7 @@ xfs_seek_iomap_begin( > /* > * Fake a hole until the end of the file. > */ > - data_fsb = min(XFS_B_TO_FSB(mp, offset + length), > - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); > + data_fsb = xfs_iomap_end_fsb(mp, offset, length); > } > > /* > -- > 2.20.1 >
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index d12eacdc9bba..0ba67a8d8169 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -102,6 +102,17 @@ xfs_hole_to_iomap( iomap->dax_dev = xfs_find_daxdev_for_inode(VFS_I(ip)); } +static inline xfs_fileoff_t +xfs_iomap_end_fsb( + struct xfs_mount *mp, + loff_t offset, + loff_t count) +{ + ASSERT(offset <= mp->m_super->s_maxbytes); + return min(XFS_B_TO_FSB(mp, offset + count), + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); +} + xfs_extlen_t xfs_eof_alignment( struct xfs_inode *ip, @@ -172,8 +183,8 @@ xfs_iomap_write_direct( int nmaps) { xfs_mount_t *mp = ip->i_mount; - xfs_fileoff_t offset_fsb; - xfs_fileoff_t last_fsb; + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); + xfs_fileoff_t last_fsb = xfs_iomap_end_fsb(mp, offset, count); xfs_filblks_t count_fsb, resaligned; xfs_extlen_t extsz; int nimaps; @@ -192,8 +203,6 @@ xfs_iomap_write_direct( ASSERT(xfs_isilocked(ip, lockmode)); - offset_fsb = XFS_B_TO_FSBT(mp, offset); - last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); if ((offset + count) > XFS_ISIZE(ip)) { /* * Assert that the in-core extent list is present since this can @@ -533,9 +542,7 @@ xfs_file_iomap_begin_delay( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); - xfs_fileoff_t maxbytes_fsb = - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); - xfs_fileoff_t end_fsb; + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, count); struct xfs_bmbt_irec imap, cmap; struct xfs_iext_cursor icur, ccur; xfs_fsblock_t prealloc_blocks = 0; @@ -565,8 +572,6 @@ xfs_file_iomap_begin_delay( goto out_unlock; } - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); - /* * Search the data fork fork first to look up our source mapping. We * always need the data fork map, as we have to return it to the @@ -648,7 +653,7 @@ xfs_file_iomap_begin_delay( * the lower level functions are updated. */ count = min_t(loff_t, count, 1024 * PAGE_SIZE); - end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); + end_fsb = xfs_iomap_end_fsb(mp, offset, count); if (xfs_is_always_cow_inode(ip)) whichfork = XFS_COW_FORK; @@ -674,7 +679,8 @@ xfs_file_iomap_begin_delay( if (align) p_end_fsb = roundup_64(p_end_fsb, align); - p_end_fsb = min(p_end_fsb, maxbytes_fsb); + p_end_fsb = min(p_end_fsb, + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); ASSERT(p_end_fsb > offset_fsb); prealloc_blocks = p_end_fsb - end_fsb; } @@ -937,7 +943,8 @@ xfs_file_iomap_begin( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; struct xfs_bmbt_irec imap, cmap; - xfs_fileoff_t offset_fsb, end_fsb; + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, length); int nimaps = 1, error = 0; bool shared = false; u16 iomap_flags = 0; @@ -963,12 +970,6 @@ xfs_file_iomap_begin( if (error) return error; - ASSERT(offset <= mp->m_super->s_maxbytes); - if (offset > mp->m_super->s_maxbytes - length) - length = mp->m_super->s_maxbytes - offset; - offset_fsb = XFS_B_TO_FSBT(mp, offset); - end_fsb = XFS_B_TO_FSB(mp, offset + length); - error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, &nimaps, 0); if (error) @@ -1189,8 +1190,7 @@ xfs_seek_iomap_begin( /* * Fake a hole until the end of the file. */ - data_fsb = min(XFS_B_TO_FSB(mp, offset + length), - XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)); + data_fsb = xfs_iomap_end_fsb(mp, offset, length); } /*
We have lots of places that want to calculate the final fsb for a offset + count in bytes and check that the result fits into s_maxbytes. Factor out a helper for that. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/xfs/xfs_iomap.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)