Commit 7abbe7f3 authored by Nicholas Bellinger's avatar Nicholas Bellinger

target: Fix SYNCHRONIZE_CACHE zero LBA + range breakage

This patch fixes a SYNCHRONIZE_CACHE CDB handling bug with IBLOCK/FILEIO
backends where transport_cmd_get_valid_sectors() was incorrectly rejecting
a zero LBA + range CDB from being processed, and returning CHECK_CONDITION.

This includes changing transport_cmd_get_valid_sectors() to return '0' on
success and '-EINVAL' on failure (this makes more sense than sectors),
and to only check transport_cmd_get_valid_sectors() when a non zero LBA +
range SYNCHRONIZE_CACHE operation has been receieved for the non passthrough
case.
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 72f4ba1e
...@@ -2853,12 +2853,10 @@ static int transport_cmd_get_valid_sectors(struct se_cmd *cmd) ...@@ -2853,12 +2853,10 @@ static int transport_cmd_get_valid_sectors(struct se_cmd *cmd)
" transport_dev_end_lba(): %llu\n", " transport_dev_end_lba(): %llu\n",
cmd->t_task_lba, sectors, cmd->t_task_lba, sectors,
transport_dev_end_lba(dev)); transport_dev_end_lba(dev));
pr_err(" We should return CHECK_CONDITION" return -EINVAL;
" but we don't yet\n");
return 0;
} }
return sectors; return 0;
} }
static int target_check_write_same_discard(unsigned char *flags, struct se_device *dev) static int target_check_write_same_discard(unsigned char *flags, struct se_device *dev)
...@@ -3350,10 +3348,12 @@ static int transport_generic_cmd_sequencer( ...@@ -3350,10 +3348,12 @@ static int transport_generic_cmd_sequencer(
cmd->se_cmd_flags |= SCF_EMULATE_CDB_ASYNC; cmd->se_cmd_flags |= SCF_EMULATE_CDB_ASYNC;
/* /*
* Check to ensure that LBA + Range does not exceed past end of * Check to ensure that LBA + Range does not exceed past end of
* device. * device for IBLOCK and FILEIO ->do_sync_cache() backend calls
*/ */
if (!transport_cmd_get_valid_sectors(cmd)) if ((cmd->t_task_lba != 0) || (sectors != 0)) {
goto out_invalid_cdb_field; if (transport_cmd_get_valid_sectors(cmd) < 0)
goto out_invalid_cdb_field;
}
break; break;
case UNMAP: case UNMAP:
size = get_unaligned_be16(&cdb[7]); size = get_unaligned_be16(&cdb[7]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment