scsi: Remove the param xfer_len and refactor spdk_bdev_scsi_read/write
The last parameter xfer_len of spdk_bdev_scsi_read is not used, and of spdk_bdev_scsi_write is used only to check task->transfer_len. Hence remove the last parameter xfer_len from spdk_bdev_scsi_read/write and extract the check operation from spdk_bdev_scsi_write and insert it into spdk_bdev_scsi_read_write. Additionally, remove a debug log because xfer_len is not passed to spdk_bdev_scsi_write anymore. Hopufully, this will not degrade any maintainability. On top of this, factoring out the operation to convert byte to block in spdk_bdev_scsi_read/write be done. Change-Id: I35faca269a9c4a7f15d27e8e61b6a1b809a36b3f Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-on: https://review.gerrithub.io/c/444776 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
parent
c7598147ff
commit
05f30ca396
@ -1318,7 +1318,7 @@ spdk_bdev_scsi_queue_io(struct spdk_scsi_task *task, spdk_bdev_io_wait_cb cb_fn,
|
||||
static int
|
||||
spdk_bdev_scsi_read(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
|
||||
struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
|
||||
uint64_t lba, uint32_t len)
|
||||
uint64_t lba)
|
||||
{
|
||||
uint64_t blen;
|
||||
uint64_t offset;
|
||||
@ -1359,30 +1359,18 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
|
||||
static int
|
||||
spdk_bdev_scsi_write(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
|
||||
struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
|
||||
uint64_t lba, uint32_t len)
|
||||
uint64_t lba)
|
||||
{
|
||||
uint64_t blen;
|
||||
uint64_t offset;
|
||||
uint64_t nbytes;
|
||||
int rc;
|
||||
|
||||
blen = spdk_bdev_get_block_size(bdev);
|
||||
offset = lba * blen;
|
||||
nbytes = ((uint64_t)len) * blen;
|
||||
|
||||
SPDK_DEBUGLOG(SPDK_LOG_SCSI,
|
||||
"Write: lba=%"PRIu64", len=%u\n",
|
||||
lba, len);
|
||||
|
||||
if (nbytes > task->transfer_len) {
|
||||
SPDK_ERRLOG("nbytes(%zu) > transfer_len(%u)\n",
|
||||
(size_t)nbytes, task->transfer_len);
|
||||
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
|
||||
SPDK_SCSI_SENSE_NO_SENSE,
|
||||
SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
|
||||
SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
|
||||
return SPDK_SCSI_TASK_COMPLETE;
|
||||
}
|
||||
"Write: lba=%"PRIu64", len=%lu\n",
|
||||
lba, task->length / blen);
|
||||
|
||||
offset += task->offset;
|
||||
rc = spdk_bdev_writev(bdev_desc, bdev_ch, task->iovs,
|
||||
@ -1403,9 +1391,6 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
|
||||
return SPDK_SCSI_TASK_COMPLETE;
|
||||
}
|
||||
|
||||
SPDK_DEBUGLOG(SPDK_LOG_SCSI, "Wrote %"PRIu64"/%"PRIu64" bytes\n",
|
||||
(uint64_t)task->length, nbytes);
|
||||
|
||||
task->data_transferred = task->length;
|
||||
return SPDK_SCSI_TASK_PENDING;
|
||||
}
|
||||
@ -1462,7 +1447,7 @@ spdk_bdev_scsi_readwrite(struct spdk_scsi_task *task,
|
||||
struct spdk_bdev_desc *bdev_desc = lun->bdev_desc;
|
||||
struct spdk_io_channel *bdev_ch = lun->io_channel;
|
||||
uint64_t bdev_num_blocks;
|
||||
uint32_t max_xfer_len;
|
||||
uint32_t max_xfer_len, block_size;
|
||||
|
||||
task->data_transferred = 0;
|
||||
|
||||
@ -1491,8 +1476,10 @@ spdk_bdev_scsi_readwrite(struct spdk_scsi_task *task,
|
||||
return SPDK_SCSI_TASK_COMPLETE;
|
||||
}
|
||||
|
||||
block_size = spdk_bdev_get_block_size(bdev);
|
||||
|
||||
/* Transfer Length is limited to the Block Limits VPD page Maximum Transfer Length */
|
||||
max_xfer_len = SPDK_WORK_BLOCK_SIZE / spdk_bdev_get_block_size(bdev);
|
||||
max_xfer_len = SPDK_WORK_BLOCK_SIZE / block_size;
|
||||
if (spdk_unlikely(xfer_len > max_xfer_len)) {
|
||||
SPDK_ERRLOG("xfer_len %" PRIu32 " > maximum transfer length %" PRIu32 "\n",
|
||||
xfer_len, max_xfer_len);
|
||||
@ -1504,9 +1491,20 @@ spdk_bdev_scsi_readwrite(struct spdk_scsi_task *task,
|
||||
}
|
||||
|
||||
if (is_read) {
|
||||
return spdk_bdev_scsi_read(bdev, bdev_desc, bdev_ch, task, lba, xfer_len);
|
||||
return spdk_bdev_scsi_read(bdev, bdev_desc, bdev_ch, task, lba);
|
||||
} else {
|
||||
return spdk_bdev_scsi_write(bdev, bdev_desc, bdev_ch, task, lba, xfer_len);
|
||||
/* Additional check for Transfer Length */
|
||||
if (xfer_len * block_size > task->transfer_len) {
|
||||
SPDK_ERRLOG("xfer_len %" PRIu32 " * block_size %" PRIu32 " > transfer_len %u\n",
|
||||
xfer_len, block_size, task->transfer_len);
|
||||
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
|
||||
SPDK_SCSI_SENSE_NO_SENSE,
|
||||
SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
|
||||
SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
|
||||
return SPDK_SCSI_TASK_COMPLETE;
|
||||
}
|
||||
|
||||
return spdk_bdev_scsi_write(bdev, bdev_desc, bdev_ch, task, lba);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user