diff options
author | Christoph Hellwig <hch@lst.de> | 2017-04-05 13:21:15 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-04-08 13:25:38 -0400 |
commit | 19372e2769179ddd154a0d6fbbdb719eb5d0af12 (patch) | |
tree | 024ee1cc37ae90328dac4627daa160972691543b /drivers/block/loop.c | |
parent | 31edeacd77b3b0bfe0d1b38db15cdd687cb89e34 (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.c | 4 |
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: |