[PATCH 1/6] [XFS] Split inode data writeback from inode sync.
Christoph Hellwig
hch at infradead.org
Mon Mar 16 05:10:08 CDT 2009
> +static int
> +xfs_sync_inode_data(
> + struct xfs_inode *ip,
> + int flags)
> +{
> + struct inode *inode = VFS_I(ip);
> + int error = 0;
> +
> + if (VN_DIRTY(inode)) {
> + int locked = 0;
> + if (flags & SYNC_TRYLOCK) {
> + if (xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED))
> + locked = 1;
> + } else {
> + xfs_ilock(ip, XFS_IOLOCK_SHARED);
> + locked = 1;
> + }
> + if (locked) {
> + error = xfs_flush_pages(ip, 0, -1,
> + (flags & SYNC_WAIT) ? 0 : XFS_B_ASYNC,
> + FI_NONE);
> + xfs_iunlock(ip, XFS_IOLOCK_SHARED);
> + }
> + }
> +
> + if (flags & SYNC_IOWAIT)
> + xfs_ioend_wait(ip);
> +
> + return error;
> +}
In the end this should look more like:
static int
xfs_sync_inode_data(
struct xfs_inode *ip,
int flags)
{
struct inode *inode = VFS_I(ip);
struct address_space *mapping = inode->i_mapping;
int error = 0;
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) {
if (flags & SYNC_TRYLOCK)
goto out;
xfs_ilock(ip, XFS_IOLOCK_SHARED);
}
if (flags & SYNC_WAIT) {
error = filemap_write_and_wait(mapping);
else
error = filemap_fdatawrite(mapping);
xfs_iflags_clear(ip, XFS_ITRUNCATED);
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
}
out:
if (flags & SYNC_IOWAIT)
xfs_ioend_wait(ip);
return -error;
}
More information about the xfs
mailing list