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>
This commit is contained in:
parent
31edeacd77
commit
19372e2769
@ -528,6 +528,7 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
|
|||||||
case REQ_OP_FLUSH:
|
case REQ_OP_FLUSH:
|
||||||
return lo_req_flush(lo, rq);
|
return lo_req_flush(lo, rq);
|
||||||
case REQ_OP_DISCARD:
|
case REQ_OP_DISCARD:
|
||||||
|
case REQ_OP_WRITE_ZEROES:
|
||||||
return lo_discard(lo, rq, pos);
|
return lo_discard(lo, rq, pos);
|
||||||
case REQ_OP_WRITE:
|
case REQ_OP_WRITE:
|
||||||
if (lo->transfer)
|
if (lo->transfer)
|
||||||
@ -826,6 +827,7 @@ static void loop_config_discard(struct loop_device *lo)
|
|||||||
q->limits.discard_granularity = 0;
|
q->limits.discard_granularity = 0;
|
||||||
q->limits.discard_alignment = 0;
|
q->limits.discard_alignment = 0;
|
||||||
blk_queue_max_discard_sectors(q, 0);
|
blk_queue_max_discard_sectors(q, 0);
|
||||||
|
blk_queue_max_write_zeroes_sectors(q, 0);
|
||||||
q->limits.discard_zeroes_data = 0;
|
q->limits.discard_zeroes_data = 0;
|
||||||
queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q);
|
queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, q);
|
||||||
return;
|
return;
|
||||||
@ -834,6 +836,7 @@ static void loop_config_discard(struct loop_device *lo)
|
|||||||
q->limits.discard_granularity = inode->i_sb->s_blocksize;
|
q->limits.discard_granularity = inode->i_sb->s_blocksize;
|
||||||
q->limits.discard_alignment = 0;
|
q->limits.discard_alignment = 0;
|
||||||
blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
|
blk_queue_max_discard_sectors(q, UINT_MAX >> 9);
|
||||||
|
blk_queue_max_write_zeroes_sectors(q, UINT_MAX >> 9);
|
||||||
q->limits.discard_zeroes_data = 1;
|
q->limits.discard_zeroes_data = 1;
|
||||||
queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
|
queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q);
|
||||||
}
|
}
|
||||||
@ -1660,6 +1663,7 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||||||
switch (req_op(cmd->rq)) {
|
switch (req_op(cmd->rq)) {
|
||||||
case REQ_OP_FLUSH:
|
case REQ_OP_FLUSH:
|
||||||
case REQ_OP_DISCARD:
|
case REQ_OP_DISCARD:
|
||||||
|
case REQ_OP_WRITE_ZEROES:
|
||||||
cmd->use_aio = false;
|
cmd->use_aio = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user