Commit d62e9b74 authored by liucheng's avatar liucheng Committed by Tomasz Zawadzki
Browse files

uring: add uring bdev rescan feature



Signed-off-by: default avatarliucheng <liuc@yusur.tech>
Change-Id: If8dbdc9e5f9e1c48b9d9bf9121d753d36f0b7f6e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13010


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 94fc1b80
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -7,6 +7,10 @@
Function `spdk_subsystem_init_from_json_config` is deprecated and will be removed in 24.09 release.
Please use `spdk_subsystem_load_config` instead.

### bdev_uring

Added `bdev_uring_rescan` RPC to allow rescaning the size of uring bdev.

## v24.01

### accel
+35 −0
Original line number Diff line number Diff line
@@ -10818,6 +10818,41 @@ Example response:
}
~~~

### bdev_uring_rescan {#rpc_bdev_uring_rescan}

Rescan the size of a uring bdev.

#### Parameters

Name | Optional | Type   | Description
---- | -------- | ------ | -----------
name | Required | string | name of uring bdev to rescan

#### Example

Example request:

~~~json
{
  "jsonrpc": "2.0",
  "method": "bdev_uring_rescan",
  "id": 1,
  "params": {
    "name": "bdev_u0"
  }
}
~~~

Example response:

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

### bdev_uring_delete {#rpc_bdev_uring_delete}

Remove a uring bdev.
+49 −0
Original line number Diff line number Diff line
@@ -101,6 +101,55 @@ bdev_uring_open(struct bdev_uring *bdev)
	return 0;
}

static void
dummy_bdev_event_cb(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, void *ctx)
{
}

int
bdev_uring_rescan(const char *name)
{
	struct spdk_bdev_desc *desc;
	struct spdk_bdev *bdev;
	struct bdev_uring *uring;
	uint64_t uring_size, blockcnt;
	int rc;

	rc = spdk_bdev_open_ext(name, false, dummy_bdev_event_cb, NULL, &desc);
	if (rc != 0) {
		return rc;
	}

	bdev = spdk_bdev_desc_get_bdev(desc);
	if (bdev->module != &uring_if) {
		rc = -ENODEV;
		goto exit;
	}

	uring = SPDK_CONTAINEROF(bdev, struct bdev_uring, bdev);
	uring_size = spdk_fd_get_size(uring->fd);
	blockcnt = uring_size / bdev->blocklen;

	if (bdev->blockcnt != blockcnt) {
		SPDK_NOTICELOG("URING device is resized: bdev name %s, old block count %" PRIu64
			       ", new block count %"
			       PRIu64 "\n",
			       uring->filename,
			       bdev->blockcnt,
			       blockcnt);
		rc = spdk_bdev_notify_blockcnt_change(bdev, blockcnt);
		if (rc != 0) {
			SPDK_ERRLOG("Could not change num blocks for uring bdev: name %s, errno: %d.\n",
				    uring->filename, rc);
			goto exit;
		}
	}

exit:
	spdk_bdev_close(desc);
	return rc;
}

static int
bdev_uring_close(struct bdev_uring *bdev)
{
+2 −0
Original line number Diff line number Diff line
@@ -26,4 +26,6 @@ struct spdk_bdev *create_uring_bdev(const struct bdev_uring_opts *opts);

void delete_uring_bdev(const char *name, spdk_delete_uring_complete cb_fn, void *cb_arg);

int bdev_uring_rescan(const char *name);

#endif /* SPDK_BDEV_URING_H */
+36 −0
Original line number Diff line number Diff line
@@ -76,6 +76,42 @@ cleanup:
}
SPDK_RPC_REGISTER("bdev_uring_create", rpc_bdev_uring_create, SPDK_RPC_RUNTIME)

struct rpc_rescan_uring {
	char *name;
};

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

static void
rpc_bdev_uring_rescan(struct spdk_jsonrpc_request *request,
		      const struct spdk_json_val *params)
{
	struct rpc_rescan_uring req = {NULL};
	int bdeverrno;

	if (spdk_json_decode_object(params, rpc_rescan_uring_decoders,
				    SPDK_COUNTOF(rpc_rescan_uring_decoders),
				    &req)) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						 "spdk_json_decode_object failed");
		goto cleanup;
	}

	bdeverrno = bdev_uring_rescan(req.name);
	if (bdeverrno) {
		spdk_jsonrpc_send_error_response(request, bdeverrno,
						 spdk_strerror(-bdeverrno));
		goto cleanup;
	}

	spdk_jsonrpc_send_bool_response(request, true);
cleanup:
	free(req.name);
}
SPDK_RPC_REGISTER("bdev_uring_rescan", rpc_bdev_uring_rescan, SPDK_RPC_RUNTIME)

struct rpc_delete_uring {
	char *name;
};
Loading