enum spdk_ftl_mode {
    /* Create new device */
    SPDK_FTL_MODE_CREATE = (1 << 0),
};

struct spdk_ftl_attrs {
	/* Number of logical blocks */
	uint64_t num_blocks;
	/* Logical block size */
	uint64_t block_size;
	/* Optimal IO size - bdev layer will split requests over this size */
	uint64_t optimum_io_size;
};

struct spdk_ftl_conf {
	char *name
	struct spdk_uuid uuid

	uint64_t overprovisioning;
	
	/* 核心线程和其他GC线程的mask */
	char *core_mask;
	
	/* 每个用户进程的IO池大小 */
	size_t user_io_pool_size;
	
	/* FTL 启动模式 */
	uint32_t mode;
	
	/* 名字 */
	char *base_bdev;
	char *cache_bdev;
};

typedef void (*spdk_ftl_fn)(void *cb_arg, int status);
typedef void (*spdk_ftl_init_fn)(struct spdk_ftl_dev *dev, void *cb_arg, int status);

// 在给定的一堆bdevs上初始化FTL,一旦接受到一个成功完成的回调,用户则可以进行I/O
int spdk_ftl_dev_init(const struct spdk_ftl_conf *conf, spdk_ftl_init_fn cb, void *cb_arg);
int spdk_ftl_dev_free(struct spdk_ftl_dev *dev, spdk_ftl_fn cb, void *cb_arg);
void spdk_ftl_get_default_conf(struct spdk_ftl_conf *conf);