blobfs: Add separate I/O target for md

This isn't strictly necessary, but follow the
pattern for sync and I/O devices.

Change-Id: I34b1bd6f9da06008e419f55ee9810022f5fed3d5
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/361674
Tested-by: <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-05-15 15:15:20 -07:00 committed by Daniel Verkamp
parent a3ab7610f6
commit 267a4e1ebd

View File

@ -101,8 +101,6 @@ struct spdk_filesystem {
struct spdk_bs_opts bs_opts; struct spdk_bs_opts bs_opts;
struct spdk_bs_dev *bdev; struct spdk_bs_dev *bdev;
fs_send_request_fn send_request; fs_send_request_fn send_request;
struct spdk_io_channel *md_io_channel;
struct spdk_fs_channel *md_fs_channel;
struct { struct {
uint32_t max_ops; uint32_t max_ops;
@ -110,6 +108,12 @@ struct spdk_filesystem {
struct spdk_fs_channel *sync_fs_channel; struct spdk_fs_channel *sync_fs_channel;
} sync_target; } sync_target;
struct {
uint32_t max_ops;
struct spdk_io_channel *md_io_channel;
struct spdk_fs_channel *md_fs_channel;
} md_target;
struct { struct {
uint32_t max_ops; uint32_t max_ops;
} io_target; } io_target;
@ -270,7 +274,12 @@ _spdk_fs_channel_create(struct spdk_filesystem *fs, struct spdk_fs_channel *chan
static int static int
_spdk_fs_md_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx) _spdk_fs_md_channel_create(void *io_device, uint32_t priority, void *ctx_buf, void *unique_ctx)
{ {
return _spdk_fs_channel_create(io_device, ctx_buf, 512); struct spdk_filesystem *fs;
struct spdk_fs_channel *channel = ctx_buf;
fs = SPDK_CONTAINEROF(io_device, struct spdk_filesystem, md_target);
return _spdk_fs_channel_create(fs, channel, fs->md_target.max_ops);
} }
static int static int
@ -317,8 +326,9 @@ common_fs_bs_init(struct spdk_filesystem *fs, struct spdk_blob_store *bs)
{ {
fs->bs = bs; fs->bs = bs;
fs->bs_opts.cluster_sz = spdk_bs_get_cluster_size(bs); fs->bs_opts.cluster_sz = spdk_bs_get_cluster_size(bs);
fs->md_fs_channel->bs_channel = spdk_bs_alloc_io_channel(fs->bs, SPDK_IO_PRIORITY_DEFAULT); fs->md_target.md_fs_channel->bs_channel = spdk_bs_alloc_io_channel(fs->bs,
fs->md_fs_channel->send_request = __send_request_direct; SPDK_IO_PRIORITY_DEFAULT);
fs->md_target.md_fs_channel->send_request = __send_request_direct;
fs->sync_target.sync_fs_channel->bs_channel = spdk_bs_alloc_io_channel(fs->bs, fs->sync_target.sync_fs_channel->bs_channel = spdk_bs_alloc_io_channel(fs->bs,
SPDK_IO_PRIORITY_DEFAULT); SPDK_IO_PRIORITY_DEFAULT);
fs->sync_target.sync_fs_channel->send_request = __send_request_direct; fs->sync_target.sync_fs_channel->send_request = __send_request_direct;
@ -355,11 +365,13 @@ fs_alloc(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn)
fs->bdev = dev; fs->bdev = dev;
fs->send_request = send_request_fn; fs->send_request = send_request_fn;
TAILQ_INIT(&fs->files); TAILQ_INIT(&fs->files);
spdk_io_device_register(fs, _spdk_fs_md_channel_create, _spdk_fs_channel_destroy,
sizeof(struct spdk_fs_channel));
fs->md_io_channel = spdk_get_io_channel(fs, SPDK_IO_PRIORITY_DEFAULT, true, NULL); fs->md_target.max_ops = 512;
fs->md_fs_channel = spdk_io_channel_get_ctx(fs->md_io_channel); spdk_io_device_register(&fs->md_target, _spdk_fs_md_channel_create, _spdk_fs_channel_destroy,
sizeof(struct spdk_fs_channel));
fs->md_target.md_io_channel = spdk_get_io_channel(&fs->md_target, SPDK_IO_PRIORITY_DEFAULT, false,
NULL);
fs->md_target.md_fs_channel = spdk_io_channel_get_ctx(fs->md_target.md_io_channel);
fs->sync_target.max_ops = 512; fs->sync_target.max_ops = 512;
spdk_io_device_register(&fs->sync_target, _spdk_fs_sync_channel_create, _spdk_fs_channel_destroy, spdk_io_device_register(&fs->sync_target, _spdk_fs_sync_channel_create, _spdk_fs_channel_destroy,
@ -391,7 +403,7 @@ spdk_fs_init(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn,
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
@ -511,7 +523,7 @@ spdk_fs_load(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn,
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
@ -534,9 +546,11 @@ unload_cb(void *ctx, int bserrno)
args->fn.fs_op(args->arg, bserrno); args->fn.fs_op(args->arg, bserrno);
free(req); free(req);
spdk_io_device_unregister(&fs->io_target); spdk_io_device_unregister(&fs->io_target);
spdk_io_device_unregister(&fs->sync_target); spdk_io_device_unregister(&fs->sync_target);
spdk_io_device_unregister(fs); spdk_io_device_unregister(&fs->md_target);
free(fs); free(fs);
} }
@ -561,7 +575,7 @@ spdk_fs_unload(struct spdk_filesystem *fs, spdk_fs_op_complete cb_fn, void *cb_a
args->arg = cb_arg; args->arg = cb_arg;
args->fs = fs; args->fs = fs;
spdk_fs_free_io_channel(fs->md_io_channel); spdk_fs_free_io_channel(fs->md_target.md_io_channel);
spdk_fs_free_io_channel(fs->sync_target.sync_io_channel); spdk_fs_free_io_channel(fs->sync_target.sync_io_channel);
spdk_bs_unload(fs->bs, unload_cb, req); spdk_bs_unload(fs->bs, unload_cb, req);
} }
@ -713,7 +727,7 @@ spdk_fs_create_file_async(struct spdk_filesystem *fs, const char *name,
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, -ENOMEM); cb_fn(cb_arg, -ENOMEM);
return; return;
@ -845,7 +859,7 @@ spdk_fs_open_file_async(struct spdk_filesystem *fs, const char *name, uint32_t f
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, NULL, -ENOMEM); cb_fn(cb_arg, NULL, -ENOMEM);
return; return;
@ -983,7 +997,7 @@ spdk_fs_rename_file_async(struct spdk_filesystem *fs,
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, -ENOMEM); cb_fn(cb_arg, -ENOMEM);
return; return;
@ -1092,7 +1106,7 @@ spdk_fs_delete_file_async(struct spdk_filesystem *fs, const char *name,
return; return;
} }
req = alloc_fs_request(fs->md_fs_channel); req = alloc_fs_request(fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, -ENOMEM); cb_fn(cb_arg, -ENOMEM);
return; return;
@ -1224,7 +1238,7 @@ spdk_file_truncate_async(struct spdk_file *file, uint64_t length,
return; return;
} }
req = alloc_fs_request(file->fs->md_fs_channel); req = alloc_fs_request(file->fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, -ENOMEM); cb_fn(cb_arg, -ENOMEM);
return; return;
@ -2179,7 +2193,7 @@ spdk_file_close_async(struct spdk_file *file, spdk_file_op_complete cb_fn, void
struct spdk_fs_request *req; struct spdk_fs_request *req;
struct spdk_fs_cb_args *args; struct spdk_fs_cb_args *args;
req = alloc_fs_request(file->fs->md_fs_channel); req = alloc_fs_request(file->fs->md_target.md_fs_channel);
if (req == NULL) { if (req == NULL) {
cb_fn(cb_arg, -ENOMEM); cb_fn(cb_arg, -ENOMEM);
return; return;
@ -2190,7 +2204,7 @@ spdk_file_close_async(struct spdk_file *file, spdk_file_op_complete cb_fn, void
args->fn.file_op = cb_fn; args->fn.file_op = cb_fn;
args->arg = cb_arg; args->arg = cb_arg;
spdk_file_sync_async(file, file->fs->md_io_channel, __file_close_async__sync_done, req); spdk_file_sync_async(file, file->fs->md_target.md_io_channel, __file_close_async__sync_done, req);
} }
static void static void