From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: linux-xfs@vger.kernel.org,
Andreas Gruenbacher <agruenba@redhat.com>,
cluster-devel@redhat.com, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 1/3] iomap: refactor iomap_dio_actor
Date: Tue, 3 Jul 2018 09:07:00 -0700 [thread overview]
Message-ID: <20180703160700.GZ5711@magnolia> (raw)
In-Reply-To: <20180702145458.22330-2-hch@lst.de>
On Mon, Jul 02, 2018 at 08:54:56AM -0600, Christoph Hellwig wrote:
> Split the function up into two helpers for the bio based I/O and hole
> case, and a small helper to call the two. This separates the code a
> little better in preparation for supporting I/O to inline data.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com>
Looks ok,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
--D
> ---
> fs/iomap.c | 88 ++++++++++++++++++++++++++++++++----------------------
> 1 file changed, 52 insertions(+), 36 deletions(-)
>
> diff --git a/fs/iomap.c b/fs/iomap.c
> index 2ebff76039b5..4d8ff0f5ecc9 100644
> --- a/fs/iomap.c
> +++ b/fs/iomap.c
> @@ -1327,10 +1327,9 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
> }
>
> static loff_t
> -iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length,
> - void *data, struct iomap *iomap)
> +iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
> + struct iomap_dio *dio, struct iomap *iomap)
> {
> - struct iomap_dio *dio = data;
> unsigned int blkbits = blksize_bits(bdev_logical_block_size(iomap->bdev));
> unsigned int fs_block_size = i_blocksize(inode), pad;
> unsigned int align = iov_iter_alignment(dio->submit.iter);
> @@ -1344,41 +1343,27 @@ iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length,
> if ((pos | length | align) & ((1 << blkbits) - 1))
> return -EINVAL;
>
> - switch (iomap->type) {
> - case IOMAP_HOLE:
> - if (WARN_ON_ONCE(dio->flags & IOMAP_DIO_WRITE))
> - return -EIO;
> - /*FALLTHRU*/
> - case IOMAP_UNWRITTEN:
> - if (!(dio->flags & IOMAP_DIO_WRITE)) {
> - length = iov_iter_zero(length, dio->submit.iter);
> - dio->size += length;
> - return length;
> - }
> + if (iomap->type == IOMAP_UNWRITTEN) {
> dio->flags |= IOMAP_DIO_UNWRITTEN;
> need_zeroout = true;
> - break;
> - case IOMAP_MAPPED:
> - if (iomap->flags & IOMAP_F_SHARED)
> - dio->flags |= IOMAP_DIO_COW;
> - if (iomap->flags & IOMAP_F_NEW) {
> - need_zeroout = true;
> - } else {
> - /*
> - * Use a FUA write if we need datasync semantics, this
> - * is a pure data IO that doesn't require any metadata
> - * updates and the underlying device supports FUA. This
> - * allows us to avoid cache flushes on IO completion.
> - */
> - if (!(iomap->flags & (IOMAP_F_SHARED|IOMAP_F_DIRTY)) &&
> - (dio->flags & IOMAP_DIO_WRITE_FUA) &&
> - blk_queue_fua(bdev_get_queue(iomap->bdev)))
> - use_fua = true;
> - }
> - break;
> - default:
> - WARN_ON_ONCE(1);
> - return -EIO;
> + }
> +
> + if (iomap->flags & IOMAP_F_SHARED)
> + dio->flags |= IOMAP_DIO_COW;
> +
> + if (iomap->flags & IOMAP_F_NEW) {
> + need_zeroout = true;
> + } else {
> + /*
> + * Use a FUA write if we need datasync semantics, this
> + * is a pure data IO that doesn't require any metadata
> + * updates and the underlying device supports FUA. This
> + * allows us to avoid cache flushes on IO completion.
> + */
> + if (!(iomap->flags & (IOMAP_F_SHARED|IOMAP_F_DIRTY)) &&
> + (dio->flags & IOMAP_DIO_WRITE_FUA) &&
> + blk_queue_fua(bdev_get_queue(iomap->bdev)))
> + use_fua = true;
> }
>
> /*
> @@ -1457,6 +1442,37 @@ iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length,
> return copied;
> }
>
> +static loff_t
> +iomap_dio_hole_actor(loff_t length, struct iomap_dio *dio)
> +{
> + length = iov_iter_zero(length, dio->submit.iter);
> + dio->size += length;
> + return length;
> +}
> +
> +static loff_t
> +iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length,
> + void *data, struct iomap *iomap)
> +{
> + struct iomap_dio *dio = data;
> +
> + switch (iomap->type) {
> + case IOMAP_HOLE:
> + if (WARN_ON_ONCE(dio->flags & IOMAP_DIO_WRITE))
> + return -EIO;
> + return iomap_dio_hole_actor(length, dio);
> + case IOMAP_UNWRITTEN:
> + if (!(dio->flags & IOMAP_DIO_WRITE))
> + return iomap_dio_hole_actor(length, dio);
> + return iomap_dio_bio_actor(inode, pos, length, dio, iomap);
> + case IOMAP_MAPPED:
> + return iomap_dio_bio_actor(inode, pos, length, dio, iomap);
> + default:
> + WARN_ON_ONCE(1);
> + return -EIO;
> + }
> +}
> +
> /*
> * iomap_dio_rw() always completes O_[D]SYNC writes regardless of whether the IO
> * is being issued as AIO or not. This allows us to optimise pure data writes
> --
> 2.18.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2018-07-03 16:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-02 14:54 more iomap inline enablement Christoph Hellwig
2018-07-02 14:54 ` [PATCH 1/3] iomap: refactor iomap_dio_actor Christoph Hellwig
2018-07-03 16:07 ` Darrick J. Wong [this message]
2018-07-02 14:54 ` [PATCH 2/3] iomap: support direct I/O to inline data Christoph Hellwig
2018-07-03 16:06 ` Darrick J. Wong
2018-07-02 14:54 ` [PATCH 3/3] iomap: add inline data support to iomap_readpage_actor Christoph Hellwig
2018-07-03 16:06 ` 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=20180703160700.GZ5711@magnolia \
--to=darrick.wong@oracle.com \
--cc=agruenba@redhat.com \
--cc=cluster-devel@redhat.com \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).