summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_dfrag.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-12-07 07:49:48 +0100
committerIngo Molnar <mingo@elte.hu>2010-12-07 07:49:51 +0100
commit10a18d7dc0d9f12483c95ffc234118e9b80edfeb (patch)
tree0f43620107d5231cab669bca4b3c923b721330c7 /fs/xfs/xfs_dfrag.c
parentf984ba4eb575e4a27ed28a76d4126d2aa9233c32 (diff)
parentcf7d7e5a1980d1116ee152d25dac382b112b9c17 (diff)
downloadlinux-10a18d7dc0d9f12483c95ffc234118e9b80edfeb.tar.gz
linux-10a18d7dc0d9f12483c95ffc234118e9b80edfeb.tar.bz2
linux-10a18d7dc0d9f12483c95ffc234118e9b80edfeb.zip
Merge commit 'v2.6.37-rc5' into perf/core
Merge reason: Pick up the latest -rc. Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/xfs/xfs_dfrag.c')
-rw-r--r--fs/xfs/xfs_dfrag.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c
index 3b9582c60a22..e60490bc00a6 100644
--- a/fs/xfs/xfs_dfrag.c
+++ b/fs/xfs/xfs_dfrag.c
@@ -377,6 +377,19 @@ xfs_swap_extents(
ip->i_d.di_format = tip->i_d.di_format;
tip->i_d.di_format = tmp;
+ /*
+ * The extents in the source inode could still contain speculative
+ * preallocation beyond EOF (e.g. the file is open but not modified
+ * while defrag is in progress). In that case, we need to copy over the
+ * number of delalloc blocks the data fork in the source inode is
+ * tracking beyond EOF so that when the fork is truncated away when the
+ * temporary inode is unlinked we don't underrun the i_delayed_blks
+ * counter on that inode.
+ */
+ ASSERT(tip->i_delayed_blks == 0);
+ tip->i_delayed_blks = ip->i_delayed_blks;
+ ip->i_delayed_blks = 0;
+
ilf_fields = XFS_ILOG_CORE;
switch(ip->i_d.di_format) {