On Sun, May 22, 2011 at 09:59:55AM +0200, Matthias Schniedermeyer wrote: > On 22.05.2011 12:00, Dave Chinner wrote: > > > > I don't really care what you think the problem is based on what > > you've read in this email thread, or for that matter how you think > > we should fix it. What I really want is your test cases that > > reproduce the problem so I can analyse it for myself. Once I > > understand what is going on, then we can talk about what the real > > problem is and how to fix it. > > What would interest me is why the following creates files with large > preallocations. > > cp -a <somedir> target > rm -rf target > cp -a <somedir> target > > After the first copy everything looks normal, `du` is about the > original value. > > After the second run a `du` shows a much higher value, until the > preallocation is shrunk away. That's obviously a bug. It's also a simple test case that is easy to reproduce - exactly what I like in a bug report. ;) The inodes are being recycled off the reclaimable list in the second case i.e. we're short-circuiting the inode lifecycle and making it new again because it has been reallocated. The XFS_IDIRTY_RELEASE flag is not being cleared in this case, so we are not removing the speculative preallocation when the fd is closed for the second copy. The patch below fixes this. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx xfs: clear inode dirty release flag when recycling it From: Dave Chinner <dchinner@xxxxxxxxxx> The state used to track dirty inode release calls is not reset when an inode is reallocated and reused from the reclaimable state. This leads to specualtive preallocation not being truncated away in the expected manner for local files until the inode is subsequently truncated, freed or cycles out of the cache. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- fs/xfs/xfs_iget.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index cb9b6d1..e75e757 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -241,6 +241,13 @@ xfs_iget_cache_hit( */ ip->i_flags |= XFS_IRECLAIM; + /* + * clear the dirty release state as we are now effectively a + * new inode and so we need to treat speculative preallocation + * accordingly. + */ + ip->i_flags &= ~XFS_IDIRTY_RELEASE; + spin_unlock(&ip->i_flags_lock); rcu_read_unlock(); _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs