[Drbd-dev] [PATCH 03/23] sd: implement REQ_OP_WRITE_ZEROES
Bart Van Assche
Bart.VanAssche at sandisk.com
Tue Mar 28 20:50:01 CEST 2017
On Thu, 2017-03-23 at 10:33 -0400, Christoph Hellwig wrote:
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index af632e350ab4..b6f70a09a301 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -748,7 +748,7 @@ static int sd_setup_unmap_cmnd(struct scsi_cmnd *cmd)
> return scsi_init_io(cmd);
> }
>
> -static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd)
> +static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd, bool unmap)
> {
> struct scsi_device *sdp = cmd->device;
> struct request *rq = cmd->request;
> @@ -765,13 +765,14 @@ static int sd_setup_write_same16_cmnd(struct scsi_cmnd *cmd)
>
> cmd->cmd_len = 16;
> cmd->cmnd[0] = WRITE_SAME_16;
> - cmd->cmnd[1] = 0x8; /* UNMAP */
> + if (unmap)
> + cmd->cmnd[1] = 0x8; /* UNMAP */
> put_unaligned_be64(sector, &cmd->cmnd[2]);
> put_unaligned_be32(nr_sectors, &cmd->cmnd[10]);
Hello Christoph,
A quote from SBC: "An OPTIMAL UNMAP GRANULARITY field set to a non-zero value
indicates the optimal granularity in logical blocks for unmap requests (e.g.,
an UNMAP command or a WRITE SAME (16) command with the UNMAP bit set to one).
An unmap request with a number of logical blocks that is not a multiple of
this value may result in unmap operations on fewer LBAs than requested."
This means that just like the start and end of a discard must be aligned on a
discard_granularity boundary, WRITE SAME commands with the UNMAP bit set must
also respect that granularity. I think this means that either
__blkdev_issue_zeroout() has to be modified such that it rejects unaligned
REQ_OP_WRITE_ZEROES operations or that blk_bio_write_same_split() has to be
modified such that it generates REQ_OP_WRITEs for the unaligned start and tail.
Bart.
More information about the drbd-dev
mailing list