mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
dm: test for REQ_ATOMIC in dm_accept_partial_bio()
Any bio with REQ_ATOMIC flag set should never be split or partially completed, so BUG_ON() on this scenario in dm_accept_partial_bio() (whose intent is to allow partial completions). Also, we must reject atomic bio to targets that don't support them, otherwise this BUG could be triggered by stray bios that have the REQ_ATOMIC set. Signed-off-by: John Garry <john.g.garry@oracle.com> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Tested-by: John Garry <john.g.garry@oracle.com>
This commit is contained in:
parent
b9dd1f71e6
commit
de67c139b3
|
|
@ -1321,6 +1321,7 @@ void dm_accept_partial_bio(struct bio *bio, unsigned int n_sectors)
|
|||
BUG_ON(dm_tio_flagged(tio, DM_TIO_IS_DUPLICATE_BIO));
|
||||
BUG_ON(bio_sectors > *tio->len_ptr);
|
||||
BUG_ON(n_sectors > bio_sectors);
|
||||
BUG_ON(bio->bi_opf & REQ_ATOMIC);
|
||||
|
||||
if (static_branch_unlikely(&zoned_enabled) &&
|
||||
unlikely(bdev_is_zoned(bio->bi_bdev))) {
|
||||
|
|
@ -1735,8 +1736,12 @@ static blk_status_t __split_and_process_bio(struct clone_info *ci)
|
|||
ci->submit_as_polled = !!(ci->bio->bi_opf & REQ_POLLED);
|
||||
|
||||
len = min_t(sector_t, max_io_len(ti, ci->sector), ci->sector_count);
|
||||
if (ci->bio->bi_opf & REQ_ATOMIC && len != ci->sector_count)
|
||||
return BLK_STS_IOERR;
|
||||
if (ci->bio->bi_opf & REQ_ATOMIC) {
|
||||
if (unlikely(!dm_target_supports_atomic_writes(ti->type)))
|
||||
return BLK_STS_IOERR;
|
||||
if (unlikely(len != ci->sector_count))
|
||||
return BLK_STS_IOERR;
|
||||
}
|
||||
|
||||
setup_split_accounting(ci, len);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user