]> git.baikalelectronics.ru Git - kernel.git/commit
xfs: don't truncate prealloc from frequently accessed inodes
authorDave Chinner <dchinner@redhat.com>
Thu, 23 Dec 2010 01:02:31 +0000 (12:02 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 23 Dec 2010 01:02:31 +0000 (12:02 +1100)
commitd8b6539b3bba3be95af904f38e0c9b1a1d376968
treedde314cd6a22066e4cd7f3c498f89b00984838d7
parent738ef78b715c282adc0462cb2cddfc0ca300f65e
xfs: don't truncate prealloc from frequently accessed inodes

A long standing problem for streaming writeŃ• through the NFS server
has been that the NFS server opens and closes file descriptors on an
inode for every write. The result of this behaviour is that the
->release() function is called on every close and that results in
XFS truncating speculative preallocation beyond the EOF.  This has
an adverse effect on file layout when multiple files are being
written at the same time - they interleave their extents and can
result in severe fragmentation.

To avoid this problem, keep track of ->release calls made on a dirty
inode. For most cases, an inode is only going to be opened once for
writing and then closed again during it's lifetime in cache. Hence
if there are multiple ->release calls when the inode is dirty, there
is a good chance that the inode is being accessed by the NFS server.
Hence set a flag the first time ->release is called while there are
delalloc blocks still outstanding on the inode.

If this flag is set when ->release is next called, then do no
truncate away the speculative preallocation - leave it there so that
subsequent writes do not need to reallocate the delalloc space. This
will prevent interleaving of extents of different inodes written
concurrently to the same AG.

If we get this wrong, it is not a big deal as we truncate
speculative allocation beyond EOF anyway in xfs_inactive() when the
inode is thrown out of the cache.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_inode.h
fs/xfs/xfs_vnodeops.c