block/rnbd: add support for REQ_OP_WRITE_ZEROES
authorSantosh Pradhan <santosh.pradhan@ionos.com>
Fri, 24 Nov 2023 21:34:21 +0000 (22:34 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 27 Nov 2023 16:11:12 +0000 (09:11 -0700)
Remove REQ_OP_WRITE_SAME in favour of REQ_OP_WRITE_ZEROES.

Signed-off-by: Santosh Pradhan <santosh.pradhan@ionos.com>
Reviewed-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: Grzegorz Prajsner <grzegorz.prajsner@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Link: https://lore.kernel.org/r/20231124213422.113449-2-haris.iqbal@ionos.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/rnbd/rnbd-clt.c
drivers/block/rnbd/rnbd-proto.h
drivers/block/rnbd/rnbd-srv.c

index b0550b68645d38ae7b901307eac348f48999ee84..499d0e655bc3a43b899a4b65337c6ee15b10023d 100644 (file)
@@ -1006,10 +1006,10 @@ static int rnbd_client_xfer_request(struct rnbd_clt_dev *dev,
        msg.prio        = cpu_to_le16(req_get_ioprio(rq));
 
        /*
-        * We only support discards with single segment for now.
+        * We only support discards/WRITE_ZEROES with single segment for now.
         * See queue limits.
         */
-       if (req_op(rq) != REQ_OP_DISCARD)
+       if ((req_op(rq) != REQ_OP_DISCARD) && (req_op(rq) != REQ_OP_WRITE_ZEROES))
                sg_cnt = blk_rq_map_sg(dev->queue, rq, iu->sgt.sgl);
 
        if (sg_cnt == 0)
@@ -1362,6 +1362,8 @@ static void setup_request_queue(struct rnbd_clt_dev *dev,
        blk_queue_write_cache(dev->queue,
                              !!(rsp->cache_policy & RNBD_WRITEBACK),
                              !!(rsp->cache_policy & RNBD_FUA));
+       blk_queue_max_write_zeroes_sectors(dev->queue,
+                                          le32_to_cpu(rsp->max_write_zeroes_sectors));
 }
 
 static int rnbd_clt_setup_gen_disk(struct rnbd_clt_dev *dev,
@@ -1626,10 +1628,11 @@ struct rnbd_clt_dev *rnbd_clt_map_device(const char *sessname,
        }
 
        rnbd_clt_info(dev,
-                      "map_device: Device mapped as %s (nsectors: %llu, logical_block_size: %d, physical_block_size: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
+                      "map_device: Device mapped as %s (nsectors: %llu, logical_block_size: %d, physical_block_size: %d, max_write_zeroes_sectors: %d, max_discard_sectors: %d, discard_granularity: %d, discard_alignment: %d, secure_discard: %d, max_segments: %d, max_hw_sectors: %d, wc: %d, fua: %d)\n",
                       dev->gd->disk_name, le64_to_cpu(rsp->nsectors),
                       le16_to_cpu(rsp->logical_block_size),
                       le16_to_cpu(rsp->physical_block_size),
+                      le32_to_cpu(rsp->max_write_zeroes_sectors),
                       le32_to_cpu(rsp->max_discard_sectors),
                       le32_to_cpu(rsp->discard_granularity),
                       le32_to_cpu(rsp->discard_alignment),
index e32f8f2c868a7bd4b7f2241ddc7c0bc568efee5b..f35be51d213c3f5c1827bb73c1f2376def05e0fb 100644 (file)
@@ -128,7 +128,7 @@ enum rnbd_cache_policy {
  * @device_id:         device_id on server side to identify the device
  * @nsectors:          number of sectors in the usual 512b unit
  * @max_hw_sectors:    max hardware sectors in the usual 512b unit
- * @max_write_same_sectors: max sectors for WRITE SAME in the 512b unit
+ * @max_write_zeroes_sectors: max sectors for WRITE ZEROES in the 512b unit
  * @max_discard_sectors: max. sectors that can be discarded at once in 512b
  * unit.
  * @discard_granularity: size of the internal discard allocation unit in bytes
@@ -145,7 +145,7 @@ struct rnbd_msg_open_rsp {
        __le32                  device_id;
        __le64                  nsectors;
        __le32                  max_hw_sectors;
-       __le32                  max_write_same_sectors;
+       __le32                  max_write_zeroes_sectors;
        __le32                  max_discard_sectors;
        __le32                  discard_granularity;
        __le32                  discard_alignment;
@@ -186,7 +186,7 @@ struct rnbd_msg_io {
  * @RNBD_OP_FLUSH:          flush the volatile write cache
  * @RNBD_OP_DISCARD:        discard sectors
  * @RNBD_OP_SECURE_ERASE:   securely erase sectors
- * @RNBD_OP_WRITE_SAME:     write the same sectors many times
+ * @RNBD_OP_WRITE_ZEROES:   write zeroes sectors
 
  * @RNBD_F_SYNC:            request is sync (sync write or read)
  * @RNBD_F_FUA:             forced unit access
@@ -199,7 +199,7 @@ enum rnbd_io_flags {
        RNBD_OP_FLUSH           = 2,
        RNBD_OP_DISCARD = 3,
        RNBD_OP_SECURE_ERASE    = 4,
-       RNBD_OP_WRITE_SAME      = 5,
+       RNBD_OP_WRITE_ZEROES    = 5,
 
        /* Flags */
        RNBD_F_SYNC  = 1<<(RNBD_OP_BITS + 0),
@@ -236,6 +236,9 @@ static inline blk_opf_t rnbd_to_bio_flags(u32 rnbd_opf)
        case RNBD_OP_SECURE_ERASE:
                bio_opf = REQ_OP_SECURE_ERASE;
                break;
+       case RNBD_OP_WRITE_ZEROES:
+               bio_opf = REQ_OP_WRITE_ZEROES;
+               break;
        default:
                WARN(1, "Unknown RNBD type: %d (flags %d)\n",
                     rnbd_op(rnbd_opf), rnbd_opf);
@@ -268,6 +271,9 @@ static inline u32 rq_to_rnbd_flags(struct request *rq)
        case REQ_OP_SECURE_ERASE:
                rnbd_opf = RNBD_OP_SECURE_ERASE;
                break;
+       case REQ_OP_WRITE_ZEROES:
+               rnbd_opf = RNBD_OP_WRITE_ZEROES;
+               break;
        case REQ_OP_FLUSH:
                rnbd_opf = RNBD_OP_FLUSH;
                break;
index 65de51f3dfd9a62a06d1e25004ed429ecc4d3201..64ad1cd449423365640d846e2e659aedc135bf66 100644 (file)
@@ -544,7 +544,8 @@ static void rnbd_srv_fill_msg_open_rsp(struct rnbd_msg_open_rsp *rsp,
        rsp->max_segments = cpu_to_le16(bdev_max_segments(bdev));
        rsp->max_hw_sectors =
                cpu_to_le32(queue_max_hw_sectors(bdev_get_queue(bdev)));
-       rsp->max_write_same_sectors = 0;
+       rsp->max_write_zeroes_sectors =
+               cpu_to_le32(bdev_write_zeroes_sectors(bdev));
        rsp->max_discard_sectors = cpu_to_le32(bdev_max_discard_sectors(bdev));
        rsp->discard_granularity = cpu_to_le32(bdev_discard_granularity(bdev));
        rsp->discard_alignment = cpu_to_le32(bdev_discard_alignment(bdev));