Message ID | 20221108055544.1481583-2-damien.lemoal@opensource.wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Improve libata support for FUA | expand |
Looks good,
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
On Tue, Nov 08, 2022 at 02:55:38PM +0900, Damien Le Moal wrote: > From: Christoph Hellwig <hch@infradead.org> > > Check that the PREFUSH and FUA flags are only set on write bios, > given that the flush state machine expects that. > > Reported-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> > Reviewed-by: Hannes Reinecke <hare@suse.de> > --- > block/blk-core.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/block/blk-core.c b/block/blk-core.c > index 17667159482e..d3446d38ba77 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -730,12 +730,15 @@ void submit_bio_noacct(struct bio *bio) > * Filter flush bio's early so that bio based drivers without flush > * support don't have to worry about them. > */ > - if (op_is_flush(bio->bi_opf) && > - !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > - bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); > - if (!bio_sectors(bio)) { > - status = BLK_STS_OK; > + if (op_is_flush(bio->bi_opf)) { > + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_WRITE)) > goto end_io; Considering that e.g. zonefs does: bio = bio_alloc(bdev, nr_pages, REQ_OP_ZONE_APPEND | REQ_SYNC | REQ_IDLE, GFP_NOFS); ... if (iocb_is_dsync(iocb)) bio->bi_opf |= REQ_FUA; It seems that we need to either allow REQ_OP_ZONE_APPEND explicitly here, or perhaps make use of something like op_is_write(). Kind regards, Niklas
On Tue, Nov 08, 2022 at 02:55:38PM +0900, Damien Le Moal wrote: > From: Christoph Hellwig <hch@infradead.org> > > Check that the PREFUSH and FUA flags are only set on write bios, > given that the flush state machine expects that. > > Reported-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> > Reviewed-by: Hannes Reinecke <hare@suse.de> > --- > block/blk-core.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/block/blk-core.c b/block/blk-core.c > index 17667159482e..d3446d38ba77 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -730,12 +730,15 @@ void submit_bio_noacct(struct bio *bio) > * Filter flush bio's early so that bio based drivers without flush > * support don't have to worry about them. > */ > - if (op_is_flush(bio->bi_opf) && > - !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > - bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); > - if (!bio_sectors(bio)) { > - status = BLK_STS_OK; > + if (op_is_flush(bio->bi_opf)) { > + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_WRITE)) > goto end_io; > + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { Considering that blk_queue_write_cache() looks like this: void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua) { if (wc) blk_queue_flag_set(QUEUE_FLAG_WC, q); else blk_queue_flag_clear(QUEUE_FLAG_WC, q); if (fua) blk_queue_flag_set(QUEUE_FLAG_FUA, q); else blk_queue_flag_clear(QUEUE_FLAG_FUA, q); wbt_set_write_cache(q, test_bit(QUEUE_FLAG_WC, &q->queue_flags)); } It seems that you can have flag WC set, without having flag FUA set. So should perhaps the line: > + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { instead be: if (!test_bit(QUEUE_FLAG_FUA, &q->queue_flags)) { Kind regards, Niklas
On 12/30/22 20:54, Niklas Cassel wrote: > On Tue, Nov 08, 2022 at 02:55:38PM +0900, Damien Le Moal wrote: >> From: Christoph Hellwig <hch@infradead.org> >> >> Check that the PREFUSH and FUA flags are only set on write bios, >> given that the flush state machine expects that. >> >> Reported-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> >> Signed-off-by: Christoph Hellwig <hch@lst.de> >> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> >> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> >> Reviewed-by: Hannes Reinecke <hare@suse.de> >> --- >> block/blk-core.c | 13 ++++++++----- >> 1 file changed, 8 insertions(+), 5 deletions(-) >> >> diff --git a/block/blk-core.c b/block/blk-core.c >> index 17667159482e..d3446d38ba77 100644 >> --- a/block/blk-core.c >> +++ b/block/blk-core.c >> @@ -730,12 +730,15 @@ void submit_bio_noacct(struct bio *bio) >> * Filter flush bio's early so that bio based drivers without flush >> * support don't have to worry about them. >> */ >> - if (op_is_flush(bio->bi_opf) && >> - !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { >> - bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); >> - if (!bio_sectors(bio)) { >> - status = BLK_STS_OK; >> + if (op_is_flush(bio->bi_opf)) { >> + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_WRITE)) >> goto end_io; >> + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > > Considering that blk_queue_write_cache() looks like this: > > void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua) > { > if (wc) > blk_queue_flag_set(QUEUE_FLAG_WC, q); > else > blk_queue_flag_clear(QUEUE_FLAG_WC, q); > if (fua) > blk_queue_flag_set(QUEUE_FLAG_FUA, q); > else > blk_queue_flag_clear(QUEUE_FLAG_FUA, q); > > wbt_set_write_cache(q, test_bit(QUEUE_FLAG_WC, &q->queue_flags)); > } > > It seems that you can have flag WC set, without having flag FUA set. > > So should perhaps the line: > >> + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > > instead be: > > if (!test_bit(QUEUE_FLAG_FUA, &q->queue_flags)) { Need both. If there is no write cache or write cache is off, FUA is implied and is useless. > > > Kind regards, > Niklas
On 11/7/22 10:55 PM, Damien Le Moal wrote: > From: Christoph Hellwig <hch@infradead.org> > > Check that the PREFUSH and FUA flags are only set on write bios, > given that the flush state machine expects that. > > Reported-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Signed-off-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> > Reviewed-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Jens Axboe <axboe@kernel.dk>
diff --git a/block/blk-core.c b/block/blk-core.c index 17667159482e..d3446d38ba77 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -730,12 +730,15 @@ void submit_bio_noacct(struct bio *bio) * Filter flush bio's early so that bio based drivers without flush * support don't have to worry about them. */ - if (op_is_flush(bio->bi_opf) && - !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { - bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); - if (!bio_sectors(bio)) { - status = BLK_STS_OK; + if (op_is_flush(bio->bi_opf)) { + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_WRITE)) goto end_io; + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { + bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); + if (!bio_sectors(bio)) { + status = BLK_STS_OK; + goto end_io; + } } }