Commit 3a56fabc authored by Tomasz Zawadzki's avatar Tomasz Zawadzki Committed by Ben Walker
Browse files

bdev: add delete_nvme_bdev call



Since delete_bdev should be used only for debug purpose,
this patch adds delete call specific for NVMe bdev.

Signed-off-by: default avatarMaciej Szwed <maciej.szwed@intel.com>
Signed-off-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: Ib9a0475d735af2616a3005d04530ca825ece8a52
Reviewed-on: https://review.gerrithub.io/416546


Reviewed-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent b36face5
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -771,6 +771,24 @@ nvme_ctrlr_get(const struct spdk_nvme_transport_id *trid)
	return NULL;
}

static struct nvme_ctrlr *
nvme_ctrlr_get_by_name(const char *name)
{
	struct nvme_ctrlr *nvme_ctrlr;

	if (name == NULL) {
		return NULL;
	}

	TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) {
		if (strcmp(name, nvme_ctrlr->name) == 0) {
			return nvme_ctrlr;
		}
	}

	return NULL;
}

static bool
probe_cb(void *cb_ctx, const struct spdk_nvme_transport_id *trid,
	 struct spdk_nvme_ctrlr_opts *opts)
@@ -1090,6 +1108,25 @@ spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
	return 0;
}

int
spdk_bdev_nvme_delete(const char *name)
{
	struct nvme_ctrlr *nvme_ctrlr = NULL;

	if (name == NULL) {
		return -EINVAL;
	}

	nvme_ctrlr = nvme_ctrlr_get_by_name(name);
	if (nvme_ctrlr == NULL) {
		SPDK_ERRLOG("Failed to find NVMe controller\n");
		return -ENODEV;
	}

	remove_cb(NULL, nvme_ctrlr->ctrlr);
	return 0;
}

static int
bdev_nvme_library_init(void)
{
+9 −0
Original line number Diff line number Diff line
@@ -76,4 +76,13 @@ int spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
			  const char *hostnqn);
struct spdk_nvme_ctrlr *spdk_bdev_nvme_get_ctrlr(struct spdk_bdev *bdev);

/**
 * Delete NVMe controller with all bdevs on top of it.
 * Requires to pass name of NVMe controller.
 *
 * \param name NVMe controller name
 * \return zero on success, -EINVAL on wrong parameters or -ENODEV if controller is not found
 */
int spdk_bdev_nvme_delete(const char *name);

#endif // SPDK_BDEV_NVME_H
+52 −0
Original line number Diff line number Diff line
@@ -160,6 +160,58 @@ invalid:
}
SPDK_RPC_REGISTER("construct_nvme_bdev", spdk_rpc_construct_nvme_bdev, SPDK_RPC_RUNTIME)

struct rpc_delete_nvme {
	char *name;
};

static void
free_rpc_delete_nvme(struct rpc_delete_nvme *req)
{
	free(req->name);
}

static const struct spdk_json_object_decoder rpc_delete_nvme_decoders[] = {
	{"name", offsetof(struct rpc_delete_nvme, name), spdk_json_decode_string},
};

static void
spdk_rpc_delete_nvme_ctrlr(struct spdk_jsonrpc_request *request,
			   const struct spdk_json_val *params)
{
	struct rpc_delete_nvme req = {NULL};
	struct spdk_json_write_ctx *w;
	int rc = 0;

	if (spdk_json_decode_object(params, rpc_delete_nvme_decoders,
				    SPDK_COUNTOF(rpc_delete_nvme_decoders),
				    &req)) {
		rc = -EINVAL;
		goto invalid;
	}

	rc = spdk_bdev_nvme_delete(req.name);
	if (rc != 0) {
		goto invalid;
	}

	free_rpc_delete_nvme(&req);

	w = spdk_jsonrpc_begin_result(request);
	if (w == NULL) {
		return;
	}

	spdk_json_write_bool(w, true);
	spdk_jsonrpc_end_result(request, w);
	return;

invalid:
	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
					 spdk_strerror(-rc));
	free_rpc_delete_nvme(&req);
}
SPDK_RPC_REGISTER("delete_nvme_controller", spdk_rpc_delete_nvme_ctrlr, SPDK_RPC_RUNTIME)

struct rpc_apply_firmware {
	char *filename;
	char *bdev_name;
+10 −0
Original line number Diff line number Diff line
@@ -242,6 +242,16 @@ if __name__ == "__main__":
    p.add_argument('-n', '--subnqn', help='NVMe-oF target subnqn')
    p.set_defaults(func=construct_nvme_bdev)

    @call_cmd
    def delete_nvme_controller(args):
        rpc.bdev.delete_nvme_controller(args.client,
                                        name=args.name)

    p = subparsers.add_parser('delete_nvme_controller',
                              help='Delete a NVMe controller using controller name')
    p.add_argument('name', help="Name of the controller")
    p.set_defaults(func=delete_nvme_controller)

    @call_cmd
    def construct_rbd_bdev(args):
        print(rpc.bdev.construct_rbd_bdev(args.client,
+11 −0
Original line number Diff line number Diff line
@@ -177,6 +177,17 @@ def construct_nvme_bdev(client, name, trtype, traddr, adrfam=None, trsvcid=None,
    return client.call('construct_nvme_bdev', params)


def delete_nvme_controller(client, name):
    """Remove NVMe controller from the system.

    Args:
        name: controller name
    """

    params = {'name': name}
    return client.call('delete_nvme_controller', params)


def construct_rbd_bdev(client, pool_name, rbd_name, block_size, name=None):
    """Construct a Ceph RBD block device.

Loading