summaryrefslogtreecommitdiffstats
path: root/drivers/block/loop.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2017-04-05 13:21:15 -0400
committerJens Axboe <axboe@fb.com>2017-04-08 13:25:38 -0400
commit19372e2769179ddd154a0d6fbbdb719eb5d0af12 (patch)
tree024ee1cc37ae90328dac4627daa160972691543b /drivers/block/loop.c
parent31edeacd77b3b0bfe0d1b38db15cdd687cb89e34 (diff)
loop: implement REQ_OP_WRITE_ZEROES
It's identical to discard as hole punches will always leave us with zeroes on reads. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r--drivers/block/loop.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index cc981f34e017..3bb04c1a4ba1 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -528,6 +528,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
528 case REQ_OP_FLUSH: 528 case REQ_OP_FLUSH:
529 return lo_req_flush(lo, rq); 529 return lo_req_flush(lo, rq);
530 case REQ_OP_DISCARD: 530 case REQ_OP_DISCARD:
531 case REQ_OP_WRITE_ZEROES:
531 return lo_discard(lo, rq, pos); 532 return lo_discard(lo, rq, pos);
532 case REQ_OP_WRITE: 533 case REQ_OP_WRITE:
533 if (lo->transfer) 534 if (lo->transfer)
@@ -826,6 +827,7 @@ static void loop_config_discard(struct loop_device *lo)
826 q->limits.discard_granularity = 0; 827 q->limits.discard_granularity = 0;
827 q->limits.discard_alignment = 0; 828 q->limits.discard_alignment = 0;
828 blk_queue_max_discard_sectors(q, 0); 829 blk_queue_max_discard_sectors(q, 0);
830 blk_queue_max_write_zeroes_sectors(q, 0);
829 q->limits.discard_zeroes_data = 0; 831 q->limits.discard_zeroes_data = 0;
830 queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q); 832 queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q);
831 return; 833 return;
@@ -834,6 +836,7 @@ static void loop_config_discard(struct loop_device *lo)
834 q->limits.discard_granularity = inode->i_sb->s_blocksize; 836 q->limits.discard_granularity = inode->i_sb->s_blocksize;
835 q->limits.discard_alignment = 0; 837 q->limits.discard_alignment = 0;
836 blk_queue_max_discard_sectors(q, UINT_MAX >> 9); 838 blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
839 blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9);
837 q->limits.discard_zeroes_data = 1; 840 q->limits.discard_zeroes_data = 1;
838 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); 841 queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
839} 842}
@@ -1660,6 +1663,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx,
1660 switch (req_op(cmd->rq)) { 1663 switch (req_op(cmd->rq)) {
1661 case REQ_OP_FLUSH: 1664 case REQ_OP_FLUSH:
1662 case REQ_OP_DISCARD: 1665 case REQ_OP_DISCARD:
1666 case REQ_OP_WRITE_ZEROES:
1663 cmd->use_aio = false; 1667 cmd->use_aio = false;
1664 break; 1668 break;
1665 default: 1669 default: