xfs
[Top] [All Lists]

Re: [PATCH 01/15] dax: export a low-level __dax_zero_page_range helper

To: "hch@xxxxxx" <hch@xxxxxx>, "xfs@xxxxxxxxxxx" <xfs@xxxxxxxxxxx>
Subject: Re: [PATCH 01/15] dax: export a low-level __dax_zero_page_range helper
From: "Verma, Vishal L" <vishal.l.verma@xxxxxxxxx>
Date: Wed, 11 May 2016 22:43:26 +0000
Accept-language: en-US
Cc: "rpeterso@xxxxxxxxxx" <rpeterso@xxxxxxxxxx>, "linux-fsdevel@xxxxxxxxxxxxxxx" <linux-fsdevel@xxxxxxxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1462783638-4968-2-git-send-email-hch@xxxxxx>
References: <1462783638-4968-1-git-send-email-hch@xxxxxx> <1462783638-4968-2-git-send-email-hch@xxxxxx>
Thread-index: AQHRqc999aa91qf7nUSRezrvEDaGAZ+0zrsA
Thread-topic: [PATCH 01/15] dax: export a low-level __dax_zero_page_range helper
On Mon, 2016-05-09 at 10:47 +0200, Christoph Hellwig wrote:
> This allows XFS to perform zeroing using the iomap infrastructure and
> avoid buffer heads.
> 
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> ---
> Âfs/dax.cÂÂÂÂÂÂÂÂÂÂÂÂ| 35 ++++++++++++++++++++---------------
> Âinclude/linux/dax.h |ÂÂ7 +++++++
> Â2 files changed, 27 insertions(+), 15 deletions(-)

This looks good to me.

Reviewed-by: Vishal Verma <vishal.l.verma@xxxxxxxxx>

> 
> diff --git a/fs/dax.c b/fs/dax.c
> index 90322eb..6d5d744 100644
> --- a/fs/dax.c
> +++ b/fs/dax.c
> @@ -1082,6 +1082,23 @@ int dax_pfn_mkwrite(struct vm_area_struct *vma,
> struct vm_fault *vmf)
> Â}
> ÂEXPORT_SYMBOL_GPL(dax_pfn_mkwrite);
> Â
> +int __dax_zero_page_range(struct block_device *bdev, sector_t sector,
> +             unsigned int offset, unsigned int length)
> +{
> +     struct blk_dax_ctl dax = {
> +             .sector         = sector,
> +             .size           = PAGE_CACHE_SIZE,
> +     };
> +
> +     if (dax_map_atomic(bdev, &dax) < 0)
> +             return PTR_ERR(dax.addr);
> +     clear_pmem(dax.addr + offset, length);
> +     wmb_pmem();
> +     dax_unmap_atomic(bdev, &dax);
> +     return 0;
> +}
> +EXPORT_SYMBOL_GPL(__dax_zero_page_range);
> +
> Â/**
> Â * dax_zero_page_range - zero a range within a page of a DAX file
> Â * @inode: The file being truncated
> @@ -1117,23 +1134,11 @@ int dax_zero_page_range(struct inode *inode,
> loff_t from, unsigned length,
> Â     bh.b_bdev = inode->i_sb->s_bdev;
> Â     bh.b_size = PAGE_CACHE_SIZE;
> Â     err = get_block(inode, index, &bh, 0);
> -     if (err < 0)
> +     if (err < 0 || !buffer_written(&bh))
> Â             return err;
> -     if (buffer_written(&bh)) {
> -             struct block_device *bdev = bh.b_bdev;
> -             struct blk_dax_ctl dax = {
> -                     .sector = to_sector(&bh, inode),
> -                     .size = PAGE_CACHE_SIZE,
> -             };
> Â
> -             if (dax_map_atomic(bdev, &dax) < 0)
> -                     return PTR_ERR(dax.addr);
> -             clear_pmem(dax.addr + offset, length);
> -             wmb_pmem();
> -             dax_unmap_atomic(bdev, &dax);
> -     }
> -
> -     return 0;
> +     return __dax_zero_page_range(bh.b_bdev, to_sector(&bh,
> inode),
> +                     offset, length);
> Â}
> ÂEXPORT_SYMBOL_GPL(dax_zero_page_range);
> Â
> diff --git a/include/linux/dax.h b/include/linux/dax.h
> index 636dd59..8155b81 100644
> --- a/include/linux/dax.h
> +++ b/include/linux/dax.h
> @@ -17,12 +17,19 @@ int __dax_fault(struct vm_area_struct *, struct
> vm_fault *, get_block_t,
> Â
> Â#ifdef CONFIG_FS_DAX
> Âstruct page *read_dax_sector(struct block_device *bdev, sector_t n);
> +int __dax_zero_page_range(struct block_device *bdev, sector_t sector,
> +             unsigned int offset, unsigned int length);
> Â#else
> Âstatic inline struct page *read_dax_sector(struct block_device *bdev,
> Â             sector_t n)
> Â{
> Â     return ERR_PTR(-ENXIO);
> Â}
> +static inline int __dax_zero_page_range(struct block_device *bdev,
> +             sector_t sector, unsigned int offset, unsigned int
> length)
> +{
> +     return -ENXIO;
> +}
> Â#endif
> Â
> Â#ifdef CONFIG_TRANSPARENT_HUGEPAGE
<Prev in Thread] Current Thread [Next in Thread>