Skip to content

Commit de67c13

Browse files
author
Mikulas Patocka
committed
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>
1 parent b9dd1f7 commit de67c13

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

drivers/md/dm.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,7 @@ void dm_accept_partial_bio(struct bio *bio, unsigned int n_sectors)
13211321
BUG_ON(dm_tio_flagged(tio, DM_TIO_IS_DUPLICATE_BIO));
13221322
BUG_ON(bio_sectors > *tio->len_ptr);
13231323
BUG_ON(n_sectors > bio_sectors);
1324+
BUG_ON(bio->bi_opf & REQ_ATOMIC);
13241325

13251326
if (static_branch_unlikely(&zoned_enabled) &&
13261327
unlikely(bdev_is_zoned(bio->bi_bdev))) {
@@ -1735,8 +1736,12 @@ static blk_status_t __split_and_process_bio(struct clone_info *ci)
17351736
ci->submit_as_polled = !!(ci->bio->bi_opf & REQ_POLLED);
17361737

17371738
len = min_t(sector_t, max_io_len(ti, ci->sector), ci->sector_count);
1738-
if (ci->bio->bi_opf & REQ_ATOMIC && len != ci->sector_count)
1739-
return BLK_STS_IOERR;
1739+
if (ci->bio->bi_opf & REQ_ATOMIC) {
1740+
if (unlikely(!dm_target_supports_atomic_writes(ti->type)))
1741+
return BLK_STS_IOERR;
1742+
if (unlikely(len != ci->sector_count))
1743+
return BLK_STS_IOERR;
1744+
}
17401745

17411746
setup_split_accounting(ci, len);
17421747

0 commit comments

Comments
 (0)