[PATCH 5/8] xfs: add DAX block zeroing support
Brian Foster
bfoster at redhat.com
Tue Jun 2 11:02:59 CDT 2015
On Fri, May 29, 2015 at 09:45:52AM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner at redhat.com>
>
> Add initial support for DAX block zeroing operations to XFS. DAX
> cannot use buffered IO through the page cache for zeroing, nor do we
> need to issue IO for uncached block zeroing. In both cases, we can
> simply call out to the dax block zeroing function.
>
> Signed-off-by: Dave Chinner <dchinner at redhat.com>
> ---
> fs/xfs/xfs_bmap_util.c | 23 +++++++++++++++++++----
> fs/xfs/xfs_file.c | 43 +++++++++++++++++++++++++------------------
> 2 files changed, 44 insertions(+), 22 deletions(-)
>
...
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index c2af282..fd94460 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -79,14 +79,15 @@ xfs_rw_ilock_demote(
> }
>
> /*
> - * xfs_iozero
> + * xfs_iozero clears the specified range supplied via the page cache (except in
> + * the DAX case). Writes through the page cache will allocate blocks over holes,
> + * though the callers usually map the holes first and avoid them. If a block is
> + * not completely zeroed, then it will be read from disk before being partially
> + * zeroed.
> *
> - * xfs_iozero clears the specified range of buffer supplied,
> - * and marks all the affected blocks as valid and modified. If
> - * an affected block is not allocated, it will be allocated. If
> - * an affected block is not completely overwritten, and is not
> - * valid before the operation, it will be read from disk before
> - * being partially zeroed.
> + * In the DAX case, we can just directly write to the underlying pages. This
> + * will not allocate blocks, but will avoid holes and unwritten extents and so
> + * not do unnecessary work.
> */
> int
> xfs_iozero(
> @@ -96,7 +97,8 @@ xfs_iozero(
> {
> struct page *page;
> struct address_space *mapping;
> - int status;
> + int status = 0;
> +
>
> mapping = VFS_I(ip)->i_mapping;
> do {
> @@ -108,20 +110,25 @@ xfs_iozero(
> if (bytes > count)
> bytes = count;
>
> - status = pagecache_write_begin(NULL, mapping, pos, bytes,
> - AOP_FLAG_UNINTERRUPTIBLE,
> - &page, &fsdata);
> - if (status)
> - break;
> + if (IS_DAX(VFS_I(ip)))
> + dax_zero_page_range(VFS_I(ip), pos, bytes,
> + xfs_get_blocks_direct);
Still no error checking here...
Brian
> + else {
> + status = pagecache_write_begin(NULL, mapping, pos, bytes,
> + AOP_FLAG_UNINTERRUPTIBLE,
> + &page, &fsdata);
> + if (status)
> + break;
>
> - zero_user(page, offset, bytes);
> + zero_user(page, offset, bytes);
>
> - status = pagecache_write_end(NULL, mapping, pos, bytes, bytes,
> - page, fsdata);
> - WARN_ON(status <= 0); /* can't return less than zero! */
> + status = pagecache_write_end(NULL, mapping, pos, bytes,
> + bytes, page, fsdata);
> + WARN_ON(status <= 0); /* can't return less than zero! */
> + status = 0;
> + }
> pos += bytes;
> count -= bytes;
> - status = 0;
> } while (count);
>
> return status;
> --
> 2.0.0
>
> _______________________________________________
> xfs mailing list
> xfs at oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
More information about the xfs
mailing list