nbd: set discard granularity properly
authorJosef Bacik <jbacik@fb.com>
Wed, 23 May 2018 17:35:59 +0000 (13:35 -0400)
committerJens Axboe <axboe@kernel.dk>
Wed, 23 May 2018 21:27:26 +0000 (15:27 -0600)
For some reason we had discard granularity set to 512 always even when
discards were disabled.  Fix this by having the default be 0, and then
if we turn it on set the discard granularity to the blocksize.

Signed-off-by: Josef Bacik <jbacik@fb.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/nbd.c

index 1147e4680c80d00f14dbb3ed95b9465b5d9a341c..bdfbb2a7018c84b4b154a552b99e25759cce9b60 100644 (file)
@@ -236,6 +236,10 @@ static void nbd_size_update(struct nbd_device *nbd)
        struct nbd_config *config = nbd->config;
        struct block_device *bdev = bdget_disk(nbd->disk, 0);
 
+       if (config->flags & NBD_FLAG_SEND_TRIM) {
+               nbd->disk->queue->limits.discard_granularity = config->blksize;
+               blk_queue_max_discard_sectors(nbd->disk->queue, UINT_MAX);
+       }
        blk_queue_logical_block_size(nbd->disk->queue, config->blksize);
        blk_queue_physical_block_size(nbd->disk->queue, config->blksize);
        set_capacity(nbd->disk, config->bytesize >> 9);
@@ -1050,6 +1054,8 @@ static void nbd_config_put(struct nbd_device *nbd)
                nbd->config = NULL;
 
                nbd->tag_set.timeout = 0;
+               nbd->disk->queue->limits.discard_granularity = 0;
+               blk_queue_max_discard_sectors(nbd->disk->queue, UINT_MAX);
                blk_queue_flag_clear(QUEUE_FLAG_DISCARD, nbd->disk->queue);
 
                mutex_unlock(&nbd->config_lock);
@@ -1502,8 +1508,8 @@ static int nbd_dev_add(int index)
         */
        blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
        blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, disk->queue);
-       disk->queue->limits.discard_granularity = 512;
-       blk_queue_max_discard_sectors(disk->queue, UINT_MAX);
+       disk->queue->limits.discard_granularity = 0;
+       blk_queue_max_discard_sectors(disk->queue, 0);
        blk_queue_max_segment_size(disk->queue, UINT_MAX);
        blk_queue_max_segments(disk->queue, USHRT_MAX);
        blk_queue_max_hw_sectors(disk->queue, 65536);