Re: drastic changes to allocsize semantics in or around 2.6.38?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux