Hi,
I just used xfs_fsr the first time under a 3.8-rc kernel and was
spammed with an enormous amount of "XFS_IOC_SWAPEXT failed: ino=56118:
Invalid argument" messages.
I found the thread http://marc.info/?t=135727980600001&r=1&w=2 and
went to check the kernel sources for these additional checks, because
I wanted to know what was allowed earlier and is now failing.
I found commit fb59581404ab7ec5075299065c22cb211a9262a9:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=fb59581404ab7ec5075299065c22cb211a9262a9#patch2
--- a/fs/xfs/xfs_dfrag.c
+++ b/fs/xfs/xfs_dfrag.c
@@ -246,12 +246,10 @@ xfs_swap_extents(
goto out_unlock;
}
- if (VN_CACHED(VFS_I(tip)) != 0) {
- error = xfs_flushinval_pages(tip, 0, -1,
- FI_REMAPF_LOCKED);
- if (error)
- goto out_unlock;
- }
+ error = -filemap_write_and_wait(VFS_I(ip)->i_mapping);
+ if (error)
+ goto out_unlock;
+ truncate_pagecache_range(VFS_I(ip), 0, -1);
That looks really wrong to me. The old code was calling
xfs_flushinval_pages() for *tip*, but the new code is working on *ip*.
Was that change really intended? Is looks unintentional and is not
mentioned in the commit comment...
Thanks for looking / correcting me if I'm missing something obvious,
but I can't find a reason for this change...
Torsten
|