On 11/5/25 23:01, Mikulas Patocka wrote:
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 could be triggered by stray bios that have the

double could.

Yongpeng,

REQ_ATOMIC set.

Signed-off-by: John Garry <[email protected]>
Signed-off-by: Mikulas Patocka <[email protected]>

---
  drivers/md/dm.c |    9 +++++++--
  1 file changed, 7 insertions(+), 2 deletions(-)

Index: linux-2.6/drivers/md/dm.c
===================================================================
--- linux-2.6.orig/drivers/md/dm.c      2025-10-13 21:42:47.000000000 +0200
+++ linux-2.6/drivers/md/dm.c   2025-11-05 14:43:32.000000000 +0100
@@ -1321,6 +1321,7 @@ void dm_accept_partial_bio(struct bio *b
        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_
        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);


Reply via email to