On 2020/5/16 23:36, Christoph Hellwig wrote: > On Sat, May 16, 2020 at 09:05:39PM +0800, Coly Li wrote: >> On 2020/5/16 20:50, Christoph Hellwig wrote: >>> On Sat, May 16, 2020 at 08:44:45PM +0800, Coly Li wrote: >>>> Yes you are right, just like REQ_OP_DISCARD which does not transfer any >>>> data but changes the data on device. If the request changes the stored >>>> data, it does transfer data. >>> >>> REQ_OP_DISCARD is a special case, because most implementation end up >>> transferring data, it just gets attached in the low-level driver. >>> >> >> Yes, REQ_OP_ZONE_RESET and REQ_OP_ZONE_RESET_ALL are quite similar to >> REQ_OP_DISCARD. Data read from the LBA range of reset zone is not >> suggested and the content is undefined. >> >> For bcache, similar to REQ_OP_DISCARD, REQ_OP_ZONE_RESET and >> REQ_OP_ZONE_RESET_ALL are handled in same way: If the backing device >> supports discard/zone_reset, and the operation successes, then cached >> data on SSD covered by the LBA range should be invalid, otherwise users >> will read outdated and garbage data. >> >> We should treat REQ_OP_ZONE_RESET and REQ_OP_ZONE_RESET_ALL being in >> WRITE direction. > > No, the difference is that the underlying SCSI/ATA/NVMe command tend to > usually actually transfer data. Take a look at the special_vec field > in struct request and the RQF_SPECIAL_PAYLOAD flag. > Then bio_data_dir() will be problematic, as it is defined, 52 /* 53 * Return the data direction, READ or WRITE. 54 */ 55 #define bio_data_dir(bio) \ 56 (op_is_write(bio_op(bio)) ? WRITE : READ) For the REQ_OP_ZONE_RESET bio, bio_data_dir() will report it as READ. Since the author is you, how to fix this ? Coly Li