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.