[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