]> git.itanic.dy.fi Git - linux-stable/commitdiff
block: reject invalid operation in submit_bio_noacct
authorChristoph Hellwig <hch@lst.de>
Thu, 21 Dec 2023 07:05:38 +0000 (08:05 +0100)
committerJens Axboe <axboe@kernel.dk>
Tue, 26 Dec 2023 16:27:14 +0000 (09:27 -0700)
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>
block/blk-core.c
include/linux/blk_types.h

index fdf25b8d6e784f9904ee7892277acdb25430f3d3..9520ccab30500782c8836acd2a73ec0313d7a3fd 100644 (file)
@@ -764,6 +764,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;
@@ -777,6 +786,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:
@@ -788,12 +801,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))
index d5c5e59ddbd25afd284a1094948850be42437fb2..68c9eb2374a46574c28ac65064e94c069198aaf0 100644 (file)
@@ -378,6 +378,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 */
@@ -386,12 +388,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,