From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Naohiro Aota <naohiro.aota@wdc.com>
Cc: linux-btrfs@vger.kernel.org, dsterba@suse.com, hare@suse.com,
linux-fsdevel@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
Christoph Hellwig <hch@infradead.org>
Subject: Re: [PATCH v10 02/41] iomap: support REQ_OP_ZONE_APPEND
Date: Tue, 10 Nov 2020 11:01:03 -0800 [thread overview]
Message-ID: <20201110190103.GE9685@magnolia> (raw)
In-Reply-To: <20201110185506.GD9685@magnolia>
On Tue, Nov 10, 2020 at 10:55:06AM -0800, Darrick J. Wong wrote:
> On Tue, Nov 10, 2020 at 08:26:05PM +0900, Naohiro Aota wrote:
> > A ZONE_APPEND bio must follow hardware restrictions (e.g. not exceeding
> > max_zone_append_sectors) not to be split. bio_iov_iter_get_pages builds
> > such restricted bio using __bio_iov_append_get_pages if bio_op(bio) ==
> > REQ_OP_ZONE_APPEND.
> >
> > To utilize it, we need to set the bio_op before calling
> > bio_iov_iter_get_pages(). This commit introduces IOMAP_F_ZONE_APPEND, so
> > that iomap user can set the flag to indicate they want REQ_OP_ZONE_APPEND
> > and restricted bio.
> >
> > Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
> > ---
> > fs/iomap/direct-io.c | 41 +++++++++++++++++++++++++++++++++++------
> > include/linux/iomap.h | 1 +
> > 2 files changed, 36 insertions(+), 6 deletions(-)
> >
> > diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c
> > index c1aafb2ab990..f04572a55a09 100644
> > --- a/fs/iomap/direct-io.c
> > +++ b/fs/iomap/direct-io.c
> > @@ -200,6 +200,34 @@ iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
> > iomap_dio_submit_bio(dio, iomap, bio, pos);
> > }
> >
> > +/*
> > + * Figure out the bio's operation flags from the dio request, the
> > + * mapping, and whether or not we want FUA. Note that we can end up
> > + * clearing the WRITE_FUA flag in the dio request.
> > + */
> > +static inline unsigned int
> > +iomap_dio_bio_opflags(struct iomap_dio *dio, struct iomap *iomap, bool use_fua)
>
> Hmm, just to check my understanding of what iomap has to do to support
> all this:
>
> When we're wanting to use a ZONE_APPEND command, the @iomap structure
> has to have IOMAP_F_ZONE_APPEND set in iomap->flags, iomap->type is set
> to IOMAP_MAPPED, but what should iomap->addr be set to?
>
> I gather from what I see in zonefs and the relevant NVME proposal that
> iomap->addr should be set to the (byte) address of the zone we want to
> append to? And if we do that, then bio->bi_iter.bi_sector will be set
> to sector address of iomap->addr, right?
>
> (I got lost trying to figure out how btrfs sets ->addr for appends.)
>
> Then when the IO completes, the block layer sets bio->bi_iter.bi_sector
> to wherever the drive told it that it actually wrote the bio, right?
>
> If that's true, then that implies that need_zeroout must always be false
> for an append operation, right? Does that also mean that the directio
> request has to be aligned to an fs block and not just the sector size?
>
> Can userspace send a directio append that crosses a zone boundary? If
> so, what happens if a direct append to a lower address fails but a
> direct append to a higher address succeeds?
Bleh, vim tomfoolery == missing sentence. Change the above paragraph to
read:
Can userspace send a directio append that crosses a zone boundary? Can
we issue multiple bios for a single append write? What happens if a
direct append to a lower address fails but a direct append to a higher
address succeeds?
--D
> > +{
> > + unsigned int opflags = REQ_SYNC | REQ_IDLE;
> > +
> > + if (!(dio->flags & IOMAP_DIO_WRITE)) {
> > + WARN_ON_ONCE(iomap->flags & IOMAP_F_ZONE_APPEND);
> > + return REQ_OP_READ;
> > + }
> > +
> > + if (iomap->flags & IOMAP_F_ZONE_APPEND)
> > + opflags |= REQ_OP_ZONE_APPEND;
> > + else
> > + opflags |= REQ_OP_WRITE;
> > +
> > + if (use_fua)
> > + opflags |= REQ_FUA;
> > + else
> > + dio->flags &= ~IOMAP_DIO_WRITE_FUA;
> > +
> > + return opflags;
> > +}
> > +
> > static loff_t
> > iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
> > struct iomap_dio *dio, struct iomap *iomap)
> > @@ -278,6 +306,13 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
> > bio->bi_private = dio;
> > bio->bi_end_io = iomap_dio_bio_end_io;
> >
> > + /*
> > + * Set the operation flags early so that bio_iov_iter_get_pages
> > + * can set up the page vector appropriately for a ZONE_APPEND
> > + * operation.
> > + */
> > + bio->bi_opf = iomap_dio_bio_opflags(dio, iomap, use_fua);
>
> I'm also vaguely wondering how to communicate the write location back to
> the filesystem when the bio completes? btrfs handles the bio completion
> completely so it doesn't have a problem, but for other filesystems
> (cough future xfs cough) either we'd have to add a new callback for
> append operations; or I guess everyone could hook the bio endio.
>
> Admittedly that's not really your problem, and for all I know hch is
> already working on this.
>
> --D
>
> > +
> > ret = bio_iov_iter_get_pages(bio, dio->submit.iter);
> > if (unlikely(ret)) {
> > /*
> > @@ -292,14 +327,8 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
> >
> > n = bio->bi_iter.bi_size;
> > if (dio->flags & IOMAP_DIO_WRITE) {
> > - bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE;
> > - if (use_fua)
> > - bio->bi_opf |= REQ_FUA;
> > - else
> > - dio->flags &= ~IOMAP_DIO_WRITE_FUA;
> > task_io_account_write(n);
> > } else {
> > - bio->bi_opf = REQ_OP_READ;
> > if (dio->flags & IOMAP_DIO_DIRTY)
> > bio_set_pages_dirty(bio);
> > }
> > diff --git a/include/linux/iomap.h b/include/linux/iomap.h
> > index 4d1d3c3469e9..1bccd1880d0d 100644
> > --- a/include/linux/iomap.h
> > +++ b/include/linux/iomap.h
> > @@ -54,6 +54,7 @@ struct vm_fault;
> > #define IOMAP_F_SHARED 0x04
> > #define IOMAP_F_MERGED 0x08
> > #define IOMAP_F_BUFFER_HEAD 0x10
> > +#define IOMAP_F_ZONE_APPEND 0x20
> >
> > /*
> > * Flags set by the core iomap code during operations:
> > --
> > 2.27.0
> >
next prev parent reply other threads:[~2020-11-10 19:01 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-10 11:26 [PATCH v10 00/41] btrfs: zoned block device support Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 01/41] block: add bio_add_zone_append_page Naohiro Aota
2020-11-10 17:20 ` Christoph Hellwig
2020-11-11 7:20 ` Johannes Thumshirn
2020-11-10 11:26 ` [PATCH v10 02/41] iomap: support REQ_OP_ZONE_APPEND Naohiro Aota
2020-11-10 17:25 ` Christoph Hellwig
2020-11-10 18:55 ` Darrick J. Wong
2020-11-10 19:01 ` Darrick J. Wong [this message]
2020-11-24 11:29 ` Christoph Hellwig
2020-11-30 18:11 ` Darrick J. Wong
2020-12-01 10:16 ` Johannes Thumshirn
2020-12-09 9:31 ` Christoph Hellwig
2020-12-09 10:08 ` Johannes Thumshirn
2020-12-09 10:10 ` hch
2020-12-09 10:16 ` Johannes Thumshirn
2020-12-09 13:38 ` Johannes Thumshirn
2020-12-11 7:26 ` Johannes Thumshirn
2020-12-11 21:24 ` Chaitanya Kulkarni
2020-12-12 10:22 ` Johannes Thumshirn
2020-11-10 11:26 ` [PATCH v10 03/41] btrfs: introduce ZONED feature flag Naohiro Aota
2020-11-19 21:31 ` David Sterba
2020-11-10 11:26 ` [PATCH v10 04/41] btrfs: get zone information of zoned block devices Naohiro Aota
2020-11-12 6:57 ` Anand Jain
2020-11-12 7:35 ` Johannes Thumshirn
2020-11-12 7:44 ` Damien Le Moal
2020-11-12 9:44 ` Anand Jain
2020-11-13 21:34 ` David Sterba
2020-11-12 9:39 ` Johannes Thumshirn
2020-11-12 12:57 ` Naohiro Aota
2020-11-18 11:17 ` Anand Jain
2020-11-30 11:16 ` Anand Jain
2020-11-25 21:47 ` David Sterba
2020-11-25 22:07 ` David Sterba
2020-11-25 23:50 ` Damien Le Moal
2020-11-26 14:11 ` David Sterba
2020-11-25 22:16 ` David Sterba
2020-11-10 11:26 ` [PATCH v10 05/41] btrfs: check and enable ZONED mode Naohiro Aota
2020-11-18 11:29 ` Anand Jain
2020-11-27 18:44 ` David Sterba
2020-11-30 12:12 ` Anand Jain
2020-11-30 13:15 ` Damien Le Moal
2020-12-01 2:19 ` Anand Jain
2020-12-01 2:29 ` Damien Le Moal
2020-12-01 5:53 ` Anand Jain
2020-12-01 6:09 ` Damien Le Moal
2020-12-01 7:12 ` Anand Jain
2020-12-01 10:45 ` Graham Cobb
2020-12-01 11:03 ` Damien Le Moal
2020-12-01 11:11 ` hch
2020-12-01 11:27 ` Damien Le Moal
2020-11-10 11:26 ` [PATCH v10 06/41] btrfs: introduce max_zone_append_size Naohiro Aota
2020-11-19 9:23 ` Anand Jain
2020-11-27 18:47 ` David Sterba
2020-11-10 11:26 ` [PATCH v10 07/41] btrfs: disallow space_cache in ZONED mode Naohiro Aota
2020-11-19 10:42 ` Anand Jain
2020-11-20 4:08 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 08/41] btrfs: disallow NODATACOW " Naohiro Aota
2020-11-20 4:17 ` Anand Jain
2020-11-23 17:21 ` David Sterba
2020-11-24 3:29 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 09/41] btrfs: disable fallocate " Naohiro Aota
2020-11-20 4:28 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 10/41] btrfs: disallow mixed-bg " Naohiro Aota
2020-11-20 4:32 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 11/41] btrfs: implement log-structured superblock for " Naohiro Aota
2020-11-23 17:46 ` David Sterba
2020-11-24 9:30 ` Johannes Thumshirn
2020-11-24 6:46 ` Anand Jain
2020-11-24 7:16 ` Hannes Reinecke
2020-11-10 11:26 ` [PATCH v10 12/41] btrfs: implement zoned chunk allocator Naohiro Aota
2020-11-24 11:36 ` Anand Jain
2020-11-25 1:57 ` Naohiro Aota
2020-11-25 7:17 ` Anand Jain
2020-11-25 11:48 ` Naohiro Aota
2020-11-25 9:59 ` Graham Cobb
2020-11-25 11:50 ` Naohiro Aota
2020-12-09 5:27 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 13/41] btrfs: verify device extent is aligned to zone Naohiro Aota
2020-11-27 6:27 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 14/41] btrfs: load zone's alloction offset Naohiro Aota
2020-12-08 9:54 ` Anand Jain
2020-11-10 11:26 ` [PATCH v10 15/41] btrfs: emulate write pointer for conventional zones Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 16/41] btrfs: track unusable bytes for zones Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 17/41] btrfs: do sequential extent allocation in ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 18/41] btrfs: reset zones of unused block groups Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 19/41] btrfs: redirty released extent buffers in ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 20/41] btrfs: extract page adding function Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 21/41] btrfs: use bio_add_zone_append_page for zoned btrfs Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 22/41] btrfs: handle REQ_OP_ZONE_APPEND as writing Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 23/41] btrfs: split ordered extent when bio is sent Naohiro Aota
2020-11-11 2:01 ` kernel test robot
2020-11-11 2:26 ` kernel test robot
2020-11-11 3:46 ` kernel test robot
2020-11-11 3:46 ` [RFC PATCH] btrfs: extract_ordered_extent() can be static kernel test robot
2020-11-11 4:12 ` [PATCH v10.1 23/41] btrfs: split ordered extent when bio is sent Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 24/41] btrfs: extend btrfs_rmap_block for specifying a device Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 25/41] btrfs: use ZONE_APPEND write for ZONED btrfs Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 26/41] btrfs: enable zone append writing for direct IO Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 27/41] btrfs: introduce dedicated data write path for ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 28/41] btrfs: serialize meta IOs on " Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 29/41] btrfs: wait existing extents before truncating Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 30/41] btrfs: avoid async metadata checksum on ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 31/41] btrfs: mark block groups to copy for device-replace Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 32/41] btrfs: implement cloning for ZONED device-replace Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 33/41] btrfs: implement copying " Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 34/41] btrfs: support dev-replace in ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 35/41] btrfs: enable relocation " Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 36/41] btrfs: relocate block group to repair IO failure in ZONED Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 37/41] btrfs: split alloc_log_tree() Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 38/41] btrfs: extend zoned allocator to use dedicated tree-log block group Naohiro Aota
2020-11-11 4:58 ` [PATCH v10.1 " Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 39/41] btrfs: serialize log transaction on ZONED mode Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 40/41] btrfs: reorder log node allocation Naohiro Aota
2020-11-10 11:26 ` [PATCH v10 41/41] btrfs: enable to mount ZONED incompat flag Naohiro Aota
2020-11-10 14:00 ` [PATCH v10 00/41] btrfs: zoned block device support Anand Jain
2020-11-11 5:07 ` Naohiro Aota
2020-11-27 19:28 ` David Sterba
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=20201110190103.GE9685@magnolia \
--to=darrick.wong@oracle.com \
--cc=axboe@kernel.dk \
--cc=dsterba@suse.com \
--cc=hare@suse.com \
--cc=hch@infradead.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=naohiro.aota@wdc.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 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).