aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-12-12 17:22:46 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-21 15:57:42 -0500
commitbf3673c5e33ba214af62e1cd9d4a333eb61e650f (patch)
treebb39ad4b3eb7200e581e2c4e75005ffc4513084d /fs/xfs
parent898726cbefbc1726a759874345b44f046e198d03 (diff)
xfs: avoid synchronous transactions when deleting attr blocks
commit 859f57ca00805e6c482eef1a7ab073097d02c8ca upstream. [slightly different from the upstream version because of a previous cleanup] Currently xfs_attr_inactive causes a synchronous transactions if we are removing a file that has any extents allocated to the attribute fork, and thus makes XFS extremely slow at removing files with out of line extended attributes. The code looks a like a relict from the days before the busy extent list, but with the busy extent list we avoid reusing data and attr extents that have been freed but not commited yet, so this code is just as superflous as the synchronous transactions for data blocks. Signed-off-by: Christoph Hellwig <hch@lst.de> Reported-by: Bernd Schubert <bernd.schubert@itwm.fraunhofer.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Alex Elder <aelder@sgi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/xfs_attr.c14
-rw-r--r--fs/xfs/xfs_bmap.c10
-rw-r--r--fs/xfs/xfs_inode.c8
3 files changed, 4 insertions, 28 deletions
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c
index 01d2072fb6d..99d4011602e 100644
--- a/fs/xfs/xfs_attr.c
+++ b/fs/xfs/xfs_attr.c
@@ -822,17 +822,9 @@ xfs_attr_inactive(xfs_inode_t *dp)
822 error = xfs_attr_root_inactive(&trans, dp); 822 error = xfs_attr_root_inactive(&trans, dp);
823 if (error) 823 if (error)
824 goto out; 824 goto out;
825 /* 825
826 * signal synchronous inactive transactions unless this 826 error = xfs_itruncate_finish(&trans, dp, 0LL, XFS_ATTR_FORK, 0);
827 * is a synchronous mount filesystem in which case we 827 if (error)
828 * know that we're here because we've been called out of
829 * xfs_inactive which means that the last reference is gone
830 * and the unlink transaction has already hit the disk so
831 * async inactive transactions are safe.
832 */
833 if ((error = xfs_itruncate_finish(&trans, dp, 0LL, XFS_ATTR_FORK,
834 (!(mp->m_flags & XFS_MOUNT_WSYNC)
835 ? 1 : 0))))
836 goto out; 828 goto out;
837 829
838 /* 830 /*
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index e546a33214c..a175933a7f4 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -3785,19 +3785,11 @@ xfs_bmap_compute_maxlevels(
3785 * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi 3785 * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi
3786 * caller. Frees all the extents that need freeing, which must be done 3786 * caller. Frees all the extents that need freeing, which must be done
3787 * last due to locking considerations. We never free any extents in 3787 * last due to locking considerations. We never free any extents in
3788 * the first transaction. This is to allow the caller to make the first 3788 * the first transaction.
3789 * transaction a synchronous one so that the pointers to the data being
3790 * broken in this transaction will be permanent before the data is actually
3791 * freed. This is necessary to prevent blocks from being reallocated
3792 * and written to before the free and reallocation are actually permanent.
3793 * We do not just make the first transaction synchronous here, because
3794 * there are more efficient ways to gain the same protection in some cases
3795 * (see the file truncation code).
3796 * 3789 *
3797 * Return 1 if the given transaction was committed and a new one 3790 * Return 1 if the given transaction was committed and a new one
3798 * started, and 0 otherwise in the committed parameter. 3791 * started, and 0 otherwise in the committed parameter.
3799 */ 3792 */
3800/*ARGSUSED*/
3801int /* error */ 3793int /* error */
3802xfs_bmap_finish( 3794xfs_bmap_finish(
3803 xfs_trans_t **tp, /* transaction pointer addr */ 3795 xfs_trans_t **tp, /* transaction pointer addr */
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index c6888a420c5..5715279975c 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1528,15 +1528,7 @@ xfs_itruncate_finish(
1528 xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE); 1528 xfs_trans_log_inode(ntp, ip, XFS_ILOG_CORE);
1529 } 1529 }
1530 } 1530 }
1531 } else if (sync) {
1532 ASSERT(!(mp->m_flags & XFS_MOUNT_WSYNC));
1533 if (ip->i_d.di_anextents > 0)
1534 xfs_trans_set_sync(ntp);
1535 } 1531 }
1536 ASSERT(fork == XFS_DATA_FORK ||
1537 (fork == XFS_ATTR_FORK &&
1538 ((sync && !(mp->m_flags & XFS_MOUNT_WSYNC)) ||
1539 (sync == 0 && (mp->m_flags & XFS_MOUNT_WSYNC)))));
1540 1532
1541 /* 1533 /*
1542 * Since it is possible for space to become allocated beyond 1534 * Since it is possible for space to become allocated beyond