]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
xfs: remove xfs_reflink_find_cow_mapping
authorChristoph Hellwig <hch@lst.de>
Thu, 12 Jul 2018 05:26:01 +0000 (22:26 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 12 Jul 2018 05:26:01 +0000 (22:26 -0700)
We only have one caller left, and open coding the simple extent list
lookup in it allows us to make the code both more understandable and
reuse calculations and variables already present.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_aops.c
fs/xfs/xfs_reflink.c
fs/xfs/xfs_reflink.h
fs/xfs/xfs_trace.h

index 815b0b29438b1fc682a4d1cb2ac180a175e2ff22..5c5d8c832dcc2a43b6c14c50cfbb7c697eb045b3 100644 (file)
@@ -370,9 +370,10 @@ xfs_map_blocks(
        struct xfs_inode        *ip = XFS_I(inode);
        struct xfs_mount        *mp = ip->i_mount;
        ssize_t                 count = i_blocksize(inode);
-       xfs_fileoff_t           offset_fsb = XFS_B_TO_FSBT(mp, offset), end_fsb;
+       xfs_fileoff_t           offset_fsb, end_fsb;
        struct xfs_bmbt_irec    imap;
        int                     whichfork = XFS_DATA_FORK;
+       struct xfs_iext_cursor  icur;
        int                     error = 0;
        int                     nimaps = 1;
 
@@ -384,8 +385,18 @@ xfs_map_blocks(
               (ip->i_df.if_flags & XFS_IFEXTENTS));
        ASSERT(offset <= mp->m_super->s_maxbytes);
 
+       if (offset > mp->m_super->s_maxbytes - count)
+               count = mp->m_super->s_maxbytes - offset;
+       end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count);
+       offset_fsb = XFS_B_TO_FSBT(mp, offset);
+
+       /*
+        * Check if this is offset is covered by a COW extents, and if yes use
+        * it directly instead of looking up anything in the data fork.
+        */
        if (xfs_is_reflink_inode(ip) &&
-           xfs_reflink_find_cow_mapping(ip, offset, &imap)) {
+           xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &imap) &&
+           imap.br_startoff <= offset_fsb) {
                xfs_iunlock(ip, XFS_ILOCK_SHARED);
                /*
                 * Truncate can race with writeback since writeback doesn't
@@ -420,10 +431,6 @@ xfs_map_blocks(
         * offset.  This will convert delayed allocations (including COW ones)
         * into real extents.
         */
-       if (offset > mp->m_super->s_maxbytes - count)
-               count = mp->m_super->s_maxbytes - offset;
-       end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count);
-       offset_fsb = XFS_B_TO_FSBT(mp, offset);
        error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb,
                                &imap, &nimaps, XFS_BMAPI_ENTIRE);
        xfs_iunlock(ip, XFS_ILOCK_SHARED);
index 22c11b98ab261259097984bf129074228d7a3fa2..49e4913fa779cd6ac285aea6326ad29a97468d9e 100644 (file)
@@ -470,36 +470,6 @@ out:
        return error;
 }
 
-/*
- * Find the CoW reservation for a given byte offset of a file.
- */
-bool
-xfs_reflink_find_cow_mapping(
-       struct xfs_inode                *ip,
-       xfs_off_t                       offset,
-       struct xfs_bmbt_irec            *imap)
-{
-       struct xfs_ifork                *ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK);
-       xfs_fileoff_t                   offset_fsb;
-       struct xfs_bmbt_irec            got;
-       struct xfs_iext_cursor          icur;
-
-       ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL | XFS_ILOCK_SHARED));
-
-       if (!xfs_is_reflink_inode(ip))
-               return false;
-       offset_fsb = XFS_B_TO_FSBT(ip->i_mount, offset);
-       if (!xfs_iext_lookup_extent(ip, ifp, offset_fsb, &icur, &got))
-               return false;
-       if (got.br_startoff > offset_fsb)
-               return false;
-
-       trace_xfs_reflink_find_cow_mapping(ip, offset, 1, XFS_IO_OVERWRITE,
-                       &got);
-       *imap = got;
-       return true;
-}
-
 /*
  * Cancel CoW reservations for some block range of an inode.
  *
index 6f9f98894abc170980f4171b226ea79b9ce858b0..c585ad9552b23ff375fd40c21a6aadab694b8e14 100644 (file)
@@ -18,8 +18,6 @@ extern int xfs_reflink_allocate_cow(struct xfs_inode *ip,
                struct xfs_bmbt_irec *imap, bool *shared, uint *lockmode);
 extern int xfs_reflink_convert_cow(struct xfs_inode *ip, xfs_off_t offset,
                xfs_off_t count);
-extern bool xfs_reflink_find_cow_mapping(struct xfs_inode *ip, xfs_off_t offset,
-               struct xfs_bmbt_irec *imap);
 
 extern int xfs_reflink_cancel_cow_blocks(struct xfs_inode *ip,
                struct xfs_trans **tpp, xfs_fileoff_t offset_fsb,
index a5b01529ecf638d8fb414c20a1ae9fbfb2730210..1af123df19b534303f863dab8d5b91b56df94a26 100644 (file)
@@ -3215,7 +3215,6 @@ DEFINE_INODE_IREC_EVENT(xfs_reflink_convert_cow);
 DEFINE_RW_EVENT(xfs_reflink_reserve_cow);
 
 DEFINE_SIMPLE_IO_EVENT(xfs_reflink_bounce_dio_write);
-DEFINE_IOMAP_EVENT(xfs_reflink_find_cow_mapping);
 
 DEFINE_SIMPLE_IO_EVENT(xfs_reflink_cancel_cow_range);
 DEFINE_SIMPLE_IO_EVENT(xfs_reflink_end_cow);