This patch adds a two new module params discard and write-zeroes
in order to test the REQ_OP_DISACRD and REQ_OP_WRITE_ZEROES
operations.

This is needed to test latest blktrace code changes which enables
us to track more request based operations such as write-zeroes.

Signed-off-by: Chaitanya Kulkarni <[email protected]>
---
 drivers/block/null_blk_main.c | 37 +++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c
index d7ac09c092f2..93fe2c843d03 100644
--- a/drivers/block/null_blk_main.c
+++ b/drivers/block/null_blk_main.c
@@ -192,6 +192,14 @@ static unsigned int g_zone_nr_conv;
 module_param_named(zone_nr_conv, g_zone_nr_conv, uint, 0444);
 MODULE_PARM_DESC(zone_nr_conv, "Number of conventional zones when block device 
is zoned. Default: 0");
 
+static bool g_discard;
+module_param_named(discard, g_discard, bool, 0444);
+MODULE_PARM_DESC(discard, "Allow REQ_OP_DISCARD processing. Default: false");
+
+static bool g_write_zeroes;
+module_param_named(write_zeroes, g_write_zeroes, bool, 0444);
+MODULE_PARM_DESC(write_zeroes, "Allow REQ_OP_WRITE_ZEROES processing. Default: 
false");
+
 static struct nullb_device *null_alloc_dev(void);
 static void null_free_dev(struct nullb_device *dev);
 static void null_del_dev(struct nullb *nullb);
@@ -527,6 +535,12 @@ static struct nullb_device *null_alloc_dev(void)
        dev->zoned = g_zoned;
        dev->zone_size = g_zone_size;
        dev->zone_nr_conv = g_zone_nr_conv;
+       dev->discard = g_discard;
+       dev->write_zeroes = g_write_zeroes;
+       pr_info("null_blk: discard  %s\n",
+                       dev->discard == true ? "TRUE" : "FALSE");
+       pr_info("null_blk: write_zeroes %s\n",
+                       dev->write_zeroes == true ? "TRUE" : "FALSE");
        return dev;
 }
 
@@ -1059,7 +1073,11 @@ static int null_handle_rq(struct nullb_cmd *cmd)
 
        sector = blk_rq_pos(rq);
 
-       if (req_op(rq) == REQ_OP_DISCARD) {
+       /* just discard for write zeroes for now */
+       switch (req_op(rq)) {
+       case REQ_OP_DISCARD:
+               /* fall through */
+       case REQ_OP_WRITE_ZEROES:
                null_handle_discard(nullb, sector, blk_rq_bytes(rq));
                return 0;
        }
@@ -1093,7 +1111,11 @@ static int null_handle_bio(struct nullb_cmd *cmd)
 
        sector = bio->bi_iter.bi_sector;
 
-       if (bio_op(bio) == REQ_OP_DISCARD) {
+       /* just discard for write zeroes for now */
+       switch (bio_op(bio)) {
+       case REQ_OP_DISCARD:
+               /* fall through */
+       case REQ_OP_WRITE_ZEROES:
                null_handle_discard(nullb, sector,
                        bio_sectors(bio) << SECTOR_SHIFT);
                return 0;
@@ -1192,7 +1214,6 @@ static blk_status_t null_handle_cmd(struct nullb_cmd *cmd)
                }
        }
        cmd->error = errno_to_blk_status(err);
-
        if (!cmd->error && dev->zoned) {
                sector_t sector;
                unsigned int nr_sectors;
@@ -1402,7 +1423,7 @@ static void null_del_dev(struct nullb *nullb)
 
 static void null_config_discard(struct nullb *nullb)
 {
-       if (nullb->dev->discard == false)
+       if (!nullb->dev->discard)
                return;
        nullb->q->limits.discard_granularity = nullb->dev->blocksize;
        nullb->q->limits.discard_alignment = nullb->dev->blocksize;
@@ -1410,6 +1431,13 @@ static void null_config_discard(struct nullb *nullb)
        blk_queue_flag_set(QUEUE_FLAG_DISCARD, nullb->q);
 }
 
+static void null_config_write_zeroes(struct nullb *nullb)
+{
+       if (!nullb->dev->write_zeroes)
+               return;
+       blk_queue_max_write_zeroes_sectors(nullb->q, UINT_MAX >> 9);
+}
+
 static int null_open(struct block_device *bdev, fmode_t mode)
 {
        return 0;
@@ -1702,6 +1730,7 @@ static int null_add_dev(struct nullb_device *dev)
        blk_queue_physical_block_size(nullb->q, dev->blocksize);
 
        null_config_discard(nullb);
+       null_config_write_zeroes(nullb);
 
        sprintf(nullb->disk_name, "nullb%d", nullb->index);
 
-- 
2.19.1

Reply via email to