bdev/ocssd: find_io_path() returns bdev_ocssd_ns and spdk_nvme_ns pointers directly
Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Change-Id: Ifd5a3f5ab2e87d383da1c3b94949fa2ffd916ecc Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8150 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
parent
55e4be3432
commit
b7cc001a04
@ -107,14 +107,16 @@ bdev_ocssd_get_ns_from_nvme(struct nvme_bdev_ns *nvme_ns)
|
||||
|
||||
static inline bool
|
||||
bdev_ocssd_find_io_path(struct nvme_bdev *nbdev, struct nvme_io_path *io_path,
|
||||
struct nvme_bdev_ns **_nvme_ns, struct spdk_nvme_qpair **_qpair)
|
||||
struct bdev_ocssd_ns **_ocssd_ns,
|
||||
struct spdk_nvme_ns **_ns, struct spdk_nvme_qpair **_qpair)
|
||||
{
|
||||
if (spdk_unlikely(io_path->qpair == NULL)) {
|
||||
/* The device is currently resetting. */
|
||||
return false;
|
||||
}
|
||||
|
||||
*_nvme_ns = nbdev->nvme_ns;
|
||||
*_ocssd_ns = bdev_ocssd_get_ns_from_nvme(nbdev->nvme_ns);
|
||||
*_ns = nbdev->nvme_ns->ns;
|
||||
*_qpair = io_path->qpair;
|
||||
return true;
|
||||
}
|
||||
@ -383,12 +385,11 @@ bdev_ocssd_read_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
struct spdk_nvme_qpair *qpair,
|
||||
bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
|
||||
void *md, uint64_t lba_count, uint64_t lba)
|
||||
{
|
||||
struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
const size_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
|
||||
|
||||
if ((lba % zone_size) + lba_count > zone_size) {
|
||||
@ -403,7 +404,7 @@ bdev_ocssd_read(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
|
||||
lba = bdev_ocssd_to_disk_lba(ocssd_ns, lba);
|
||||
|
||||
return spdk_nvme_ns_cmd_readv_with_md(nvme_ns->ns, qpair, lba,
|
||||
return spdk_nvme_ns_cmd_readv_with_md(ns, qpair, lba,
|
||||
lba_count, bdev_ocssd_read_cb,
|
||||
ocdev_io, 0, bdev_ocssd_reset_sgl,
|
||||
bdev_ocssd_next_sge, md, 0, 0);
|
||||
@ -424,12 +425,11 @@ bdev_ocssd_write_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
struct spdk_nvme_qpair *qpair,
|
||||
bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
|
||||
void *md, uint64_t lba_count, uint64_t lba)
|
||||
{
|
||||
struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
const size_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
|
||||
struct bdev_ocssd_zone *zone;
|
||||
int rc;
|
||||
@ -452,7 +452,7 @@ bdev_ocssd_write(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
|
||||
lba = bdev_ocssd_to_disk_lba(ocssd_ns, lba);
|
||||
|
||||
rc = spdk_nvme_ns_cmd_writev_with_md(nvme_ns->ns, qpair, lba,
|
||||
rc = spdk_nvme_ns_cmd_writev_with_md(ns, qpair, lba,
|
||||
lba_count, bdev_ocssd_write_cb,
|
||||
ocdev_io, 0, bdev_ocssd_reset_sgl,
|
||||
bdev_ocssd_next_sge, md, 0, 0);
|
||||
@ -479,12 +479,11 @@ bdev_ocssd_append_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
struct spdk_nvme_qpair *qpair,
|
||||
bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
struct bdev_ocssd_io *ocdev_io, struct iovec *iov, int iovcnt,
|
||||
void *md, uint64_t lba_count, uint64_t lba)
|
||||
{
|
||||
struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
struct bdev_ocssd_zone *zone;
|
||||
int rc = 0;
|
||||
|
||||
@ -512,7 +511,7 @@ bdev_ocssd_zone_append(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_
|
||||
|
||||
lba = bdev_ocssd_to_disk_lba(ocssd_ns, zone->write_pointer);
|
||||
|
||||
rc = spdk_nvme_ns_cmd_writev_with_md(nvme_ns->ns, qpair, lba,
|
||||
rc = spdk_nvme_ns_cmd_writev_with_md(ns, qpair, lba,
|
||||
lba_count, bdev_ocssd_append_cb,
|
||||
ocdev_io, 0, bdev_ocssd_reset_sgl,
|
||||
bdev_ocssd_next_sge, md, 0, 0);
|
||||
@ -529,7 +528,8 @@ bdev_ocssd_io_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
|
||||
{
|
||||
struct ocssd_bdev *ocssd_bdev = (struct ocssd_bdev *)bdev_io->bdev->ctxt;
|
||||
struct nvme_io_path *io_path = spdk_io_channel_get_ctx(ch);
|
||||
struct nvme_bdev_ns *nvme_ns;
|
||||
struct bdev_ocssd_ns *ocssd_ns;
|
||||
struct spdk_nvme_ns *ns;
|
||||
struct spdk_nvme_qpair *qpair;
|
||||
int rc;
|
||||
|
||||
@ -539,13 +539,14 @@ bdev_ocssd_io_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_i
|
||||
}
|
||||
|
||||
if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path,
|
||||
&nvme_ns, &qpair))) {
|
||||
&ocssd_ns, &ns, &qpair))) {
|
||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
rc = bdev_ocssd_read(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
qpair,
|
||||
(struct bdev_ocssd_io *)bdev_io->driver_ctx,
|
||||
bdev_io->u.bdev.iovs,
|
||||
@ -575,11 +576,10 @@ bdev_ocssd_reset_zone_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
struct spdk_nvme_qpair *qpair,
|
||||
bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
struct bdev_ocssd_io *ocdev_io, uint64_t slba, size_t num_zones)
|
||||
{
|
||||
struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
uint64_t offset, zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
|
||||
struct bdev_ocssd_zone *zone;
|
||||
int rc;
|
||||
@ -601,7 +601,7 @@ bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_n
|
||||
|
||||
ocdev_io->io.zone = zone;
|
||||
|
||||
rc = spdk_nvme_ocssd_ns_cmd_vector_reset(nvme_ns->ns, qpair,
|
||||
rc = spdk_nvme_ocssd_ns_cmd_vector_reset(ns, qpair,
|
||||
ocdev_io->io.lba, num_zones, NULL,
|
||||
bdev_ocssd_reset_zone_cb, ocdev_io);
|
||||
if (spdk_unlikely(rc != 0)) {
|
||||
@ -611,8 +611,8 @@ bdev_ocssd_reset_zone(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_n
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev,
|
||||
struct nvme_bdev_ns *nvme_ns,
|
||||
static int _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns,
|
||||
struct bdev_ocssd_io *ocdev_io, uint64_t zone_id);
|
||||
|
||||
static void
|
||||
@ -654,7 +654,7 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(ctx);
|
||||
struct ocssd_bdev *ocssd_bdev = bdev_io->bdev->ctxt;
|
||||
struct nvme_io_path *io_path;
|
||||
struct nvme_bdev_ns *nvme_ns;
|
||||
struct spdk_nvme_ns *ns;
|
||||
struct spdk_nvme_qpair *qpair;
|
||||
struct bdev_ocssd_ns *ocssd_ns;
|
||||
struct spdk_bdev_zone_info *zone_info;
|
||||
@ -667,13 +667,12 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
|
||||
io_path = spdk_io_channel_get_ctx(spdk_bdev_io_get_io_channel(bdev_io));
|
||||
|
||||
if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path, &nvme_ns, &qpair))) {
|
||||
if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path, &ocssd_ns, &ns,
|
||||
&qpair))) {
|
||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
|
||||
return;
|
||||
}
|
||||
|
||||
ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
|
||||
zone_info = ((struct spdk_bdev_zone_info *)bdev_io->u.zone_mgmt.buf) +
|
||||
ocdev_io->zone_info.chunk_offset;
|
||||
bdev_ocssd_fill_zone_info(ocssd_bdev, ocssd_ns, zone_info, chunk_info);
|
||||
@ -681,7 +680,7 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
if (++ocdev_io->zone_info.chunk_offset == bdev_io->u.zone_mgmt.num_zones) {
|
||||
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_SUCCESS);
|
||||
} else {
|
||||
rc = _bdev_ocssd_get_zone_info(ocssd_bdev, nvme_ns, ocdev_io,
|
||||
rc = _bdev_ocssd_get_zone_info(ocssd_bdev, ocssd_ns, ns, ocdev_io,
|
||||
bdev_io->u.zone_mgmt.zone_id);
|
||||
if (spdk_unlikely(rc != 0)) {
|
||||
if (rc == -ENOMEM) {
|
||||
@ -694,18 +693,18 @@ bdev_ocssd_zone_info_cb(void *ctx, const struct spdk_nvme_cpl *cpl)
|
||||
}
|
||||
|
||||
static int
|
||||
_bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
_bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns,
|
||||
struct bdev_ocssd_io *ocdev_io, uint64_t zone_id)
|
||||
{
|
||||
struct bdev_ocssd_ns *ocssd_ns = bdev_ocssd_get_ns_from_nvme(nvme_ns);
|
||||
uint64_t lba, offset, zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
|
||||
|
||||
lba = zone_id + ocdev_io->zone_info.chunk_offset * zone_size;
|
||||
offset = bdev_ocssd_to_chunk_info_offset(ocssd_ns, lba);
|
||||
|
||||
return spdk_nvme_ctrlr_cmd_get_log_page(spdk_nvme_ns_get_ctrlr(nvme_ns->ns),
|
||||
return spdk_nvme_ctrlr_cmd_get_log_page(spdk_nvme_ns_get_ctrlr(ns),
|
||||
SPDK_OCSSD_LOG_CHUNK_INFO,
|
||||
spdk_nvme_ns_get_id(nvme_ns->ns),
|
||||
spdk_nvme_ns_get_id(ns),
|
||||
&ocdev_io->zone_info.chunk_info,
|
||||
sizeof(ocdev_io->zone_info.chunk_info),
|
||||
offset * sizeof(ocdev_io->zone_info.chunk_info),
|
||||
@ -713,7 +712,8 @@ _bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nv
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns,
|
||||
struct bdev_ocssd_io *ocdev_io, uint64_t zone_id, uint32_t num_zones)
|
||||
{
|
||||
uint64_t zone_size = bdev_ocssd_get_zone_size(ocssd_bdev);
|
||||
@ -730,17 +730,19 @@ bdev_ocssd_get_zone_info(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvm
|
||||
|
||||
ocdev_io->zone_info.chunk_offset = 0;
|
||||
|
||||
return _bdev_ocssd_get_zone_info(ocssd_bdev, nvme_ns, ocdev_io, zone_id);
|
||||
return _bdev_ocssd_get_zone_info(ocssd_bdev, ocssd_ns, ns, ocdev_io, zone_id);
|
||||
}
|
||||
|
||||
static int
|
||||
bdev_ocssd_zone_management(struct ocssd_bdev *ocssd_bdev, struct nvme_bdev_ns *nvme_ns,
|
||||
struct spdk_nvme_qpair *qpair, struct spdk_bdev_io *bdev_io)
|
||||
bdev_ocssd_zone_management(struct ocssd_bdev *ocssd_bdev, struct bdev_ocssd_ns *ocssd_ns,
|
||||
struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
struct spdk_bdev_io *bdev_io)
|
||||
{
|
||||
switch (bdev_io->u.zone_mgmt.zone_action) {
|
||||
case SPDK_BDEV_ZONE_RESET:
|
||||
return bdev_ocssd_reset_zone(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
qpair,
|
||||
(struct bdev_ocssd_io *)bdev_io->driver_ctx,
|
||||
bdev_io->u.zone_mgmt.zone_id,
|
||||
@ -797,11 +799,12 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
|
||||
struct nvme_io_path *io_path = spdk_io_channel_get_ctx(ch);
|
||||
struct ocssd_bdev *ocssd_bdev = (struct ocssd_bdev *)bdev_io->bdev->ctxt;
|
||||
struct bdev_ocssd_io *ocdev_io = (struct bdev_ocssd_io *)bdev_io->driver_ctx;
|
||||
struct nvme_bdev_ns *nvme_ns;
|
||||
struct bdev_ocssd_ns *ocssd_ns;
|
||||
struct spdk_nvme_ns *ns;
|
||||
struct spdk_nvme_qpair *qpair;
|
||||
|
||||
if (spdk_unlikely(!bdev_ocssd_find_io_path(&ocssd_bdev->nvme_bdev, io_path,
|
||||
&nvme_ns, &qpair))) {
|
||||
&ocssd_ns, &ns, &qpair))) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -809,7 +812,8 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
|
||||
case SPDK_BDEV_IO_TYPE_READ:
|
||||
if (bdev_io->u.bdev.iovs && bdev_io->u.bdev.iovs[0].iov_base) {
|
||||
return bdev_ocssd_read(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
qpair,
|
||||
ocdev_io,
|
||||
bdev_io->u.bdev.iovs,
|
||||
@ -825,7 +829,8 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
|
||||
|
||||
case SPDK_BDEV_IO_TYPE_WRITE:
|
||||
return bdev_ocssd_write(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
qpair,
|
||||
ocdev_io,
|
||||
bdev_io->u.bdev.iovs,
|
||||
@ -835,18 +840,20 @@ _bdev_ocssd_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
|
||||
bdev_io->u.bdev.offset_blocks);
|
||||
|
||||
case SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT:
|
||||
return bdev_ocssd_zone_management(ocssd_bdev, nvme_ns, qpair, bdev_io);
|
||||
return bdev_ocssd_zone_management(ocssd_bdev, ocssd_ns, ns, qpair, bdev_io);
|
||||
|
||||
case SPDK_BDEV_IO_TYPE_GET_ZONE_INFO:
|
||||
return bdev_ocssd_get_zone_info(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
ocdev_io,
|
||||
bdev_io->u.zone_mgmt.zone_id,
|
||||
bdev_io->u.zone_mgmt.num_zones);
|
||||
|
||||
case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
|
||||
return bdev_ocssd_zone_append(ocssd_bdev,
|
||||
nvme_ns,
|
||||
ocssd_ns,
|
||||
ns,
|
||||
qpair,
|
||||
ocdev_io,
|
||||
bdev_io->u.bdev.iovs,
|
||||
|
Loading…
Reference in New Issue
Block a user