xfs: factor out a helper to calculate the end_fsb
authorChristoph Hellwig <hch@lst.de>
Sat, 19 Oct 2019 16:09:44 +0000 (09:09 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 21 Oct 2019 16:04:58 +0000 (09:04 -0700)
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>
Reviewed-by: Allison Collins <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_iomap.c

index 08c0f0a..528b358 100644 (file)
@@ -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)
@@ -1196,8 +1197,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);
        }
 
        /*