blobfs: take the spdk_fs_request parameter for flush

Data structure spdk_fs_request has internal spdk_fs_cb_args
for each request, and for some APIs such as truncate they
all use spdk_fs_request as the parameter, so here we also
change flush to use the request parameter too.

Change-Id: Ic70b98cafe53d42c234f74b3703dc7797f210569
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450718
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Changpeng Liu 2019-04-09 22:38:42 -04:00 committed by Jim Harris
parent 3732429c00
commit 125797e07e

View File

@ -1774,7 +1774,7 @@ spdk_fs_get_cache_size(void)
return g_fs_cache_size / (1024 * 1024); return g_fs_cache_size / (1024 * 1024);
} }
static void __file_flush(void *_args); static void __file_flush(void *ctx);
static void * static void *
alloc_cache_memory_buffer(struct spdk_file *context) alloc_cache_memory_buffer(struct spdk_file *context)
@ -1965,9 +1965,10 @@ __check_sync_reqs(struct spdk_file *file)
} }
static void static void
__file_flush_done(void *arg, int bserrno) __file_flush_done(void *ctx, int bserrno)
{ {
struct spdk_fs_cb_args *args = arg; struct spdk_fs_request *req = ctx;
struct spdk_fs_cb_args *args = &req->args;
struct spdk_file *file = args->file; struct spdk_file *file = args->file;
struct cache_buffer *next = args->op.flush.cache_buffer; struct cache_buffer *next = args->op.flush.cache_buffer;
@ -1996,13 +1997,14 @@ __file_flush_done(void *arg, int bserrno)
__check_sync_reqs(file); __check_sync_reqs(file);
__file_flush(args); __file_flush(req);
} }
static void static void
__file_flush(void *_args) __file_flush(void *ctx)
{ {
struct spdk_fs_cb_args *args = _args; struct spdk_fs_request *req = ctx;
struct spdk_fs_cb_args *args = &req->args;
struct spdk_file *file = args->file; struct spdk_file *file = args->file;
struct cache_buffer *next; struct cache_buffer *next;
uint64_t offset, length, start_lba, num_lba; uint64_t offset, length, start_lba, num_lba;
@ -2016,7 +2018,7 @@ __file_flush(void *_args)
* progress. So return immediately - if a flush I/O is in * progress. So return immediately - if a flush I/O is in
* progress we will flush more data after that is completed. * progress we will flush more data after that is completed.
*/ */
__free_args(args); free_fs_request(req);
if (next == NULL) { if (next == NULL) {
/* /*
* For cases where a file's cache was evicted, and then the * For cases where a file's cache was evicted, and then the
@ -2040,7 +2042,7 @@ __file_flush(void *_args)
offset = next->offset + next->bytes_flushed; offset = next->offset + next->bytes_flushed;
length = next->bytes_filled - next->bytes_flushed; length = next->bytes_filled - next->bytes_flushed;
if (length == 0) { if (length == 0) {
__free_args(args); free_fs_request(req);
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
return; return;
} }
@ -2055,7 +2057,7 @@ __file_flush(void *_args)
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
spdk_blob_io_write(file->blob, file->fs->sync_target.sync_fs_channel->bs_channel, spdk_blob_io_write(file->blob, file->fs->sync_target.sync_fs_channel->bs_channel,
next->buf + (start_lba * lba_size) - next->offset, next->buf + (start_lba * lba_size) - next->offset,
start_lba, num_lba, __file_flush_done, args); start_lba, num_lba, __file_flush_done, req);
} }
static void static void
@ -2142,7 +2144,7 @@ spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
void *payload, uint64_t offset, uint64_t length) void *payload, uint64_t offset, uint64_t length)
{ {
struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx; struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
struct spdk_fs_cb_args *args; struct spdk_fs_request *flush_req;
uint64_t rem_length, copy, blob_size, cluster_sz; uint64_t rem_length, copy, blob_size, cluster_sz;
uint32_t cache_buffers_filled = 0; uint32_t cache_buffers_filled = 0;
uint8_t *cur_payload; uint8_t *cur_payload;
@ -2195,8 +2197,8 @@ spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
} }
} }
args = calloc(1, sizeof(*args)); flush_req = alloc_fs_request(channel);
if (args == NULL) { if (flush_req == NULL) {
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
return -ENOMEM; return -ENOMEM;
} }
@ -2223,7 +2225,7 @@ spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
last = cache_append_buffer(file); last = cache_append_buffer(file);
if (last == NULL) { if (last == NULL) {
BLOBFS_TRACE(file, "nomem\n"); BLOBFS_TRACE(file, "nomem\n");
__free_args(args); free_fs_request(flush_req);
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
return -ENOMEM; return -ENOMEM;
} }
@ -2233,12 +2235,12 @@ spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
if (cache_buffers_filled == 0) { if (cache_buffers_filled == 0) {
__free_args(args); free_fs_request(flush_req);
return 0; return 0;
} }
args->file = file; flush_req->args.file = file;
file->fs->send_request(__file_flush, args); file->fs->send_request(__file_flush, flush_req);
return 0; return 0;
} }
@ -2460,7 +2462,7 @@ _file_sync(struct spdk_file *file, struct spdk_fs_channel *channel,
pthread_spin_unlock(&file->lock); pthread_spin_unlock(&file->lock);
flush_args->file = file; flush_args->file = file;
channel->send_request(__file_flush, flush_args); channel->send_request(__file_flush, flush_req);
} }
int int