Message ID | 20210520042228.974083-5-damien.lemoal@wdc.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Series | dm: Improve zoned block device support | expand |
On 5/20/21 6:22 AM, Damien Le Moal wrote: > Fix dm_accept_partial_bio() to actually check that zone management > commands are not passed as explained in the function documentation > comment. Also, since a zone append operation cannot be split, add > REQ_OP_ZONE_APPEND as a forbidden command. > > White lines are added around the group of BUG_ON() calls to make the > code more legible. > > Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com> > Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> > --- > drivers/md/dm.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/dm.c b/drivers/md/dm.c > index ca2aedd8ee7d..a9211575bfed 100644 > --- a/drivers/md/dm.c > +++ b/drivers/md/dm.c > @@ -1237,8 +1237,9 @@ static int dm_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, > > /* > * A target may call dm_accept_partial_bio only from the map routine. It is > - * allowed for all bio types except REQ_PREFLUSH, REQ_OP_ZONE_RESET, > - * REQ_OP_ZONE_OPEN, REQ_OP_ZONE_CLOSE and REQ_OP_ZONE_FINISH. > + * allowed for all bio types except REQ_PREFLUSH, zone management operations > + * (REQ_OP_ZONE_RESET, REQ_OP_ZONE_OPEN, REQ_OP_ZONE_CLOSE and > + * REQ_OP_ZONE_FINISH) and zone append writes. > * > * dm_accept_partial_bio informs the dm that the target only wants to process > * additional n_sectors sectors of the bio and the rest of the data should be > @@ -1268,9 +1269,13 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) > { > struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); > unsigned bi_size = bio->bi_iter.bi_size >> SECTOR_SHIFT; > + > BUG_ON(bio->bi_opf & REQ_PREFLUSH); > + BUG_ON(op_is_zone_mgmt(bio_op(bio))); > + BUG_ON(bio_op(bio) == REQ_OP_ZONE_APPEND); > BUG_ON(bi_size > *tio->len_ptr); > BUG_ON(n_sectors > bi_size); > + > *tio->len_ptr -= bi_size - n_sectors; > bio->bi_iter.bi_size = n_sectors << SECTOR_SHIFT; > } > Reviewed-by: Hannes Reinecke <hare@suse.de> Cheers, Hannes
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index ca2aedd8ee7d..a9211575bfed 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1237,8 +1237,9 @@ static int dm_dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff, /* * A target may call dm_accept_partial_bio only from the map routine. It is - * allowed for all bio types except REQ_PREFLUSH, REQ_OP_ZONE_RESET, - * REQ_OP_ZONE_OPEN, REQ_OP_ZONE_CLOSE and REQ_OP_ZONE_FINISH. + * allowed for all bio types except REQ_PREFLUSH, zone management operations + * (REQ_OP_ZONE_RESET, REQ_OP_ZONE_OPEN, REQ_OP_ZONE_CLOSE and + * REQ_OP_ZONE_FINISH) and zone append writes. * * dm_accept_partial_bio informs the dm that the target only wants to process * additional n_sectors sectors of the bio and the rest of the data should be @@ -1268,9 +1269,13 @@ void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors) { struct dm_target_io *tio = container_of(bio, struct dm_target_io, clone); unsigned bi_size = bio->bi_iter.bi_size >> SECTOR_SHIFT; + BUG_ON(bio->bi_opf & REQ_PREFLUSH); + BUG_ON(op_is_zone_mgmt(bio_op(bio))); + BUG_ON(bio_op(bio) == REQ_OP_ZONE_APPEND); BUG_ON(bi_size > *tio->len_ptr); BUG_ON(n_sectors > bi_size); + *tio->len_ptr -= bi_size - n_sectors; bio->bi_iter.bi_size = n_sectors << SECTOR_SHIFT; }