Commit aff7e226 authored by Ben Walker's avatar Ben Walker
Browse files

bdev: spdk_bdev_[read|write|flush|unmap|reset] now return int



It is not actually useful to be immediately returned
a handle to the bdev_io. There isn't anything valid
that the user can do with it at that point. Instead,
return an integer error code.

Change-Id: Iffa9a8dc5b2eefab57e3cc1f68919985431d17d1
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/364137


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent fb7ad4ac
Loading
Loading
Loading
Loading
+58 −40
Original line number Diff line number Diff line
@@ -223,9 +223,11 @@ struct spdk_io_channel *spdk_bdev_get_io_channel(struct spdk_bdev *bdev);
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		   void *buf, uint64_t offset, uint64_t nbytes,
		   spdk_bdev_io_completion_cb cb, void *cb_arg);

@@ -245,9 +247,11 @@ struct spdk_bdev_io *spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_chann
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		    struct iovec *iov, int iovcnt,
		    uint64_t offset, uint64_t nbytes,
		    spdk_bdev_io_completion_cb cb, void *cb_arg);
@@ -263,9 +267,11 @@ struct spdk_bdev_io *spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_chan
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		    void *buf, uint64_t offset, uint64_t nbytes,
		    spdk_bdev_io_completion_cb cb, void *cb_arg);

@@ -285,9 +291,11 @@ struct spdk_bdev_io *spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_chan
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		     struct iovec *iov, int iovcnt,
		     uint64_t offset, uint64_t len,
		     spdk_bdev_io_completion_cb cb, void *cb_arg);
@@ -304,9 +312,11 @@ struct spdk_bdev_io *spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_cha
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		    struct spdk_scsi_unmap_bdesc *unmap_d,
		    uint16_t bdesc_count,
		    spdk_bdev_io_completion_cb cb, void *cb_arg);
@@ -323,9 +333,11 @@ struct spdk_bdev_io *spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_chan
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
int spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		    uint64_t offset, uint64_t length,
		    spdk_bdev_io_completion_cb cb, void *cb_arg);

@@ -337,7 +349,9 @@ struct spdk_bdev_io *spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_chan
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return -1 on failure, 0 on success.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
int spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		    spdk_bdev_io_completion_cb cb, void *cb_arg);
@@ -358,9 +372,11 @@ int spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev,
int spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev,
				  struct spdk_io_channel *ch,
				  const struct spdk_nvme_cmd *cmd,
				  void *buf, size_t nbytes,
@@ -383,9 +399,11 @@ struct spdk_bdev_io *spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev,
 * \param cb Called when the request is complete.
 * \param cb_arg Argument passed to cb.
 *
 * \return A handle to the I/O request, or NULL on failure.
 * \return 0 on success. On success, the callback will always
 * be called (even if the request ultimately failed). Return
 * negated errno on failure, in which case the callback will not be called.
 */
struct spdk_bdev_io *spdk_bdev_nvme_io_passthru(struct spdk_bdev *bdev,
int spdk_bdev_nvme_io_passthru(struct spdk_bdev *bdev,
			       struct spdk_io_channel *ch,
			       const struct spdk_nvme_cmd *cmd,
			       void *buf, size_t nbytes,
+39 −40
Original line number Diff line number Diff line
@@ -705,7 +705,7 @@ spdk_bdev_io_valid(struct spdk_bdev *bdev, uint64_t offset, uint64_t nbytes)
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	       void *buf, uint64_t offset, uint64_t nbytes,
	       spdk_bdev_io_completion_cb cb, void *cb_arg)
@@ -716,13 +716,13 @@ spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,

	assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED);
	if (spdk_bdev_io_valid(bdev, offset, nbytes) != 0) {
		return NULL;
		return -EINVAL;
	}

	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("spdk_bdev_io memory allocation failed duing read\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -738,13 +738,13 @@ spdk_bdev_read(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		struct iovec *iov, int iovcnt,
		uint64_t offset, uint64_t nbytes,
@@ -756,13 +756,13 @@ spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,

	assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED);
	if (spdk_bdev_io_valid(bdev, offset, nbytes) != 0) {
		return NULL;
		return -EINVAL;
	}

	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("spdk_bdev_io memory allocation failed duing read\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -776,13 +776,13 @@ spdk_bdev_readv(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		void *buf, uint64_t offset, uint64_t nbytes,
		spdk_bdev_io_completion_cb cb, void *cb_arg)
@@ -793,13 +793,13 @@ spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch,

	assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED);
	if (spdk_bdev_io_valid(bdev, offset, nbytes) != 0) {
		return NULL;
		return -EINVAL;
	}

	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("blockdev_io memory allocation failed duing write\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -815,13 +815,13 @@ spdk_bdev_write(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		 struct iovec *iov, int iovcnt,
		 uint64_t offset, uint64_t len,
@@ -833,13 +833,13 @@ spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch,

	assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED);
	if (spdk_bdev_io_valid(bdev, offset, len) != 0) {
		return NULL;
		return -EINVAL;
	}

	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed duing writev\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -853,13 +853,13 @@ spdk_bdev_writev(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		struct spdk_scsi_unmap_bdesc *unmap_d,
		uint16_t bdesc_count,
@@ -872,19 +872,19 @@ spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	assert(bdev->status != SPDK_BDEV_STATUS_UNCLAIMED);
	if (bdesc_count == 0) {
		SPDK_ERRLOG("Invalid bdesc_count 0\n");
		return NULL;
		return -EINVAL;
	}

	if (bdesc_count > bdev->max_unmap_bdesc_count) {
		SPDK_ERRLOG("Invalid bdesc_count %u > max_unmap_bdesc_count %u\n",
			    bdesc_count, bdev->max_unmap_bdesc_count);
		return NULL;
		return -EINVAL;
	}

	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed duing unmap\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -896,13 +896,13 @@ spdk_bdev_unmap(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

struct spdk_bdev_io *
int
spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
		uint64_t offset, uint64_t length,
		spdk_bdev_io_completion_cb cb, void *cb_arg)
@@ -915,7 +915,7 @@ spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed duing flush\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -927,10 +927,10 @@ spdk_bdev_flush(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

static void
@@ -973,7 +973,7 @@ spdk_bdev_reset(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed duing reset\n");
		return -1;
		return -ENOMEM;;
	}

	bdev_io->ch = channel;
@@ -1005,7 +1005,7 @@ spdk_bdev_get_io_stat(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	memset(&channel->stat, 0, sizeof(channel->stat));
}

struct spdk_bdev_io *
int
spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
			      const struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes,
			      spdk_bdev_io_completion_cb cb, void *cb_arg)
@@ -1017,7 +1017,7 @@ spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch
	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed during nvme_admin_passthru\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -1031,14 +1031,13 @@ spdk_bdev_nvme_admin_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}


struct spdk_bdev_io *
int
spdk_bdev_nvme_io_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
			   const struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes,
			   spdk_bdev_io_completion_cb cb, void *cb_arg)
@@ -1050,7 +1049,7 @@ spdk_bdev_nvme_io_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	bdev_io = spdk_bdev_get_io();
	if (!bdev_io) {
		SPDK_ERRLOG("bdev_io memory allocation failed during nvme_admin_passthru\n");
		return NULL;
		return -ENOMEM;
	}

	bdev_io->ch = channel;
@@ -1064,10 +1063,10 @@ spdk_bdev_nvme_io_passthru(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	rc = spdk_bdev_io_submit(bdev_io);
	if (rc < 0) {
		spdk_bdev_put_io(bdev_io);
		return NULL;
		return rc;
	}

	return bdev_io;
	return 0;
}

int
+14 −14
Original line number Diff line number Diff line
@@ -71,13 +71,13 @@ bdev_blob_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *p
	       uint64_t lba, uint32_t lba_count, struct spdk_bs_dev_cb_args *cb_args)
{
	struct spdk_bdev *bdev = __get_bdev(dev);
	struct spdk_bdev_io *bdev_io;
	int rc;
	uint32_t block_size = spdk_bdev_get_block_size(bdev);

	bdev_io = spdk_bdev_read(bdev, channel, payload, lba * block_size,
	rc = spdk_bdev_read(bdev, channel, payload, lba * block_size,
			    lba_count * block_size, bdev_blob_io_complete, cb_args);
	if (bdev_io == NULL) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EIO);
	if (rc) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, rc);
	}
}

@@ -86,13 +86,13 @@ bdev_blob_write(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *
		uint64_t lba, uint32_t lba_count, struct spdk_bs_dev_cb_args *cb_args)
{
	struct spdk_bdev *bdev = __get_bdev(dev);
	struct spdk_bdev_io *bdev_io;
	int rc;
	uint32_t block_size = spdk_bdev_get_block_size(bdev);

	bdev_io = spdk_bdev_write(bdev, channel, payload, lba * block_size,
	rc = spdk_bdev_write(bdev, channel, payload, lba * block_size,
			     lba_count * block_size, bdev_blob_io_complete, cb_args);
	if (bdev_io == NULL) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EIO);
	if (rc) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, rc);
	}
}

@@ -102,7 +102,7 @@ bdev_blob_unmap(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, uint64
{
	struct spdk_bdev *bdev = __get_bdev(dev);
	struct spdk_scsi_unmap_bdesc *desc;
	struct spdk_bdev_io *bdev_io;
	int rc;

	SPDK_STATIC_ASSERT(sizeof(cb_args->scratch) >= sizeof(*desc), "scratch too small");

@@ -111,9 +111,9 @@ bdev_blob_unmap(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, uint64
	to_be32(&desc->block_count, lba_count);
	desc->reserved = 0;

	bdev_io = spdk_bdev_unmap(bdev, channel, desc, 1, bdev_blob_io_complete, cb_args);
	if (bdev_io == NULL) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EIO);
	rc = spdk_bdev_unmap(bdev, channel, desc, 1, bdev_blob_io_complete, cb_args);
	if (rc) {
		cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, rc);
	}
}

+5 −5
Original line number Diff line number Diff line
@@ -408,14 +408,14 @@ nvmf_virtual_ctrlr_rw_cmd(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	if (cmd->opc == SPDK_NVME_OPC_READ) {
		spdk_trace_record(TRACE_NVMF_LIB_READ_START, 0, 0, (uint64_t)req, 0);
		if (spdk_bdev_read(bdev, ch, req->data, offset, req->length, nvmf_virtual_ctrlr_complete_cmd,
				   req) == NULL) {
				   req)) {
			response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		}
	} else {
		spdk_trace_record(TRACE_NVMF_LIB_WRITE_START, 0, 0, (uint64_t)req, 0);
		if (spdk_bdev_write(bdev, ch, req->data, offset, req->length, nvmf_virtual_ctrlr_complete_cmd,
				    req) == NULL) {
				    req)) {
			response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
		}
@@ -433,7 +433,7 @@ nvmf_virtual_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
	struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;

	nbytes = spdk_bdev_get_num_blocks(bdev) * spdk_bdev_get_block_size(bdev);
	if (spdk_bdev_flush(bdev, ch, 0, nbytes, nvmf_virtual_ctrlr_complete_cmd, req) == NULL) {
	if (spdk_bdev_flush(bdev, ch, 0, nbytes, nvmf_virtual_ctrlr_complete_cmd, req)) {
		response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
	}
@@ -473,7 +473,7 @@ nvmf_virtual_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_io_channel *ch,
			to_be64(&unmap[i].lba, dsm_range[i].starting_lba);
			to_be32(&unmap[i].block_count, dsm_range[i].length);
		}
		if (spdk_bdev_unmap(bdev, ch, unmap, nr, nvmf_virtual_ctrlr_complete_cmd, req) == NULL) {
		if (spdk_bdev_unmap(bdev, ch, unmap, nr, nvmf_virtual_ctrlr_complete_cmd, req)) {
			free(unmap);
			response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
			return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
@@ -493,7 +493,7 @@ nvmf_virtual_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_io_chann
				    struct spdk_nvmf_request *req)
{
	if (spdk_bdev_nvme_io_passthru(bdev, ch, &req->cmd->nvme_cmd, req->data, req->length,
				       nvmf_virtual_ctrlr_complete_cmd, req) == NULL) {
				       nvmf_virtual_ctrlr_complete_cmd, req)) {
		req->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
		req->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_INVALID_OPCODE;
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
+22 −16
Original line number Diff line number Diff line
@@ -1248,6 +1248,8 @@ spdk_bdev_scsi_task_complete_cmd(struct spdk_bdev_io *bdev_io, bool success,
	struct spdk_scsi_task *task = cb_arg;
	int sc, sk, asc, ascq;

	task->blockdev_io = bdev_io;

	spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
	spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
	spdk_scsi_lun_complete_task(task->lun, task);
@@ -1311,6 +1313,7 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev,
	uint64_t blen;
	uint64_t offset;
	uint64_t nbytes;
	int rc;

	blen = spdk_bdev_get_block_size(bdev);

@@ -1322,10 +1325,10 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev,
		      "Read: lba=%"PRIu64", len=%"PRIu64"\n",
		      lba, (uint64_t)task->length / blen);

	task->blockdev_io = spdk_bdev_readv(bdev, task->ch, task->iovs,
	rc = spdk_bdev_readv(bdev, task->ch, task->iovs,
			     task->iovcnt, offset, nbytes,
			     spdk_bdev_scsi_task_complete_cmd, task);
	if (!task->blockdev_io) {
	if (rc) {
		SPDK_ERRLOG("spdk_bdev_readv() failed\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_NO_SENSE,
@@ -1347,6 +1350,7 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev,
	uint64_t blen;
	uint64_t offset;
	uint64_t nbytes;
	int rc;
	struct spdk_scsi_task *primary = task->parent;

	if (len == 0) {
@@ -1377,12 +1381,12 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev,
	}

	offset += task->offset;
	task->blockdev_io = spdk_bdev_writev(bdev, task->ch, task->iovs,
	rc = spdk_bdev_writev(bdev, task->ch, task->iovs,
			      task->iovcnt, offset, task->length,
			      spdk_bdev_scsi_task_complete_cmd,
			      task);

	if (!task->blockdev_io) {
	if (rc) {
		SPDK_ERRLOG("spdk_bdev_writev failed\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_NO_SENSE,
@@ -1412,6 +1416,7 @@ spdk_bdev_scsi_sync(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
	uint64_t blen;
	uint64_t offset;
	uint64_t nbytes;
	int rc;

	if (num_blocks == 0) {
		return SPDK_SCSI_TASK_COMPLETE;
@@ -1432,10 +1437,10 @@ spdk_bdev_scsi_sync(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
		return SPDK_SCSI_TASK_COMPLETE;
	}

	task->blockdev_io = spdk_bdev_flush(bdev, task->ch, offset, nbytes,
	rc = spdk_bdev_flush(bdev, task->ch, offset, nbytes,
			     spdk_bdev_scsi_task_complete_cmd, task);

	if (!task->blockdev_io) {
	if (rc) {
		SPDK_ERRLOG("spdk_bdev_flush() failed\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_NO_SENSE,
@@ -1486,6 +1491,7 @@ spdk_bdev_scsi_unmap(struct spdk_bdev *bdev,
	uint32_t bdesc_count, max_unmap_bdesc_count;
	int bdesc_data_len;
	int data_len;
	int rc;

	if (task->iovcnt == 1) {
		data = (uint8_t *)task->iovs[0].iov_base;
@@ -1533,11 +1539,11 @@ spdk_bdev_scsi_unmap(struct spdk_bdev *bdev,
		return SPDK_SCSI_TASK_COMPLETE;
	}

	task->blockdev_io = spdk_bdev_unmap(bdev, task->ch, desc,
	rc = spdk_bdev_unmap(bdev, task->ch, desc,
			     bdesc_count, spdk_bdev_scsi_task_complete_cmd,
			     task);

	if (!task->blockdev_io) {
	if (rc) {
		SPDK_ERRLOG("SCSI Unmapping failed\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_NO_SENSE,
Loading