| From stable+bounces-169842-greg=kroah.com@vger.kernel.org Sat Aug 16 05:49:42 2025 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 15 Aug 2025 23:47:57 -0400 |
| Subject: block: reject invalid operation in submit_bio_noacct |
| To: stable@vger.kernel.org |
| Cc: Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk>, Sasha Levin <sashal@kernel.org> |
| Message-ID: <20250816034758.666065-1-sashal@kernel.org> |
| |
| From: Christoph Hellwig <hch@lst.de> |
| |
| [ Upstream commit 1c042f8d4bc342b7985b1de3d76836f1a1083b65 ] |
| |
| submit_bio_noacct allows completely invalid operations, or operations |
| that are not supported in the bio path. Extent the existing switch |
| statement to rejcect all invalid types. |
| |
| Move the code point for REQ_OP_ZONE_APPEND so that it's not right in the |
| middle of the zone management operations and the switch statement can |
| follow the numerical order of the operations. |
| |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Link: https://lore.kernel.org/r/20231221070538.1112446-1-hch@lst.de |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Stable-dep-of: 3f66ccbaaef3 ("block: Make REQ_OP_ZONE_FINISH a write operation") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| block/blk-core.c | 26 +++++++++++++++++++++----- |
| include/linux/blk_types.h | 8 ++++---- |
| 2 files changed, 25 insertions(+), 9 deletions(-) |
| |
| --- a/block/blk-core.c |
| +++ b/block/blk-core.c |
| @@ -755,6 +755,15 @@ void submit_bio_noacct(struct bio *bio) |
| bio_clear_polled(bio); |
| |
| switch (bio_op(bio)) { |
| + case REQ_OP_READ: |
| + case REQ_OP_WRITE: |
| + break; |
| + case REQ_OP_FLUSH: |
| + /* |
| + * REQ_OP_FLUSH can't be submitted through bios, it is only |
| + * synthetized in struct request by the flush state machine. |
| + */ |
| + goto not_supported; |
| case REQ_OP_DISCARD: |
| if (!bdev_max_discard_sectors(bdev)) |
| goto not_supported; |
| @@ -768,6 +777,10 @@ void submit_bio_noacct(struct bio *bio) |
| if (status != BLK_STS_OK) |
| goto end_io; |
| break; |
| + case REQ_OP_WRITE_ZEROES: |
| + if (!q->limits.max_write_zeroes_sectors) |
| + goto not_supported; |
| + break; |
| case REQ_OP_ZONE_RESET: |
| case REQ_OP_ZONE_OPEN: |
| case REQ_OP_ZONE_CLOSE: |
| @@ -779,12 +792,15 @@ void submit_bio_noacct(struct bio *bio) |
| if (!bdev_is_zoned(bio->bi_bdev) || !blk_queue_zone_resetall(q)) |
| goto not_supported; |
| break; |
| - case REQ_OP_WRITE_ZEROES: |
| - if (!q->limits.max_write_zeroes_sectors) |
| - goto not_supported; |
| - break; |
| + case REQ_OP_DRV_IN: |
| + case REQ_OP_DRV_OUT: |
| + /* |
| + * Driver private operations are only used with passthrough |
| + * requests. |
| + */ |
| + fallthrough; |
| default: |
| - break; |
| + goto not_supported; |
| } |
| |
| if (blk_throtl_bio(bio)) |
| --- a/include/linux/blk_types.h |
| +++ b/include/linux/blk_types.h |
| @@ -366,6 +366,8 @@ enum req_op { |
| REQ_OP_DISCARD = (__force blk_opf_t)3, |
| /* securely erase sectors */ |
| REQ_OP_SECURE_ERASE = (__force blk_opf_t)5, |
| + /* write data at the current zone write pointer */ |
| + REQ_OP_ZONE_APPEND = (__force blk_opf_t)7, |
| /* write the zero filled sector many times */ |
| REQ_OP_WRITE_ZEROES = (__force blk_opf_t)9, |
| /* Open a zone */ |
| @@ -374,12 +376,10 @@ enum req_op { |
| REQ_OP_ZONE_CLOSE = (__force blk_opf_t)11, |
| /* Transition a zone to full */ |
| REQ_OP_ZONE_FINISH = (__force blk_opf_t)12, |
| - /* write data at the current zone write pointer */ |
| - REQ_OP_ZONE_APPEND = (__force blk_opf_t)13, |
| /* reset a zone write pointer */ |
| - REQ_OP_ZONE_RESET = (__force blk_opf_t)15, |
| + REQ_OP_ZONE_RESET = (__force blk_opf_t)13, |
| /* reset all the zone present on the device */ |
| - REQ_OP_ZONE_RESET_ALL = (__force blk_opf_t)17, |
| + REQ_OP_ZONE_RESET_ALL = (__force blk_opf_t)15, |
| |
| /* Driver private requests */ |
| REQ_OP_DRV_IN = (__force blk_opf_t)34, |