Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7191253 authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

target: Reset data_length for COMPARE_AND_WRITE to NoLB * block_size



This patch resets se_cmd->data_length for COMPARE_AND_WRITE emulation
within sbc_compare_and_write() to NoLB * block_size in order to address
a bug with FILEIO backends where a I/O failure will occur when data_length
does not match the I/O size being actually dispatched for the individual
per block READs + WRITEs.

This is done late enough in sbc_compare_and_write() after the memory
allocations have occured in transport_generic_new_cmd() to not cause
any unwanted side-effects.

Reported-by: default avatarThomas Glanzmann <thomas@glanzmann.de>
Tested-by: default avatarThomas Glanzmann <thomas@glanzmann.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent c807f643
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -508,6 +508,12 @@ sbc_compare_and_write(struct se_cmd *cmd)
		cmd->transport_complete_callback = NULL;
		cmd->transport_complete_callback = NULL;
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
	}
	}
	/*
	 * Reset cmd->data_length to individual block_size in order to not
	 * confuse backend drivers that depend on this value matching the
	 * size of the I/O being submitted.
	 */
	cmd->data_length = cmd->t_task_nolb * dev->dev_attrib.block_size;


	ret = cmd->execute_rw(cmd, cmd->t_bidi_data_sg, cmd->t_bidi_data_nents,
	ret = cmd->execute_rw(cmd, cmd->t_bidi_data_sg, cmd->t_bidi_data_nents,
			      DMA_FROM_DEVICE);
			      DMA_FROM_DEVICE);