Commit 36c9ac2d authored by Chunyang Hui's avatar Chunyang Hui Committed by Jim Harris
Browse files

bdev/opal: Add rpc for init, revert and get info



Add bdev_nvme_opal_init, bdev_nvme_opal_revert,
bdev_opal_get_info rpc commands.

Change-Id: Ib53492c02a1c18603834640d23f9fb2e7eb08657
Signed-off-by: default avatarChunyang Hui <chunyang.hui@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468917


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 5f42a717
Loading
Loading
Loading
Loading
+123 −0
Original line number Diff line number Diff line
@@ -5468,6 +5468,80 @@ Example response:

# OPAL

## bdev_nvme_opal_init {#rpc_bdev_nvme_opal_init}

This is used to initialize OPAL of a given NVMe ctrlr, including taking ownership and activating.

### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
password                | Required | string      | admin password of OPAL

### Example

Example request:

~~~
{
  "jsonrpc": "2.0",
  "method": "bdev_nvme_opal_init",
  "id": 1,
  "params": {
    "nvme_ctrlr_name": "nvme0",
    "password": "*****"
  }
}
~~~

Example response:

~~~
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
~~~

## bdev_nvme_opal_revert {#rpc_bdev_nvme_opal_revert}

This is used to revert OPAL to its factory settings. Erase all user configuration and data.

### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
password                | Required | string      | admin password of OPAL

### Example

Example request:

~~~
{
  "jsonrpc": "2.0",
  "method": "bdev_nvme_opal_revert",
  "id": 1,
  "params": {
    "nvme_ctrlr_name": "nvme0",
    "password": "*****"
  }
}
~~~

Example response:

~~~
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
~~~

## bdev_opal_create {#rpc_bdev_opal_create}

This is used to create an OPAL virtual bdev.
@@ -5517,6 +5591,55 @@ Example response:
}
~~~

## bdev_opal_get_info {#rpc_bdev_opal_get_info}

This is used to get information of a given OPAL bdev.

### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
bdev_name               | Required | string      | name of OPAL vbdev
password                | Required | string      | admin password

### Response

The response is the locking info of OPAL virtual bdev.

### Example

Example request:

~~~
{
  "jsonrpc": "2.0",
  "method": "bdev_opal_get_info",
  "id": 1,
  "params": {
    "bdev_name": "nvme0n1r1",
    "password": "*****"
  }
}
~~~

Example response:

~~~
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
      "name": "nvme0n1r1",
      "range_start": 0,
      "range_length": 4096,
      "read_lock_enabled": true,
      "write_lock_enabled": true,
      "read_locked": false,
      "write_locked": false
    }
}
~~~

## bdev_opal_delete {#rpc_bdev_opal_delete}

This is used to delete OPAL vbdev.
+6 −0
Original line number Diff line number Diff line
@@ -226,7 +226,13 @@ bdev_nvme_ctrlr_destruct(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr)
{
	assert(nvme_bdev_ctrlr->destruct);
	if (nvme_bdev_ctrlr->opal_dev) {
		if (nvme_bdev_ctrlr->opal_poller != NULL) {
			spdk_poller_unregister(&nvme_bdev_ctrlr->opal_poller);
			/* wait until we get the result */
			while (spdk_opal_revert_poll(nvme_bdev_ctrlr->opal_dev) == -EAGAIN);
		}
		spdk_opal_close(nvme_bdev_ctrlr->opal_dev);
		nvme_bdev_ctrlr->opal_dev = NULL;
	}
	pthread_mutex_lock(&g_bdev_nvme_mutex);
	TAILQ_REMOVE(&g_nvme_bdev_ctrlrs, nvme_bdev_ctrlr, tailq);
+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ struct nvme_bdev_ctrlr {
	struct nvme_bdev		*bdevs;

	struct spdk_opal_dev		*opal_dev;
	struct spdk_poller		*opal_poller;

	struct spdk_poller		*adminq_timer_poller;

+77 −0
Original line number Diff line number Diff line
@@ -228,6 +228,50 @@ vbdev_opal_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_
	}
}

struct spdk_opal_locking_range_info *
spdk_vbdev_opal_get_info_from_bdev(const char *opal_bdev_name, const char *password)
{
	struct opal_vbdev *vbdev;
	struct nvme_bdev_ctrlr *nvme_ctrlr;
	int locking_range_id;
	int rc;

	TAILQ_FOREACH(vbdev, &g_opal_vbdev, tailq) {
		if (strcmp(vbdev->name, opal_bdev_name) == 0) {
			break;
		}
	}

	if (vbdev == NULL) {
		SPDK_ERRLOG("%s not found\n", opal_bdev_name);
		return NULL;
	}

	nvme_ctrlr = vbdev->nvme_ctrlr;
	if (nvme_ctrlr == NULL) {
		SPDK_ERRLOG("can't find nvme_ctrlr of %s\n", vbdev->name);
		return NULL;
	}

	if (spdk_opal_get_max_locking_ranges(nvme_ctrlr->opal_dev) == 0) {
		rc = spdk_opal_cmd_get_max_ranges(nvme_ctrlr->opal_dev, password);
		if (rc) {
			SPDK_ERRLOG("Get locking range number failure: %d\n", rc);
			return NULL;
		}
	}

	locking_range_id = vbdev->cfg.locking_range_id;
	rc = spdk_opal_cmd_get_locking_range_info(nvme_ctrlr->opal_dev, password,
			OPAL_ADMIN1, locking_range_id);
	if (rc) {
		SPDK_ERRLOG("Get locking range info error: %d\n", rc);
		return NULL;
	}

	return spdk_opal_get_locking_range_info(nvme_ctrlr->opal_dev, locking_range_id);
}

static int
vbdev_opal_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
{
@@ -514,6 +558,7 @@ spdk_vbdev_opal_destruct(const char *bdev_name, const char *password)
		goto err;
	}

	spdk_opal_free_locking_range_info(opal_bdev->opal_dev, locking_range_id);
	vbdev_opal_destruct_bdev(opal_bdev);
	return 0;

@@ -528,4 +573,36 @@ vbdev_opal_examine(struct spdk_bdev *bdev)
	spdk_bdev_module_examine_done(&opal_if);
}

static int
vbdev_opal_recv_poll(void *arg)
{
	struct nvme_bdev_ctrlr *nvme_ctrlr = arg;
	int rc;

	rc = spdk_opal_revert_poll(nvme_ctrlr->opal_dev);
	if (rc == -EAGAIN) {
		return -1;
	}

	/* receive end */
	spdk_poller_unregister(&nvme_ctrlr->opal_poller);
	nvme_ctrlr->opal_poller = NULL;
	return 1;
}

int
spdk_vbdev_opal_revert_tper(struct nvme_bdev_ctrlr *nvme_ctrlr, const char *password,
			    spdk_opal_revert_cb cb_fn, void *cb_ctx)
{
	int rc;

	rc = spdk_opal_cmd_revert_tper_async(nvme_ctrlr->opal_dev, password, cb_fn, cb_ctx);
	if (rc) {
		SPDK_ERRLOG("%s revert tper failure: %d\n", nvme_ctrlr->name, rc);
		return rc;
	}
	nvme_ctrlr->opal_poller = spdk_poller_register(vbdev_opal_recv_poll, nvme_ctrlr, 50);
	return 0;
}

SPDK_LOG_REGISTER_COMPONENT("vbdev_opal", SPDK_LOG_VBDEV_OPAL)
+5 −0
Original line number Diff line number Diff line
@@ -40,6 +40,11 @@
int spdk_vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_range_id,
			   uint64_t range_start, uint64_t range_length, const char *password);

struct spdk_opal_locking_range_info *spdk_vbdev_opal_get_info_from_bdev(const char *opal_bdev_name,
		const char *password);

int spdk_vbdev_opal_destruct(const char *bdev_name, const char *password);

int spdk_vbdev_opal_revert_tper(struct nvme_bdev_ctrlr *nvme_ctrlr, const char *password,
				spdk_opal_revert_cb cb_fn, void *cb_ctx);
#endif
Loading