From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Goldwyn Rodrigues <rgoldwyn@suse.com>,
linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 14/19] xfs: split out a new set of read-only iomap ops
Date: Wed, 18 Sep 2019 10:56:28 -0700 [thread overview]
Message-ID: <20190918175628.GG2229799@magnolia> (raw)
In-Reply-To: <20190909182722.16783-15-hch@lst.de>
On Mon, Sep 09, 2019 at 08:27:17PM +0200, Christoph Hellwig wrote:
> Start untangling xfs_file_iomap_begin by splitting out the read-only
> case into its own set of iomap_ops with a very simply iomap_begin
> helper.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/xfs/xfs_aops.c | 9 ++++---
> fs/xfs/xfs_file.c | 8 +++---
> fs/xfs/xfs_iomap.c | 61 ++++++++++++++++++++++++++++++++++------------
> fs/xfs/xfs_iomap.h | 1 +
> fs/xfs/xfs_iops.c | 2 +-
> 5 files changed, 58 insertions(+), 23 deletions(-)
>
> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> index 4e4a4d7df5ac..fe47a4d52247 100644
> --- a/fs/xfs/xfs_aops.c
> +++ b/fs/xfs/xfs_aops.c
> @@ -1158,7 +1158,7 @@ xfs_vm_bmap(
> */
> if (xfs_is_cow_inode(ip) || XFS_IS_REALTIME_INODE(ip))
> return 0;
> - return iomap_bmap(mapping, block, &xfs_iomap_ops);
> + return iomap_bmap(mapping, block, &xfs_read_iomap_ops);
> }
>
> STATIC int
> @@ -1167,7 +1167,7 @@ xfs_vm_readpage(
> struct page *page)
> {
> trace_xfs_vm_readpage(page->mapping->host, 1);
> - return iomap_readpage(page, &xfs_iomap_ops);
> + return iomap_readpage(page, &xfs_read_iomap_ops);
> }
>
> STATIC int
> @@ -1178,7 +1178,7 @@ xfs_vm_readpages(
> unsigned nr_pages)
> {
> trace_xfs_vm_readpages(mapping->host, nr_pages);
> - return iomap_readpages(mapping, pages, nr_pages, &xfs_iomap_ops);
> + return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
> }
>
> static int
> @@ -1188,7 +1188,8 @@ xfs_iomap_swapfile_activate(
> sector_t *span)
> {
> sis->bdev = xfs_find_bdev_for_inode(file_inode(swap_file));
> - return iomap_swapfile_activate(sis, swap_file, span, &xfs_iomap_ops);
> + return iomap_swapfile_activate(sis, swap_file, span,
> + &xfs_read_iomap_ops);
> }
>
> const struct address_space_operations xfs_address_space_operations = {
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 21bd3d575aaa..d8e2e36b84f7 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -187,7 +187,7 @@ xfs_file_dio_aio_read(
> file_accessed(iocb->ki_filp);
>
> xfs_ilock(ip, XFS_IOLOCK_SHARED);
> - ret = iomap_dio_rw(iocb, to, &xfs_iomap_ops, NULL);
> + ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL);
> xfs_iunlock(ip, XFS_IOLOCK_SHARED);
>
> return ret;
> @@ -214,7 +214,7 @@ xfs_file_dax_read(
> xfs_ilock(ip, XFS_IOLOCK_SHARED);
> }
>
> - ret = dax_iomap_rw(iocb, to, &xfs_iomap_ops);
> + ret = dax_iomap_rw(iocb, to, &xfs_read_iomap_ops);
> xfs_iunlock(ip, XFS_IOLOCK_SHARED);
>
> file_accessed(iocb->ki_filp);
> @@ -1131,7 +1131,9 @@ __xfs_filemap_fault(
> if (IS_DAX(inode)) {
> pfn_t pfn;
>
> - ret = dax_iomap_fault(vmf, pe_size, &pfn, NULL, &xfs_iomap_ops);
> + ret = dax_iomap_fault(vmf, pe_size, &pfn, NULL,
> + (write_fault && !vmf->cow_page) ?
> + &xfs_iomap_ops : &xfs_read_iomap_ops);
> if (ret & VM_FAULT_NEEDDSYNC)
> ret = dax_finish_sync_fault(vmf, pe_size, pfn);
> } else {
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index 0ba67a8d8169..d0ed0cba9041 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -950,11 +950,13 @@ xfs_file_iomap_begin(
> u16 iomap_flags = 0;
> unsigned lockmode;
>
> + ASSERT(flags & (IOMAP_WRITE | IOMAP_ZERO));
> +
> if (XFS_FORCED_SHUTDOWN(mp))
> return -EIO;
>
> - if ((flags & (IOMAP_WRITE | IOMAP_ZERO)) && !(flags & IOMAP_DIRECT) &&
> - !IS_DAX(inode) && !xfs_get_extsz_hint(ip)) {
> + if (!(flags & IOMAP_DIRECT) && !IS_DAX(inode) &&
> + !xfs_get_extsz_hint(ip)) {
> /* Reserve delalloc blocks for regular writeback. */
> return xfs_file_iomap_begin_delay(inode, offset, length, flags,
> iomap, srcmap);
> @@ -975,17 +977,6 @@ xfs_file_iomap_begin(
> if (error)
> goto out_unlock;
>
> - if (flags & IOMAP_REPORT) {
> - /* Trim the mapping to the nearest shared extent boundary. */
> - error = xfs_reflink_trim_around_shared(ip, &imap, &shared);
> - if (error)
> - goto out_unlock;
> - }
> -
> - /* Non-modifying mapping requested, so we are done */
> - if (!(flags & (IOMAP_WRITE | IOMAP_ZERO)))
> - goto out_found;
> -
> /*
> * Break shared extents if necessary. Checks for non-blocking IO have
> * been done up front, so we don't need to do them here.
> @@ -1046,8 +1037,6 @@ xfs_file_iomap_begin(
> trace_xfs_iomap_alloc(ip, offset, length, XFS_DATA_FORK, &imap);
>
> out_finish:
> - if (shared)
> - iomap_flags |= IOMAP_F_SHARED;
> return xfs_bmbt_to_iomap(ip, iomap, &imap, iomap_flags);
>
> out_found:
> @@ -1150,6 +1139,48 @@ const struct iomap_ops xfs_iomap_ops = {
> .iomap_end = xfs_file_iomap_end,
> };
>
> +static int
> +xfs_read_iomap_begin(
> + struct inode *inode,
> + loff_t offset,
> + loff_t length,
> + unsigned flags,
> + struct iomap *iomap,
> + struct iomap *srcmap)
> +{
> + struct xfs_inode *ip = XFS_I(inode);
> + struct xfs_mount *mp = ip->i_mount;
> + struct xfs_bmbt_irec imap;
> + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset);
> + xfs_fileoff_t end_fsb = xfs_iomap_end_fsb(mp, offset, length);
> + int nimaps = 1, error = 0;
> + bool shared = false;
> + unsigned lockmode;
> +
> + ASSERT(!(flags & (IOMAP_WRITE | IOMAP_ZERO)));
> +
> + if (XFS_FORCED_SHUTDOWN(mp))
> + return -EIO;
> +
> + error = xfs_ilock_for_iomap(ip, flags, &lockmode);
> + if (error)
> + return error;
> + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap,
> + &nimaps, 0);
> + if (!error && (flags & IOMAP_REPORT))
> + error = xfs_reflink_trim_around_shared(ip, &imap, &shared);
> + xfs_iunlock(ip, lockmode);
> +
> + if (error)
> + return error;
> + trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap);
> + return xfs_bmbt_to_iomap(ip, iomap, &imap, shared ? IOMAP_F_SHARED : 0);
> +}
> +
> +const struct iomap_ops xfs_read_iomap_ops = {
> + .iomap_begin = xfs_read_iomap_begin,
> +};
> +
> static int
> xfs_seek_iomap_begin(
> struct inode *inode,
> diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h
> index 71d0ae460c44..61b1fc3e5143 100644
> --- a/fs/xfs/xfs_iomap.h
> +++ b/fs/xfs/xfs_iomap.h
> @@ -40,6 +40,7 @@ xfs_aligned_fsb_count(
> }
>
> extern const struct iomap_ops xfs_iomap_ops;
> +extern const struct iomap_ops xfs_read_iomap_ops;
> extern const struct iomap_ops xfs_seek_iomap_ops;
> extern const struct iomap_ops xfs_xattr_iomap_ops;
>
> diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
> index ff3c1fae5357..f0c7df82e18b 100644
> --- a/fs/xfs/xfs_iops.c
> +++ b/fs/xfs/xfs_iops.c
> @@ -1113,7 +1113,7 @@ xfs_vn_fiemap(
> &xfs_xattr_iomap_ops);
> } else {
> error = iomap_fiemap(inode, fieinfo, start, length,
> - &xfs_iomap_ops);
> + &xfs_read_iomap_ops);
> }
> xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED);
>
> --
> 2.20.1
>
next prev parent reply other threads:[~2019-09-18 17:56 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-09 18:27 iomap and xfs COW cleanups Christoph Hellwig
2019-09-09 18:27 ` [PATCH 01/19] iomap: better document the IOMAP_F_* flags Christoph Hellwig
2019-09-14 0:42 ` Allison Collins
2019-09-16 18:08 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 02/19] iomap: remove the unused iomap argument to __iomap_write_end Christoph Hellwig
2019-09-14 0:42 ` Allison Collins
2019-09-16 18:10 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 03/19] iomap: always use AOP_FLAG_NOFS in iomap_write_begin Christoph Hellwig
2019-09-16 18:11 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 04/19] iomap: ignore non-shared or non-data blocks in xfs_file_dirty Christoph Hellwig
2019-09-16 18:12 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 05/19] iomap: move the zeroing case out of iomap_read_page_sync Christoph Hellwig
2019-09-16 18:17 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 06/19] iomap: use write_begin to read pages to unshare Christoph Hellwig
2019-09-16 18:34 ` Darrick J. Wong
2019-09-30 11:07 ` Christoph Hellwig
2019-10-08 15:12 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 07/19] iomap: use a srcmap for a read-modify-write I/O Christoph Hellwig
2019-09-10 12:48 ` Goldwyn Rodrigues
2019-09-10 14:39 ` hch
2019-09-16 17:57 ` Darrick J. Wong
2019-09-16 18:42 ` Darrick J. Wong
2019-09-18 18:15 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 08/19] xfs: also call xfs_file_iomap_end_delalloc for zeroing operations Christoph Hellwig
2019-09-18 17:09 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 09/19] xfs: remove xfs_reflink_dirty_extents Christoph Hellwig
2019-09-18 17:17 ` Darrick J. Wong
2019-09-18 17:25 ` Christoph Hellwig
2019-09-18 17:31 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 10/19] xfs: pass two imaps to xfs_reflink_allocate_cow Christoph Hellwig
2019-09-18 17:26 ` Darrick J. Wong
2019-09-30 11:10 ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 11/19] xfs: refactor xfs_file_iomap_begin_delay Christoph Hellwig
2019-09-18 17:30 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 12/19] xfs: fill out the srcmap in iomap_begin Christoph Hellwig
2019-09-18 17:52 ` Darrick J. Wong
2019-10-01 6:26 ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 13/19] xfs: factor out a helper to calculate the end_fsb Christoph Hellwig
2019-09-14 0:42 ` Allison Collins
2019-09-18 17:55 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 14/19] xfs: split out a new set of read-only iomap ops Christoph Hellwig
2019-09-18 17:56 ` Darrick J. Wong [this message]
2019-09-09 18:27 ` [PATCH 15/19] xfs: move xfs_file_iomap_begin_delay around Christoph Hellwig
2019-09-18 17:59 ` Darrick J. Wong
2019-09-30 11:14 ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 16/19] xfs: split the iomap ops for buffered vs direct writes Christoph Hellwig
2019-09-18 18:00 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 17/19] xfs: rename the whichfork variable in xfs_buffered_write_iomap_begin Christoph Hellwig
2019-09-14 0:42 ` Allison Collins
2019-09-18 18:00 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 18/19] xfs: cleanup xfs_iomap_write_unwritten Christoph Hellwig
2019-09-18 18:06 ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 19/19] xfs: improve the IOMAP_NOWAIT check for COW inodes Christoph Hellwig
2019-09-18 18:09 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190918175628.GG2229799@magnolia \
--to=darrick.wong@oracle.com \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=rgoldwyn@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.