>>>>> "Tom" == Tom Yan <tom.ty89@xxxxxxxxx> writes: Tom> Nope, SCSI Write Same commands does not have payload (or in SCSI Tom> terms, parameter list / data-out buffer). WRITE SAME has a a payload of 1 logical block (unless NDOB is set but we have had no good reason to support that yet). UNMAP has a payload that varies based on the number of range descriptors. The SCSI disk driver only ever issues a single descriptor but since libata doesn't support UNMAP this doesn't really come into play. Ideally there would be a way to distinguish between device limits for WRITE SAME with the UNMAP bit and for "regular" WRITE SAME. One way to do that would be to transition the libata discard implementation over to single-range UNMAP, fill out the relevant VPD page B0 fields and leave the WRITE SAME bits for writing zeroes. One reason that has not been particularly compelling is that the WRITE SAME payload buffer does double duty to hold the ATA DSM TRIM range descriptors and matches the required ATA payload size. Whereas the UNMAP command would only provide 24 bytes of TRIM range space. Also, please be careful with transfer lengths, __data_len, etc. As mentioned, the transfer length WRITE SAME is typically 512 bytes and that's the number of bytes that need to be DMA'ed and transferred over the wire by the controller. But from a command completion perspective we need to complete however many bytes the command acted upon. Unlike reads and writes there is not a 1:1 mapping between the transfer length and the affected area. So we do a bit of magic after the buffer has been mapped to ensure that the completion byte count matches the number of blocks that were affected by the command rather than the size of the data buffer in bytes. -- Martin K. Petersen Oracle Linux Engineering -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html