Recently ceph/librbd added several interfaces to handle SCSI commands like COMPARE_AND_WRITE directly. However they were only be used in special scenarios, i.e. ISCSI. That involves more software components which makes the IO path longer and could bring more potential issues. Actually we're maintaining several ceph clusters with ISCSI protocal being used which, i have to say, is not an easy job.
So supporting COMPARE_AND_WRITE in scsi-disk would be a reasonable solution and easy to implement with the help of the SCSI handlers in librbd, which could leave alone the ISCSI stuff and make the IO path shorter. This patchset implements it by reusing the blk_aio_pwritev interface and introducing a new BDRV_REQ_COMPARE_AND_WRITE element into BdrvRequestFlags to indicate a COMPARE_AND_WRITE request, rather than adding a new interface into block-backend.c. The FUA support is implemented in the blk_aio_pwritev's callback function similar to its emulation in scsi_write_do_fua function, maybe through BDRV_REQ_FUA is another doable way. This patchset is tested with the method of sg_compare_and_write.txt from sg3_utils. Link below: https://github.com/hreinecke/sg3_utils/blob/master/examples/sg_compare_and_write.txt Yaowei Bai (4): block: add SCSI COMPARE_AND_WRITE support block/rbd: implement bdrv_aio_compare_and_write interface hw/scsi: add SCSI COMPARE_AND_WRITE support scsi-disk: add FUA support for COMPARE_AND_WRITE block/io.c | 20 +++++++++ block/raw-format.c | 3 +- block/rbd.c | 41 ++++++++++++++++++- hw/scsi/emulation.c | 1 + hw/scsi/scsi-bus.c | 4 ++ hw/scsi/scsi-disk.c | 98 +++++++++++++++++++++++++++++++++++++++++++++ hw/scsi/trace-events | 1 + include/block/block.h | 5 ++- include/block/block_int.h | 3 ++ include/hw/scsi/emulation.h | 3 ++ include/scsi/utils.h | 2 + include/tcmu/tcmu.h | 14 +++++++ scsi/utils.c | 5 +++ 13 files changed, 195 insertions(+), 5 deletions(-) create mode 100644 include/tcmu/tcmu.h -- 1.8.3.1