block: reject invalid operation in submit_bio_noacct
[linux-2.6-block.git] / block / blk-core.c
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))