FSes will not check if the BIO submitted for an atomic write adheres to the request_queue limits, so check in the BIO submission path. Signed-off-by: John Garry <john.g.garry@xxxxxxxxxx> --- We really should return -EINVAL to userspce, so can be have BLK_STS_INVAL or similar? block/blk-core.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/block/blk-core.c b/block/blk-core.c index de771093b526..a1b095a68498 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -718,6 +718,18 @@ void submit_bio_noacct_nocheck(struct bio *bio) __submit_bio_noacct(bio); } +static blk_status_t blk_validate_atomic_write_op_size(struct request_queue *q, + struct bio *bio) +{ + if (bio->bi_iter.bi_size > queue_atomic_write_unit_max_bytes(q)) + return BLK_STS_IOERR; + + if (bio->bi_iter.bi_size % queue_atomic_write_unit_min_bytes(q)) + return BLK_STS_IOERR; + + return BLK_STS_OK; +} + /** * submit_bio_noacct - re-submit a bio to the block device layer for I/O * @bio: The bio describing the location in memory and on the device. @@ -775,6 +787,11 @@ void submit_bio_noacct(struct bio *bio) switch (bio_op(bio)) { case REQ_OP_READ: case REQ_OP_WRITE: + if (bio->bi_opf & REQ_ATOMIC) { + status = blk_validate_atomic_write_op_size(q, bio); + if (status != BLK_STS_OK) + goto end_io; + } break; case REQ_OP_FLUSH: /* -- 2.31.1