]> git.baikalelectronics.ru Git - kernel.git/commit
scsi: target/core: Always call transport_complete_callback() upon failure
authorBart Van Assche <bvanassche@acm.org>
Mon, 15 Oct 2018 15:51:39 +0000 (08:51 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 16 Oct 2018 05:13:35 +0000 (01:13 -0400)
commit9139743fa0df621b609267051e5746aaa041938c
treeec0f6674cca301aae23ba040075810c3c30ea46e
parent10419fa064955a00d68f6cd569a3d8b01d38911c
scsi: target/core: Always call transport_complete_callback() upon failure

COMPARE AND WRITE command execution starts with a call of
sbc_compare_and_write(). That function locks the caw_sem member in the
backend device data structure and submits a read request to the backend
driver. Upon successful completion of the read compare_and_write_callback()
gets called. That last function compares the data that has been read. If it
matches transport_complete_callback is set to compare_and_write_post and a
write request is submitted. compare_and_write_post() submits a write request
to the backend driver.

XDWRITEREAD command execution starts with sbc_execute_rw() submitting a
read to the backend device. Upon successful completion of the read the
xdreadwrite_callback() gets called. That function xors the data that has
been read with the data in the data-out buffer and stores the result in
the data-in buffer.

Call transport_complete_callback() not only if COMPARE AND WRITE fails but
also if XDWRITEREAD fails. This makes the code more systematic. Make sure
that the callback functions handle (cmd, false, NULL) argument triples fine.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Nicholas Bellinger <nab@linux-iscsi.org>
Cc: Mike Christie <mchristi@redhat.com>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_sbc.c
drivers/target/target_core_transport.c