xfs: defer agfl frees from directory op transactions
authorBrian Foster <bfoster@redhat.com>
Tue, 8 May 2018 00:38:48 +0000 (17:38 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 May 2018 17:04:02 +0000 (10:04 -0700)
Directory operations can perform block allocations as entries are
added/removed from directories. Defer AGFL block frees from the
remaining directory operation transactions. This covers the hard
link, remove and rename operations.

Signed-off-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_inode.c

index c903b6a..d9b9160 100644 (file)
@@ -1464,6 +1464,7 @@ xfs_link(
        }
 
        xfs_defer_init(&dfops, &first_block);
+       tp->t_agfl_dfops = &dfops;
 
        /*
         * Handle initial link state of O_TMPFILE inode
@@ -2661,6 +2662,7 @@ xfs_remove(
                goto out_trans_cancel;
 
        xfs_defer_init(&dfops, &first_block);
+       tp->t_agfl_dfops = &dfops;
        error = xfs_dir_removename(tp, dp, name, ip->i_ino,
                                        &first_block, &dfops, resblks);
        if (error) {
@@ -3028,6 +3030,7 @@ xfs_rename(
        }
 
        xfs_defer_init(&dfops, &first_block);
+       tp->t_agfl_dfops = &dfops;
 
        /* RENAME_EXCHANGE is unique from here on. */
        if (flags & RENAME_EXCHANGE)