Commit 42fe2e9b authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Ben Walker
Browse files

lib/ftl: Add config to construct_ftl rpc for dirty shutdown restore



Gives the ability to change behavior of restore after dirty shutdown
without recompiling ftl library. User can define if partial recovery
or error should be returned after such a scenario.

Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@intel.com>
Change-Id: I6dda40df7b92d6a377957e4a70a3eab91a6ac4a9
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/456185


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent a9ce7b85
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -141,6 +141,8 @@ struct spdk_ftl_attrs {
	size_t					lbk_size;
	/* Write buffer cache */
	struct spdk_bdev_desc			*cache_bdev_desc;
	/* Allow partial recovery after dirty shutdown */
	bool					allow_open_bands;
};

struct ftl_module_init_opts {
+8 −1
Original line number Diff line number Diff line
@@ -436,6 +436,8 @@ bdev_ftl_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w
		spdk_json_write_named_string(w, "cache", cache_bdev);
	}

	spdk_json_write_named_bool(w, "allow_open_bands", attrs.allow_open_bands);

	spdk_json_write_object_end(w);
	spdk_json_write_object_end(w);
}
@@ -749,8 +751,13 @@ bdev_ftl_create(struct spdk_nvme_ctrlr *ctrlr, const struct ftl_bdev_init_opts *
	struct spdk_bdev *cache_bdev = NULL;
	struct nvme_bdev_ctrlr *ftl_ctrlr;
	struct spdk_ftl_dev_init_opts opts = {};
	struct spdk_ftl_conf conf = {};
	int rc;

	spdk_ftl_conf_init_defaults(&conf);

	conf.allow_open_bands = bdev_opts->allow_open_bands;

	ftl_ctrlr = bdev_ftl_add_ctrlr(ctrlr, &bdev_opts->trid);
	if (!ftl_ctrlr) {
		spdk_nvme_detach(ctrlr);
@@ -804,7 +811,7 @@ bdev_ftl_create(struct spdk_nvme_ctrlr *ctrlr, const struct ftl_bdev_init_opts *
	opts.uuid = bdev_opts->uuid;
	opts.name = ftl_bdev->bdev.name;
	opts.cache_bdev_desc = ftl_bdev->cache_bdev_desc;
	opts.conf = NULL;
	opts.conf = &conf;

	/* TODO: set threads based on config */
	opts.core_thread = opts.read_thread = spdk_get_thread();
+2 −0
Original line number Diff line number Diff line
@@ -64,6 +64,8 @@ struct ftl_bdev_init_opts {
	uint32_t				mode;
	/* UUID if device is restored from SSD */
	struct spdk_uuid			uuid;
	/* Allow for partial restore after dirty shutdown */
	bool					allow_open_bands;
};

typedef void (*ftl_bdev_init_fn)(const struct ftl_bdev_info *, void *, int);
+6 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ struct rpc_construct_ftl {
	char *punits;
	char *uuid;
	char *cache_bdev;
	bool allow_open_bands;
};

static void
@@ -66,6 +67,10 @@ static const struct spdk_json_object_decoder rpc_construct_ftl_decoders[] = {
	{"punits", offsetof(struct rpc_construct_ftl, punits), spdk_json_decode_string},
	{"uuid", offsetof(struct rpc_construct_ftl, uuid), spdk_json_decode_string, true},
	{"cache", offsetof(struct rpc_construct_ftl, cache_bdev), spdk_json_decode_string, true},
	{
		"allow_open_bands", offsetof(struct rpc_construct_ftl, allow_open_bands),
		spdk_json_decode_bool, true
	},
};

#define FTL_RANGE_MAX_LENGTH 32
@@ -123,6 +128,7 @@ spdk_rpc_construct_ftl_bdev(struct spdk_jsonrpc_request *request,
	opts.name = req.name;
	opts.mode = SPDK_FTL_MODE_CREATE;
	opts.cache_bdev = req.cache_bdev;
	opts.allow_open_bands = req.allow_open_bands;

	/* Parse trtype */
	rc = spdk_nvme_transport_id_parse_trtype(&opts.trid.trtype, req.trtype);
+1 −0
Original line number Diff line number Diff line
@@ -1643,6 +1643,7 @@ spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *at
	attrs->lbk_size = FTL_BLOCK_SIZE;
	attrs->range = dev->range;
	attrs->cache_bdev_desc = dev->nv_cache.bdev_desc;
	attrs->allow_open_bands = dev->conf.allow_open_bands;
}

static void
Loading