xfs: remove all boilerplate defer init/finish code
authorBrian Foster <bfoster@redhat.com>
Tue, 24 Jul 2018 20:43:13 +0000 (13:43 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 26 Jul 2018 17:15:15 +0000 (10:15 -0700)
At this point, the transaction subsystem completely manages deferred
items internally such that the common and boilerplate
xfs_trans_alloc() -> xfs_defer_init() -> xfs_defer_finish() ->
xfs_trans_commit() sequence can be replaced with a simple
transaction allocation and commit.

Remove all such boilerplate deferred ops code. In doing so, we
change each case over to use the dfops in the transaction and
specifically eliminate:

- The on-stack dfops and associated xfs_defer_init() call, as the
  internal dfops is initialized on transaction allocation.
- xfs_bmap_finish() calls that precede a final xfs_trans_commit() of
  a transaction.
- xfs_defer_cancel() calls in error handlers that precede a
  transaction cancel.

The only deferred ops calls that remain are those that are
non-deterministic with respect to the final commit of the associated
transaction or are open-coded due to special handling.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
13 files changed:
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_refcount.c
fs/xfs/xfs_attr_inactive.c
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_dquot.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_qm_syscalls.c
fs/xfs/xfs_reflink.c
fs/xfs/xfs_rtalloc.c
fs/xfs/xfs_symlink.c

index 6bc0cdf..92cd064 100644 (file)
@@ -1018,7 +1018,6 @@ xfs_bmap_add_attrfork(
        int                     size,           /* space new attribute needs */
        int                     rsvd)           /* xact may use reserved blks */
 {
-       struct xfs_defer_ops    dfops;          /* freed extent records */
        xfs_mount_t             *mp;            /* mount structure */
        xfs_trans_t             *tp;            /* transaction pointer */
        int                     blks;           /* space reservation */
@@ -1037,7 +1036,6 @@ xfs_bmap_add_attrfork(
                        rsvd ? XFS_TRANS_RESERVE : 0, &tp);
        if (error)
                return error;
-       xfs_defer_init(tp, &dfops);
 
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ?
@@ -1102,7 +1100,7 @@ xfs_bmap_add_attrfork(
        if (logflags)
                xfs_trans_log_inode(tp, ip, logflags);
        if (error)
-               goto bmap_cancel;
+               goto trans_cancel;
        if (!xfs_sb_version_hasattr(&mp->m_sb) ||
           (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) {
                bool log_sb = false;
@@ -1121,15 +1119,10 @@ xfs_bmap_add_attrfork(
                        xfs_log_sb(tp);
        }
 
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error)
-               goto bmap_cancel;
        error = xfs_trans_commit(tp);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        return error;
 
-bmap_cancel:
-       xfs_defer_cancel(&dfops);
 trans_cancel:
        xfs_trans_cancel(tp);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
@@ -5953,14 +5946,12 @@ xfs_bmap_split_extent(
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        int                     error;
 
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write,
                        XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, 0, &tp);
        if (error)
                return error;
-       xfs_defer_init(tp, &dfops);
 
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
@@ -5969,14 +5960,9 @@ xfs_bmap_split_extent(
        if (error)
                goto out;
 
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error)
-               goto out;
-
        return xfs_trans_commit(tp);
 
 out:
-       xfs_defer_cancel(&dfops);
        xfs_trans_cancel(tp);
        return error;
 }
index 9ef1f44..4cbc2ef 100644 (file)
@@ -1635,7 +1635,6 @@ xfs_refcount_recover_cow_leftovers(
        struct list_head                debris;
        union xfs_btree_irec            low;
        union xfs_btree_irec            high;
-       struct xfs_defer_ops            dfops;
        xfs_fsblock_t                   fsb;
        xfs_agblock_t                   agbno;
        int                             error;
@@ -1691,22 +1690,17 @@ xfs_refcount_recover_cow_leftovers(
                trace_xfs_refcount_recover_extent(mp, agno, &rr->rr_rrec);
 
                /* Free the orphan record */
-               xfs_defer_init(tp, &dfops);
                agbno = rr->rr_rrec.rc_startblock - XFS_REFC_COW_START;
                fsb = XFS_AGB_TO_FSB(mp, agno, agbno);
                error = xfs_refcount_free_cow_extent(mp, tp->t_dfops, fsb,
                                rr->rr_rrec.rc_blockcount);
                if (error)
-                       goto out_defer;
+                       goto out_trans;
 
                /* Free the block. */
                xfs_bmap_add_free(mp, tp->t_dfops, fsb,
                                rr->rr_rrec.rc_blockcount, NULL);
 
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto out_defer;
-
                error = xfs_trans_commit(tp);
                if (error)
                        goto out_free;
@@ -1716,8 +1710,6 @@ xfs_refcount_recover_cow_leftovers(
        }
 
        return error;
-out_defer:
-       xfs_defer_cancel(tp->t_dfops);
 out_trans:
        xfs_trans_cancel(tp);
 out_free:
index d305597..228821b 100644 (file)
@@ -382,7 +382,6 @@ xfs_attr_inactive(
 {
        struct xfs_trans        *trans;
        struct xfs_mount        *mp;
-       struct xfs_defer_ops    dfops;
        int                     lock_mode = XFS_ILOCK_SHARED;
        int                     error = 0;
 
@@ -399,7 +398,6 @@ xfs_attr_inactive(
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_attrinval, 0, 0, 0, &trans);
        if (error)
                goto out_destroy_fork;
-       xfs_defer_init(trans, &dfops);
 
        lock_mode = XFS_ILOCK_EXCL;
        xfs_ilock(dp, lock_mode);
index 1a4617c..ddb5f12 100644 (file)
@@ -792,7 +792,6 @@ xfs_free_eofblocks(
        int                     nimaps;
        struct xfs_bmbt_irec    imap;
        struct xfs_mount        *mp = ip->i_mount;
-       struct xfs_defer_ops    dfops;
 
        /*
         * Figure out if there are any blocks beyond the end
@@ -832,7 +831,6 @@ xfs_free_eofblocks(
                        ASSERT(XFS_FORCED_SHUTDOWN(mp));
                        return error;
                }
-               xfs_defer_init(tp, &dfops);
 
                xfs_ilock(ip, XFS_ILOCK_EXCL);
                xfs_trans_ijoin(tp, ip, 0);
@@ -880,7 +878,6 @@ xfs_alloc_file_space(
        int                     rt;
        xfs_trans_t             *tp;
        xfs_bmbt_irec_t         imaps[1], *imapp;
-       struct xfs_defer_ops    dfops;
        uint                    qblocks, resblks, resrtextents;
        int                     error;
 
@@ -973,7 +970,6 @@ xfs_alloc_file_space(
 
                xfs_trans_ijoin(tp, ip, 0);
 
-               xfs_defer_init(tp, &dfops);
                error = xfs_bmapi_write(tp, ip, startoffset_fsb,
                                        allocatesize_fsb, alloc_type, resblks,
                                        imapp, &nimaps);
@@ -983,10 +979,6 @@ xfs_alloc_file_space(
                /*
                 * Complete the transaction
                 */
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto error0;
-
                error = xfs_trans_commit(tp);
                xfs_iunlock(ip, XFS_ILOCK_EXCL);
                if (error)
@@ -1005,8 +997,7 @@ xfs_alloc_file_space(
 
        return error;
 
-error0:        /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */
-       xfs_defer_cancel(&dfops);
+error0:        /* unlock inode, unreserve quota blocks, cancel trans */
        xfs_trans_unreserve_quota_nblks(tp, ip, (long)qblocks, 0, quota_flag);
 
 error1:        /* Just cancel transaction */
@@ -1024,7 +1015,6 @@ xfs_unmap_extent(
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        uint                    resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
        int                     error;
 
@@ -1042,23 +1032,17 @@ xfs_unmap_extent(
 
        xfs_trans_ijoin(tp, ip, 0);
 
-       xfs_defer_init(tp, &dfops);
        error = xfs_bunmapi(tp, ip, startoffset_fsb, len_fsb, 0, 2, done);
        if (error)
-               goto out_bmap_cancel;
+               goto out_trans_cancel;
 
        xfs_defer_ijoin(tp->t_dfops, ip);
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto out_bmap_cancel;
 
        error = xfs_trans_commit(tp);
 out_unlock:
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        return error;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
 out_trans_cancel:
        xfs_trans_cancel(tp);
        goto out_unlock;
@@ -1310,7 +1294,6 @@ xfs_collapse_file_space(
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
        int                     error;
-       struct xfs_defer_ops    dfops;
        xfs_fileoff_t           next_fsb = XFS_B_TO_FSB(mp, offset + len);
        xfs_fileoff_t           shift_fsb = XFS_B_TO_FSB(mp, len);
        uint                    resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
@@ -1343,22 +1326,16 @@ xfs_collapse_file_space(
                        goto out_trans_cancel;
                xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 
-               xfs_defer_init(tp, &dfops);
                error = xfs_bmap_collapse_extents(tp, ip, &next_fsb, shift_fsb,
                                &done);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto out_bmap_cancel;
                error = xfs_trans_commit(tp);
        }
 
        return error;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
 out_trans_cancel:
        xfs_trans_cancel(tp);
        return error;
@@ -1385,7 +1362,6 @@ xfs_insert_file_space(
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
        int                     error;
-       struct xfs_defer_ops    dfops;
        xfs_fileoff_t           stop_fsb = XFS_B_TO_FSB(mp, offset);
        xfs_fileoff_t           next_fsb = NULLFSBLOCK;
        xfs_fileoff_t           shift_fsb = XFS_B_TO_FSB(mp, len);
@@ -1421,22 +1397,17 @@ xfs_insert_file_space(
 
                xfs_ilock(ip, XFS_ILOCK_EXCL);
                xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
-               xfs_defer_init(tp, &dfops);
                error = xfs_bmap_insert_extents(tp, ip, &next_fsb, shift_fsb,
                                &done, stop_fsb);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto out_bmap_cancel;
                error = xfs_trans_commit(tp);
        }
 
        return error;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
+out_trans_cancel:
        xfs_trans_cancel(tp);
        return error;
 }
@@ -1607,7 +1578,7 @@ xfs_swap_extent_rmap(
 
                /* Unmap the old blocks in the source file. */
                while (tirec.br_blockcount) {
-                       xfs_defer_init(tp, tp->t_dfops);
+                       ASSERT(tp->t_firstblock == NULLFSBLOCK);
                        trace_xfs_swap_extent_rmap_remap_piece(tip, &tirec);
 
                        /* Read extent from the source file */
@@ -1831,7 +1802,6 @@ xfs_swap_extents(
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        struct xfs_bstat        *sbp = &sxp->sx_stat;
        int                     src_log_flags, target_log_flags;
        int                     error = 0;
@@ -1900,7 +1870,6 @@ xfs_swap_extents(
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, &tp);
        if (error)
                goto out_unlock;
-       xfs_defer_init(tp, &dfops);
 
        /*
         * Lock and join the inodes to the tansaction so that transaction commit
index c53de34..a57d5e8 100644 (file)
@@ -295,8 +295,6 @@ xfs_dquot_disk_alloc(
 
        trace_xfs_dqalloc(dqp);
 
-       xfs_defer_init(tp, tp->t_dfops);
-
        xfs_ilock(quotip, XFS_ILOCK_EXCL);
        if (!xfs_this_quota_on(dqp->q_mount, dqp->dq_flags)) {
                /*
@@ -538,7 +536,6 @@ xfs_qm_dqread_alloc(
        struct xfs_buf          **bpp)
 {
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        struct xfs_buf          *bp;
        int                     error;
 
@@ -546,7 +543,6 @@ xfs_qm_dqread_alloc(
                        XFS_QM_DQALLOC_SPACE_RES(mp), 0, 0, &tp);
        if (error)
                goto err;
-       xfs_defer_init(tp, &dfops);
 
        error = xfs_dquot_disk_alloc(&tp, dqp, &bp);
        if (error)
index 7d7d7e9..c47183a 100644 (file)
@@ -1142,7 +1142,6 @@ xfs_create(
        struct xfs_inode        *ip = NULL;
        struct xfs_trans        *tp = NULL;
        int                     error;
-       struct xfs_defer_ops    dfops;
        bool                    unlock_dp_on_error = false;
        prid_t                  prid;
        struct xfs_dquot        *udqp = NULL;
@@ -1194,8 +1193,6 @@ xfs_create(
        xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT);
        unlock_dp_on_error = true;
 
-       xfs_defer_init(tp, &dfops);
-
        /*
         * Reserve disk quota and the inode.
         */
@@ -1236,11 +1233,11 @@ xfs_create(
        if (is_dir) {
                error = xfs_dir_init(tp, ip, dp);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
                error = xfs_bumplink(tp, dp);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
        }
 
        /*
@@ -1258,10 +1255,6 @@ xfs_create(
         */
        xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp);
 
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error)
-               goto out_bmap_cancel;
-
        error = xfs_trans_commit(tp);
        if (error)
                goto out_release_inode;
@@ -1273,8 +1266,6 @@ xfs_create(
        *ipp = ip;
        return 0;
 
- out_bmap_cancel:
-       xfs_defer_cancel(&dfops);
  out_trans_cancel:
        xfs_trans_cancel(tp);
  out_release_inode:
@@ -1399,7 +1390,6 @@ xfs_link(
        xfs_mount_t             *mp = tdp->i_mount;
        xfs_trans_t             *tp;
        int                     error;
-       struct xfs_defer_ops    dfops;
        int                     resblks;
 
        trace_xfs_link(tdp, target_name);
@@ -1448,8 +1438,6 @@ xfs_link(
                        goto error_return;
        }
 
-       xfs_defer_init(tp, &dfops);
-
        /*
         * Handle initial link state of O_TMPFILE inode
         */
@@ -1478,12 +1466,6 @@ xfs_link(
        if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
                xfs_trans_set_sync(tp);
 
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error) {
-               xfs_defer_cancel(&dfops);
-               goto error_return;
-       }
-
        return xfs_trans_commit(tp);
 
  error_return:
@@ -1719,7 +1701,6 @@ xfs_inactive_truncate(
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        int                     error;
 
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
@@ -1727,8 +1708,6 @@ xfs_inactive_truncate(
                ASSERT(XFS_FORCED_SHUTDOWN(mp));
                return error;
        }
-       xfs_defer_init(tp, &dfops);
-
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, ip, 0);
 
@@ -1769,7 +1748,6 @@ STATIC int
 xfs_inactive_ifree(
        struct xfs_inode *ip)
 {
-       struct xfs_defer_ops    dfops;
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
        int                     error;
@@ -1806,7 +1784,6 @@ xfs_inactive_ifree(
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, ip, 0);
 
-       xfs_defer_init(tp, &dfops);
        error = xfs_ifree(tp, ip);
        if (error) {
                /*
@@ -1833,12 +1810,6 @@ xfs_inactive_ifree(
         * Just ignore errors at this point.  There is nothing we can do except
         * to try to keep going. Make sure it's not a silent error.
         */
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error) {
-               xfs_notice(mp, "%s: xfs_defer_finish returned error %d",
-                       __func__, error);
-               xfs_defer_cancel(&dfops);
-       }
        error = xfs_trans_commit(tp);
        if (error)
                xfs_notice(mp, "%s: xfs_trans_commit returned error %d",
@@ -2569,7 +2540,6 @@ xfs_remove(
        xfs_trans_t             *tp = NULL;
        int                     is_dir = S_ISDIR(VFS_I(ip)->i_mode);
        int                     error = 0;
-       struct xfs_defer_ops    dfops;
        uint                    resblks;
 
        trace_xfs_remove(dp, name);
@@ -2649,11 +2619,10 @@ xfs_remove(
        if (error)
                goto out_trans_cancel;
 
-       xfs_defer_init(tp, &dfops);
        error = xfs_dir_removename(tp, dp, name, ip->i_ino, resblks);
        if (error) {
                ASSERT(error != -ENOENT);
-               goto out_bmap_cancel;
+               goto out_trans_cancel;
        }
 
        /*
@@ -2664,10 +2633,6 @@ xfs_remove(
        if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
                xfs_trans_set_sync(tp);
 
-       error = xfs_defer_finish(&tp, &dfops);
-       if (error)
-               goto out_bmap_cancel;
-
        error = xfs_trans_commit(tp);
        if (error)
                goto std_return;
@@ -2677,8 +2642,6 @@ xfs_remove(
 
        return 0;
 
- out_bmap_cancel:
-       xfs_defer_cancel(&dfops);
  out_trans_cancel:
        xfs_trans_cancel(tp);
  std_return:
@@ -2740,9 +2703,6 @@ static int
 xfs_finish_rename(
        struct xfs_trans        *tp)
 {
-       struct xfs_defer_ops    *dfops = tp->t_dfops;
-       int                     error;
-
        /*
         * If this is a synchronous mount, make sure that the rename transaction
         * goes to disk before returning to the user.
@@ -2750,13 +2710,6 @@ xfs_finish_rename(
        if (tp->t_mountp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC))
                xfs_trans_set_sync(tp);
 
-       error = xfs_defer_finish(&tp, dfops);
-       if (error) {
-               xfs_defer_cancel(dfops);
-               xfs_trans_cancel(tp);
-               return error;
-       }
-
        return xfs_trans_commit(tp);
 }
 
@@ -2869,7 +2822,6 @@ xfs_cross_rename(
        return xfs_finish_rename(tp);
 
 out_trans_abort:
-       xfs_defer_cancel(tp->t_dfops);
        xfs_trans_cancel(tp);
        return error;
 }
@@ -2924,7 +2876,6 @@ xfs_rename(
 {
        struct xfs_mount        *mp = src_dp->i_mount;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        struct xfs_inode        *wip = NULL;            /* whiteout inode */
        struct xfs_inode        *inodes[__XFS_SORT_INODES];
        int                     num_inodes = __XFS_SORT_INODES;
@@ -3006,8 +2957,6 @@ xfs_rename(
                goto out_trans_cancel;
        }
 
-       xfs_defer_init(tp, &dfops);
-
        /* RENAME_EXCHANGE is unique from here on. */
        if (flags & RENAME_EXCHANGE)
                return xfs_cross_rename(tp, src_dp, src_name, src_ip,
@@ -3035,7 +2984,7 @@ xfs_rename(
                error = xfs_dir_createname(tp, target_dp, target_name,
                                           src_ip->i_ino, spaceres);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
                xfs_trans_ichgtime(tp, target_dp,
                                        XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -3043,7 +2992,7 @@ xfs_rename(
                if (new_parent && src_is_directory) {
                        error = xfs_bumplink(tp, target_dp);
                        if (error)
-                               goto out_bmap_cancel;
+                               goto out_trans_cancel;
                }
        } else { /* target_ip != NULL */
                /*
@@ -3074,7 +3023,7 @@ xfs_rename(
                error = xfs_dir_replace(tp, target_dp, target_name,
                                        src_ip->i_ino, spaceres);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
                xfs_trans_ichgtime(tp, target_dp,
                                        XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -3085,7 +3034,7 @@ xfs_rename(
                 */
                error = xfs_droplink(tp, target_ip);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
                if (src_is_directory) {
                        /*
@@ -3093,7 +3042,7 @@ xfs_rename(
                         */
                        error = xfs_droplink(tp, target_ip);
                        if (error)
-                               goto out_bmap_cancel;
+                               goto out_trans_cancel;
                }
        } /* target_ip != NULL */
 
@@ -3109,7 +3058,7 @@ xfs_rename(
                                        target_dp->i_ino, spaceres);
                ASSERT(error != -EEXIST);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
        }
 
        /*
@@ -3135,7 +3084,7 @@ xfs_rename(
                 */
                error = xfs_droplink(tp, src_dp);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
        }
 
        /*
@@ -3150,7 +3099,7 @@ xfs_rename(
                error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
                                           spaceres);
        if (error)
-               goto out_bmap_cancel;
+               goto out_trans_cancel;
 
        /*
         * For whiteouts, we need to bump the link count on the whiteout inode.
@@ -3164,10 +3113,10 @@ xfs_rename(
                ASSERT(VFS_I(wip)->i_nlink == 0);
                error = xfs_bumplink(tp, wip);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
                error = xfs_iunlink_remove(tp, wip);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
                xfs_trans_log_inode(tp, wip, XFS_ILOG_CORE);
 
                /*
@@ -3188,8 +3137,6 @@ xfs_rename(
                IRELE(wip);
        return error;
 
-out_bmap_cancel:
-       xfs_defer_cancel(&dfops);
 out_trans_cancel:
        xfs_trans_cancel(tp);
 out_release_wip:
index 7566942..8e8ca9f 100644 (file)
@@ -157,7 +157,6 @@ xfs_iomap_write_direct(
        int             quota_flag;
        int             rt;
        xfs_trans_t     *tp;
-       struct xfs_defer_ops dfops;
        uint            qblocks, resblks, resrtextents;
        int             error;
        int             lockmode;
@@ -253,20 +252,15 @@ xfs_iomap_write_direct(
         * From this point onwards we overwrite the imap pointer that the
         * caller gave to us.
         */
-       xfs_defer_init(tp, &dfops);
        nimaps = 1;
        error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb,
                                bmapi_flags, resblks, imap, &nimaps);
        if (error)
-               goto out_bmap_cancel;
+               goto out_res_cancel;
 
        /*
         * Complete the transaction
         */
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto out_bmap_cancel;
-
        error = xfs_trans_commit(tp);
        if (error)
                goto out_unlock;
@@ -286,8 +280,7 @@ out_unlock:
        xfs_iunlock(ip, lockmode);
        return error;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
+out_res_cancel:
        xfs_trans_unreserve_quota_nblks(tp, ip, (long)qblocks, 0, quota_flag);
 out_trans_cancel:
        xfs_trans_cancel(tp);
@@ -663,7 +656,6 @@ xfs_iomap_write_allocate(
        xfs_mount_t     *mp = ip->i_mount;
        xfs_fileoff_t   offset_fsb, last_block;
        xfs_fileoff_t   end_fsb, map_start_fsb;
-       struct xfs_defer_ops    dfops;
        xfs_filblks_t   count_fsb;
        xfs_trans_t     *tp;
        int             nimaps;
@@ -713,8 +705,6 @@ xfs_iomap_write_allocate(
                        xfs_ilock(ip, XFS_ILOCK_EXCL);
                        xfs_trans_ijoin(tp, ip, 0);
 
-                       xfs_defer_init(tp, &dfops);
-
                        /*
                         * it is possible that the extents have changed since
                         * we did the read call as we dropped the ilock for a
@@ -772,10 +762,6 @@ xfs_iomap_write_allocate(
                        if (error)
                                goto trans_cancel;
 
-                       error = xfs_defer_finish(&tp, tp->t_dfops);
-                       if (error)
-                               goto trans_cancel;
-
                        error = xfs_trans_commit(tp);
                        if (error)
                                goto error0;
@@ -806,7 +792,6 @@ xfs_iomap_write_allocate(
        }
 
 trans_cancel:
-       xfs_defer_cancel(tp->t_dfops);
        xfs_trans_cancel(tp);
 error0:
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
@@ -827,7 +812,6 @@ xfs_iomap_write_unwritten(
        int             nimaps;
        xfs_trans_t     *tp;
        xfs_bmbt_irec_t imap;
-       struct xfs_defer_ops dfops;
        struct inode    *inode = VFS_I(ip);
        xfs_fsize_t     i_size;
        uint            resblks;
@@ -872,7 +856,6 @@ xfs_iomap_write_unwritten(
                /*
                 * Modify the unwritten extent state of the buffer.
                 */
-               xfs_defer_init(tp, &dfops);
                nimaps = 1;
                error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb,
                                        XFS_BMAPI_CONVERT, resblks, &imap,
@@ -896,10 +879,6 @@ xfs_iomap_write_unwritten(
                        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
                }
 
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto error_on_bmapi_transaction;
-
                error = xfs_trans_commit(tp);
                xfs_iunlock(ip, XFS_ILOCK_EXCL);
                if (error)
@@ -923,7 +902,6 @@ xfs_iomap_write_unwritten(
        return 0;
 
 error_on_bmapi_transaction:
-       xfs_defer_cancel(tp->t_dfops);
        xfs_trans_cancel(tp);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        return error;
index 704b57a..2eac22b 100644 (file)
@@ -813,7 +813,6 @@ xfs_setattr_size(
        struct inode            *inode = VFS_I(ip);
        xfs_off_t               oldsize, newsize;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        int                     error;
        uint                    lock_flags = 0;
        bool                    did_zeroing = false;
@@ -917,7 +916,6 @@ xfs_setattr_size(
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp);
        if (error)
                return error;
-       xfs_defer_init(tp, &dfops);
 
        lock_flags |= XFS_ILOCK_EXCL;
        xfs_ilock(ip, XFS_ILOCK_EXCL);
index 958e9b9..265e1f5 100644 (file)
@@ -4857,15 +4857,7 @@ xlog_finish_defer_ops(
        /* transfer all collected dfops to this transaction */
        xfs_defer_move(tp->t_dfops, dfops);
 
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto out_cancel;
-
        return xfs_trans_commit(tp);
-
-out_cancel:
-       xfs_trans_cancel(tp);
-       return error;
 }
 
 /*
index df07833..c07c5a3 100644 (file)
@@ -214,7 +214,6 @@ xfs_qm_scall_trunc_qfile(
 {
        struct xfs_inode        *ip;
        struct xfs_trans        *tp;
-       struct xfs_defer_ops    dfops;
        int                     error;
 
        if (ino == NULLFSINO)
@@ -231,7 +230,6 @@ xfs_qm_scall_trunc_qfile(
                xfs_iunlock(ip, XFS_IOLOCK_EXCL);
                goto out_put;
        }
-       xfs_defer_init(tp, &dfops);
 
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, ip, 0);
index 04c25ee..a653739 100644 (file)
@@ -364,7 +364,6 @@ xfs_reflink_allocate_cow(
        xfs_fileoff_t           offset_fsb = imap->br_startoff;
        xfs_filblks_t           count_fsb = imap->br_blockcount;
        struct xfs_bmbt_irec    got;
-       struct xfs_defer_ops    dfops;
        struct xfs_trans        *tp = NULL;
        int                     nimaps, error = 0;
        bool                    trimmed;
@@ -424,7 +423,6 @@ retry:
 
        xfs_trans_ijoin(tp, ip, 0);
 
-       xfs_defer_init(tp, &dfops);
        nimaps = 1;
 
        /* Allocate the entire reservation as unwritten blocks. */
@@ -432,15 +430,11 @@ retry:
                        XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC,
                        resblks, imap, &nimaps);
        if (error)
-               goto out_bmap_cancel;
+               goto out_trans_cancel;
 
        xfs_inode_set_cowblocks_tag(ip);
 
        /* Finish up. */
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto out_bmap_cancel;
-
        error = xfs_trans_commit(tp);
        if (error)
                return error;
@@ -453,8 +447,7 @@ retry:
                return -ENOSPC;
 convert:
        return xfs_reflink_convert_cow_extent(ip, imap, offset_fsb, count_fsb);
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
+out_trans_cancel:
        xfs_trans_unreserve_quota_nblks(tp, ip, (long)resblks, 0,
                        XFS_QMOPT_RES_REGBLKS);
 out:
@@ -624,7 +617,6 @@ xfs_reflink_end_cow(
        struct xfs_trans                *tp;
        xfs_fileoff_t                   offset_fsb;
        xfs_fileoff_t                   end_fsb;
-       struct xfs_defer_ops            dfops;
        int                             error;
        unsigned int                    resblks;
        xfs_filblks_t                   rlen;
@@ -691,11 +683,11 @@ xfs_reflink_end_cow(
                        goto prev_extent;
 
                /* Unmap the old blocks in the data fork. */
-               xfs_defer_init(tp, &dfops);
+               ASSERT(tp->t_dfops && tp->t_firstblock == NULLFSBLOCK);
                rlen = del.br_blockcount;
                error = __xfs_bunmapi(tp, ip, del.br_startoff, &rlen, 0, 1);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /* Trim the extent to whatever got unmapped. */
                if (rlen) {
@@ -708,13 +700,13 @@ xfs_reflink_end_cow(
                error = xfs_refcount_free_cow_extent(tp->t_mountp, tp->t_dfops,
                                del.br_startblock, del.br_blockcount);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /* Map the new blocks into the data fork. */
                error = xfs_bmap_map_extent(tp->t_mountp, tp->t_dfops, ip,
                                            &del);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /* Charge this new data fork mapping to the on-disk quota. */
                xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_DELBCOUNT,
@@ -726,7 +718,7 @@ xfs_reflink_end_cow(
                xfs_defer_ijoin(tp->t_dfops, ip);
                error = xfs_defer_finish(&tp, tp->t_dfops);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
                if (!xfs_iext_get_extent(ifp, &icur, &got))
                        break;
                continue;
@@ -741,8 +733,6 @@ prev_extent:
                goto out;
        return 0;
 
-out_defer:
-       xfs_defer_cancel(tp->t_dfops);
 out_cancel:
        xfs_trans_cancel(tp);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
@@ -998,7 +988,6 @@ xfs_reflink_remap_extent(
        bool                    real_extent = xfs_bmap_is_real_extent(irec);
        struct xfs_trans        *tp;
        unsigned int            resblks;
-       struct xfs_defer_ops    dfops;
        struct xfs_bmbt_irec    uirec;
        xfs_filblks_t           rlen;
        xfs_filblks_t           unmap_len;
@@ -1039,10 +1028,10 @@ xfs_reflink_remap_extent(
        /* Unmap the old blocks in the data fork. */
        rlen = unmap_len;
        while (rlen) {
-               xfs_defer_init(tp, &dfops);
+               ASSERT(tp->t_dfops && tp->t_firstblock == NULLFSBLOCK);
                error = __xfs_bunmapi(tp, ip, destoff, &rlen, 0, 1);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /*
                 * Trim the extent to whatever got unmapped.
@@ -1063,12 +1052,12 @@ xfs_reflink_remap_extent(
                /* Update the refcount tree */
                error = xfs_refcount_increase_extent(mp, tp->t_dfops, &uirec);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /* Map the new blocks into the data fork. */
                error = xfs_bmap_map_extent(mp, tp->t_dfops, ip, &uirec);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
 
                /* Update quota accounting. */
                xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT,
@@ -1090,7 +1079,7 @@ next_extent:
                xfs_defer_ijoin(tp->t_dfops, ip);
                error = xfs_defer_finish(&tp, tp->t_dfops);
                if (error)
-                       goto out_defer;
+                       goto out_cancel;
        }
 
        error = xfs_trans_commit(tp);
@@ -1099,8 +1088,6 @@ next_extent:
                goto out;
        return 0;
 
-out_defer:
-       xfs_defer_cancel(tp->t_dfops);
 out_cancel:
        xfs_trans_cancel(tp);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
index bc471d4..86d7d2f 100644 (file)
@@ -761,7 +761,6 @@ xfs_growfs_rt_alloc(
        struct xfs_buf          *bp;    /* temporary buffer for zeroing */
        xfs_daddr_t             d;              /* disk block address */
        int                     error;          /* error return value */
-       struct xfs_defer_ops    dfops;          /* list of freed blocks */
        xfs_fsblock_t           fsbno;          /* filesystem block for bno */
        struct xfs_bmbt_irec    map;            /* block map output */
        int                     nmap;           /* number of block maps */
@@ -786,7 +785,6 @@ xfs_growfs_rt_alloc(
                xfs_ilock(ip, XFS_ILOCK_EXCL);
                xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
 
-               xfs_defer_init(tp, &dfops);
                /*
                 * Allocate blocks to the bitmap file.
                 */
@@ -797,13 +795,10 @@ xfs_growfs_rt_alloc(
                if (!error && nmap < 1)
                        error = -ENOSPC;
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
                /*
                 * Free any blocks freed up in the transaction, then commit.
                 */
-               error = xfs_defer_finish(&tp, tp->t_dfops);
-               if (error)
-                       goto out_bmap_cancel;
                error = xfs_trans_commit(tp);
                if (error)
                        return error;
@@ -853,8 +848,6 @@ xfs_growfs_rt_alloc(
 
        return 0;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
 out_trans_cancel:
        xfs_trans_cancel(tp);
        return error;
index d1ab0af..ce801ae 100644 (file)
@@ -163,7 +163,6 @@ xfs_symlink(
        struct xfs_inode        *ip = NULL;
        int                     error = 0;
        int                     pathlen;
-       struct xfs_defer_ops    dfops;
        bool                    unlock_dp_on_error = false;
        xfs_fileoff_t           first_fsb;
        xfs_filblks_t           fs_blocks;
@@ -242,12 +241,6 @@ xfs_symlink(
                goto out_trans_cancel;
 
        /*
-        * Initialize the bmap freelist prior to calling either
-        * bmapi or the directory create code.
-        */
-       xfs_defer_init(tp, &dfops);
-
-       /*
         * Allocate an inode for the symlink.
         */
        error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0,
@@ -290,7 +283,7 @@ xfs_symlink(
                error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks,
                                  XFS_BMAPI_METADATA, resblks, mval, &nmaps);
                if (error)
-                       goto out_bmap_cancel;
+                       goto out_trans_cancel;
 
                if (resblks)
                        resblks -= fs_blocks;
@@ -308,7 +301,7 @@ xfs_symlink(
                                               BTOBB(byte_cnt), 0);
                        if (!bp) {
                                error = -ENOMEM;
-                               goto out_bmap_cancel;
+                               goto out_trans_cancel;
                        }
                        bp->b_ops = &xfs_symlink_buf_ops;
 
@@ -337,7 +330,7 @@ xfs_symlink(
         */
        error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, resblks);
        if (error)
-               goto out_bmap_cancel;
+               goto out_trans_cancel;
        xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
        xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
 
@@ -350,10 +343,6 @@ xfs_symlink(
                xfs_trans_set_sync(tp);
        }
 
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto out_bmap_cancel;
-
        error = xfs_trans_commit(tp);
        if (error)
                goto out_release_inode;
@@ -365,8 +354,6 @@ xfs_symlink(
        *ipp = ip;
        return 0;
 
-out_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
 out_trans_cancel:
        xfs_trans_cancel(tp);
 out_release_inode:
@@ -399,7 +386,6 @@ xfs_inactive_symlink_rmt(
        xfs_buf_t       *bp;
        int             done;
        int             error;
-       struct xfs_defer_ops    dfops;
        int             i;
        xfs_mount_t     *mp;
        xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS];
@@ -438,7 +424,6 @@ xfs_inactive_symlink_rmt(
         * Find the block(s) so we can inval and unmap them.
         */
        done = 0;
-       xfs_defer_init(tp, &dfops);
        nmaps = ARRAY_SIZE(mval);
        error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size),
                                mval, &nmaps, 0);
@@ -453,7 +438,7 @@ xfs_inactive_symlink_rmt(
                        XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0);
                if (!bp) {
                        error = -ENOMEM;
-                       goto error_bmap_cancel;
+                       goto error_trans_cancel;
                }
                xfs_trans_binval(tp, bp);
        }
@@ -462,19 +447,14 @@ xfs_inactive_symlink_rmt(
         */
        error = xfs_bunmapi(tp, ip, 0, size, 0, nmaps, &done);
        if (error)
-               goto error_bmap_cancel;
+               goto error_trans_cancel;
        ASSERT(done);
-       /*
-        * Commit the first transaction.  This logs the EFI and the inode.
-        */
-       xfs_defer_ijoin(tp->t_dfops, ip);
-       error = xfs_defer_finish(&tp, tp->t_dfops);
-       if (error)
-               goto error_bmap_cancel;
 
        /*
-        * Commit the transaction containing extent freeing and EFDs.
+        * Commit the transaction. This first logs the EFI and the inode, then
+        * rolls and commits the transaction that frees the extents.
         */
+       xfs_defer_ijoin(tp->t_dfops, ip);
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        error = xfs_trans_commit(tp);
        if (error) {
@@ -492,8 +472,6 @@ xfs_inactive_symlink_rmt(
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        return 0;
 
-error_bmap_cancel:
-       xfs_defer_cancel(tp->t_dfops);
 error_trans_cancel:
        xfs_trans_cancel(tp);
 error_unlock: