scsi: factor out read/write LBA range check
The SCSI read and write functions use the same LBA range check, so move it up to spdk_bdev_scsi_readwrite(). spdk_bdev_scsi_read() previously passed task->transfer_len / blen rather than xfer_len to the LBA range checking function, but this should actually be using the transfer length field from the CDB (which is the xfer_len parameter). Change-Id: I8285abf936a18a0baf7cc25709945637e4e6b87d Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
103351befd
commit
de5ffac4ec
@ -1295,21 +1295,12 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev,
|
|||||||
struct spdk_scsi_task *task, uint64_t lba,
|
struct spdk_scsi_task *task, uint64_t lba,
|
||||||
uint32_t len)
|
uint32_t len)
|
||||||
{
|
{
|
||||||
uint64_t bdev_num_blocks;
|
|
||||||
uint64_t blen;
|
uint64_t blen;
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
uint64_t nbytes;
|
uint64_t nbytes;
|
||||||
int rc;
|
|
||||||
|
|
||||||
bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
|
||||||
blen = spdk_bdev_get_block_size(bdev);
|
blen = spdk_bdev_get_block_size(bdev);
|
||||||
|
|
||||||
rc = spdk_bdev_scsi_read_write_lba_check(task->parent, task, lba,
|
|
||||||
task->transfer_len / blen, bdev_num_blocks);
|
|
||||||
if (rc < 0) {
|
|
||||||
return SPDK_SCSI_TASK_COMPLETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
lba += (task->offset / blen);
|
lba += (task->offset / blen);
|
||||||
offset = lba * blen;
|
offset = lba * blen;
|
||||||
nbytes = task->length;
|
nbytes = task->length;
|
||||||
@ -1340,11 +1331,9 @@ static int
|
|||||||
spdk_bdev_scsi_write(struct spdk_bdev *bdev,
|
spdk_bdev_scsi_write(struct spdk_bdev *bdev,
|
||||||
struct spdk_scsi_task *task, uint64_t lba, uint32_t len)
|
struct spdk_scsi_task *task, uint64_t lba, uint32_t len)
|
||||||
{
|
{
|
||||||
uint64_t bdev_num_blocks;
|
|
||||||
uint64_t blen;
|
uint64_t blen;
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
uint64_t nbytes;
|
uint64_t nbytes;
|
||||||
int rc;
|
|
||||||
struct spdk_scsi_task *primary = task->parent;
|
struct spdk_scsi_task *primary = task->parent;
|
||||||
|
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
@ -1356,12 +1345,6 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev,
|
|||||||
return SPDK_SCSI_TASK_COMPLETE;
|
return SPDK_SCSI_TASK_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
|
||||||
rc = spdk_bdev_scsi_read_write_lba_check(primary, task, lba, len, bdev_num_blocks);
|
|
||||||
if (rc < 0) {
|
|
||||||
return SPDK_SCSI_TASK_COMPLETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
blen = spdk_bdev_get_block_size(bdev);
|
blen = spdk_bdev_get_block_size(bdev);
|
||||||
offset = lba * blen;
|
offset = lba * blen;
|
||||||
nbytes = ((uint64_t)len) * blen;
|
nbytes = ((uint64_t)len) * blen;
|
||||||
@ -1467,6 +1450,12 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev,
|
|||||||
return SPDK_SCSI_TASK_COMPLETE;
|
return SPDK_SCSI_TASK_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (spdk_bdev_scsi_read_write_lba_check(task->parent, task, lba,
|
||||||
|
xfer_len, spdk_bdev_get_num_blocks(bdev)) < 0) {
|
||||||
|
/* spdk_bdev_scsi_read_write_lba_check() already set the correct sense code */
|
||||||
|
return SPDK_SCSI_TASK_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_read) {
|
if (is_read) {
|
||||||
return spdk_bdev_scsi_read(bdev, task, lba, xfer_len);
|
return spdk_bdev_scsi_read(bdev, task, lba, xfer_len);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user