Commit e9d400d5 authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

blobfs: Change channel type for synchronous operations



In the next step, this won't be a channel at all.

Change-Id: Ia8fe4da5b0b283e8dfc5c6477b84cfdd346d89a0
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/449464


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 088c5e04
Loading
Loading
Loading
Loading
+36 −29
Original line number Diff line number Diff line
@@ -176,15 +176,6 @@ void spdk_fs_unload(struct spdk_filesystem *fs, spdk_fs_op_complete cb_fn, void
 */
struct spdk_io_channel *spdk_fs_alloc_io_channel(struct spdk_filesystem *fs);

/**
 * Allocate an I/O channel for synchronous operations.
 *
 * \param fs Blobstore filesystem to allocate I/O channel.
 *
 * \return a pointer to the I/O channel on success or NULL otherwise.
 */
struct spdk_io_channel *spdk_fs_alloc_io_channel_sync(struct spdk_filesystem *fs);

/**
 * Free I/O channel.
 *
@@ -195,18 +186,34 @@ struct spdk_io_channel *spdk_fs_alloc_io_channel_sync(struct spdk_filesystem *fs
 */
void spdk_fs_free_io_channel(struct spdk_io_channel *channel);

/**
 * Allocate a context for synchronous operations.
 *
 * \param fs Blobstore filesystem for this context.
 *
 * \return a pointer to the context on success or NULL otherwise.
 */
struct spdk_fs_thread_ctx *spdk_fs_alloc_thread_ctx(struct spdk_filesystem *fs);

/**
 * Free thread context.
 *
 * \param ctx Thread context to free.
 */
void spdk_fs_free_thread_ctx(struct spdk_fs_thread_ctx *ctx);

/**
 * Get statistics about the file including the underlying blob id and the file size.
 *
 * \param fs Blobstore filesystem.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param name The file name used to look up the matched file in the blobstore filesystem.
 * \param stat Caller allocated structure to store the obtained information about
 * this file.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_fs_file_stat(struct spdk_filesystem *fs, struct spdk_io_channel *channel,
int spdk_fs_file_stat(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		      const char *name, struct spdk_file_stat *stat);

#define SPDK_BLOBFS_OPEN_CREATE	(1ULL << 0)
@@ -215,37 +222,37 @@ int spdk_fs_file_stat(struct spdk_filesystem *fs, struct spdk_io_channel *channe
 * Create a new file on the given blobstore filesystem.
 *
 * \param fs Blobstore filesystem.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param name The file name for this new file.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_fs_create_file(struct spdk_filesystem *fs, struct spdk_io_channel *channel,
int spdk_fs_create_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
			const char *name);

/**
 * Open the file.
 *
 * \param fs Blobstore filesystem.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param name The file name used to look up the matched file in the blobstore filesystem.
 * \param flags This flags will be used to control the open mode.
 * \param file It will point to the open file if sccessful or NULL otherwirse.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_fs_open_file(struct spdk_filesystem *fs, struct spdk_io_channel *channel,
int spdk_fs_open_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		      const char *name, uint32_t flags, struct spdk_file **file);

/**
 * Close the file.
 *
 * \param file File to close.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_file_close(struct spdk_file *file, struct spdk_io_channel *channel);
int spdk_file_close(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx);

/**
 * Change the file name.
@@ -254,25 +261,25 @@ int spdk_file_close(struct spdk_file *file, struct spdk_io_channel *channel);
 * same name.
 *
 * \param fs Blobstore filesystem.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param old_name Old name of the file.
 * \param new_name New name of the file.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_fs_rename_file(struct spdk_filesystem *fs, struct spdk_io_channel *channel,
int spdk_fs_rename_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
			const char *old_name, const char *new_name);

/**
 * Delete the file.
 *
 * \param fs Blobstore filesystem.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param name The name of the file to be deleted.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_fs_delete_file(struct spdk_filesystem *fs, struct spdk_io_channel *channel,
int spdk_fs_delete_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
			const char *name);

/**
@@ -299,12 +306,12 @@ spdk_fs_iter spdk_fs_iter_next(spdk_fs_iter iter);
 * Truncate the file.
 *
 * \param file File to truncate.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param length New size in bytes of the file.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_file_truncate(struct spdk_file *file, struct spdk_io_channel *channel,
int spdk_file_truncate(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
		       uint64_t length);

/**
@@ -329,28 +336,28 @@ uint64_t spdk_file_get_length(struct spdk_file *file);
 * Write data to the given file.
 *
 * \param file File to write.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param payload The specified buffer which should contain the data to be transmitted.
 * \param offset The beginning position to write data.
 * \param length The size in bytes of data to write.
 *
 * \return 0 on success, negative errno on failure.
 */
int spdk_file_write(struct spdk_file *file, struct spdk_io_channel *channel,
int spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
		    void *payload, uint64_t offset, uint64_t length);

/**
 * Read data to user buffer from the given file.
 *
 * \param file File to read.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 * \param payload The specified buffer which will store the obtained data.
 * \param offset The beginning position to read.
 * \param length The size in bytes of data to read.
 *
 * \return the end position of this read operation on success, negated errno on failure.
 */
int64_t spdk_file_read(struct spdk_file *file, struct spdk_io_channel *channel,
int64_t spdk_file_read(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
		       void *payload, uint64_t offset, uint64_t length);

/**
@@ -382,11 +389,11 @@ void spdk_file_set_priority(struct spdk_file *file, uint32_t priority);
 * Synchronize the data from the cache to the disk.
 *
 * \param file File to sync.
 * \param channel The I/O channel used to allocate file request.
 * \param ctx The thread context for this operation
 *
 * \return 0 on success.
 */
int spdk_file_sync(struct spdk_file *file, struct spdk_io_channel *channel);
int spdk_file_sync(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx);

/**
 * Get the unique ID for the file.
+40 −26
Original line number Diff line number Diff line
@@ -254,6 +254,12 @@ struct spdk_fs_channel {
	pthread_spinlock_t		lock;
};

/* For now, this is effectively an alias. But eventually we'll shift
 * some data members over. */
struct spdk_fs_thread_ctx {
	struct spdk_fs_channel	ch;
};

static struct spdk_fs_request *
alloc_fs_request(struct spdk_fs_channel *channel)
{
@@ -849,10 +855,10 @@ __file_stat(void *arg)
}

int
spdk_fs_file_stat(struct spdk_filesystem *fs, struct spdk_io_channel *_channel,
spdk_fs_file_stat(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		  const char *name, struct spdk_file_stat *stat)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	int rc;

@@ -1003,9 +1009,9 @@ __fs_create_file(void *arg)
}

int
spdk_fs_create_file(struct spdk_filesystem *fs, struct spdk_io_channel *_channel, const char *name)
spdk_fs_create_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx, const char *name)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;
	int rc;
@@ -1148,10 +1154,10 @@ __fs_open_file(void *arg)
}

int
spdk_fs_open_file(struct spdk_filesystem *fs, struct spdk_io_channel *_channel,
spdk_fs_open_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		  const char *name, uint32_t flags, struct spdk_file **file)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;
	int rc;
@@ -1288,10 +1294,10 @@ __fs_rename_file(void *arg)
}

int
spdk_fs_rename_file(struct spdk_filesystem *fs, struct spdk_io_channel *_channel,
spdk_fs_rename_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		    const char *old_name, const char *new_name)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;
	int rc;
@@ -1396,10 +1402,10 @@ __fs_delete_file(void *arg)
}

int
spdk_fs_delete_file(struct spdk_filesystem *fs, struct spdk_io_channel *_channel,
spdk_fs_delete_file(struct spdk_filesystem *fs, struct spdk_fs_thread_ctx *ctx,
		    const char *name)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;
	int rc;
@@ -1545,10 +1551,10 @@ __truncate(void *arg)
}

int
spdk_file_truncate(struct spdk_file *file, struct spdk_io_channel *_channel,
spdk_file_truncate(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
		   uint64_t length)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;
	int rc;
@@ -1723,8 +1729,14 @@ spdk_fs_alloc_io_channel(struct spdk_filesystem *fs)
	return io_channel;
}

struct spdk_io_channel *
spdk_fs_alloc_io_channel_sync(struct spdk_filesystem *fs)
void
spdk_fs_free_io_channel(struct spdk_io_channel *channel)
{
	spdk_put_io_channel(channel);
}

struct spdk_fs_thread_ctx *
spdk_fs_alloc_thread_ctx(struct spdk_filesystem *fs)
{
	struct spdk_io_channel *io_channel;
	struct spdk_fs_channel *fs_channel;
@@ -1735,13 +1747,15 @@ spdk_fs_alloc_io_channel_sync(struct spdk_filesystem *fs)
	fs_channel->sync = 1;
	pthread_spin_init(&fs_channel->lock, 0);

	return io_channel;
	/* These two types are currently equivalent */
	return (struct spdk_fs_thread_ctx *)fs_channel;
}


void
spdk_fs_free_io_channel(struct spdk_io_channel *channel)
spdk_fs_free_thread_ctx(struct spdk_fs_thread_ctx *ctx)
{
	spdk_put_io_channel(channel);
	spdk_put_io_channel(spdk_io_channel_from_ctx(ctx));
}

void
@@ -2120,10 +2134,10 @@ __send_rw_from_file(struct spdk_file *file, sem_t *sem, void *payload,
}

int
spdk_file_write(struct spdk_file *file, struct spdk_io_channel *_channel,
spdk_file_write(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
		void *payload, uint64_t offset, uint64_t length)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_cb_args *args;
	uint64_t rem_length, copy, blob_size, cluster_sz;
	uint32_t cache_buffers_filled = 0;
@@ -2334,10 +2348,10 @@ __file_read(struct spdk_file *file, void *payload, uint64_t offset, uint64_t len
}

int64_t
spdk_file_read(struct spdk_file *file, struct spdk_io_channel *_channel,
spdk_file_read(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx,
	       void *payload, uint64_t offset, uint64_t length)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	uint64_t final_offset, final_length;
	uint32_t sub_reads = 0;
	int rc = 0;
@@ -2443,9 +2457,9 @@ _file_sync(struct spdk_file *file, struct spdk_fs_channel *channel,
}

int
spdk_file_sync(struct spdk_file *file, struct spdk_io_channel *_channel)
spdk_file_sync(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_cb_args args = {};

	args.sem = &channel->sem;
@@ -2559,9 +2573,9 @@ __file_close(void *arg)
}

int
spdk_file_close(struct spdk_file *file, struct spdk_io_channel *_channel)
spdk_file_close(struct spdk_file *file, struct spdk_fs_thread_ctx *ctx)
{
	struct spdk_fs_channel *channel = spdk_io_channel_get_ctx(_channel);
	struct spdk_fs_channel *channel = (struct spdk_fs_channel *)ctx;
	struct spdk_fs_request *req;
	struct spdk_fs_cb_args *args;

@@ -2572,7 +2586,7 @@ spdk_file_close(struct spdk_file *file, struct spdk_io_channel *_channel)

	args = &req->args;

	spdk_file_sync(file, _channel);
	spdk_file_sync(file, ctx);
	BLOBFS_TRACE(file, "name=%s\n", file->name);
	args->file = file;
	args->sem = &channel->sem;
+2 −2
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ std::string g_bdev_name;
volatile bool g_spdk_ready = false;
volatile bool g_spdk_start_failure = false;
struct sync_args {
	struct spdk_io_channel *channel;
	struct spdk_fs_thread_ctx *channel;
};

__thread struct sync_args g_sync_args;
@@ -586,7 +586,7 @@ void SpdkInitializeThread(void)
	if (g_fs != NULL) {
		thread = spdk_thread_create("spdk_rocksdb");
		spdk_set_thread(thread);
		g_sync_args.channel = spdk_fs_alloc_io_channel_sync(g_fs);
		g_sync_args.channel = spdk_fs_alloc_thread_ctx(g_fs);
	}
}

+3 −3
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ pthread_t g_fuse_thread;

struct spdk_bs_dev *g_bs_dev;
struct spdk_filesystem *g_fs;
struct spdk_io_channel *g_channel;
struct spdk_fs_thread_ctx *g_channel;
struct spdk_file *g_file;
int g_fserrno;
int g_fuse_argc = 0;
@@ -292,7 +292,7 @@ init_cb(void *ctx, struct spdk_filesystem *fs, int fserrno)
	struct spdk_event *event;

	g_fs = fs;
	g_channel = spdk_fs_alloc_io_channel_sync(g_fs);
	g_channel = spdk_fs_alloc_thread_ctx(g_fs);
	event = spdk_event_allocate(1, start_fuse_fn, NULL, NULL);
	spdk_event_call(event);
}
@@ -309,7 +309,7 @@ shutdown_cb(void *ctx, int fserrno)
{
	fuse_session_exit(fuse_get_session(g_fuse));
	pthread_kill(g_fuse_thread, SIGINT);
	spdk_fs_free_io_channel(g_channel);
	spdk_fs_free_thread_ctx(g_channel);
	spdk_app_stop(0);
}

+3 −3
Original line number Diff line number Diff line
@@ -485,7 +485,7 @@ channel_ops_sync(void)
{
	struct spdk_filesystem *fs;
	struct spdk_bs_dev *dev;
	struct spdk_io_channel *channel;
	struct spdk_fs_thread_ctx *channel;

	dev = init_dev();

@@ -496,10 +496,10 @@ channel_ops_sync(void)
	fs = g_fs;
	SPDK_CU_ASSERT_FATAL(fs->bs->dev == dev);

	channel =  spdk_fs_alloc_io_channel_sync(fs);
	channel =  spdk_fs_alloc_thread_ctx(fs);
	CU_ASSERT(channel != NULL);

	spdk_fs_free_io_channel(channel);
	spdk_fs_free_thread_ctx(channel);

	g_fserrno = 1;
	spdk_fs_unload(fs, fs_op_complete, NULL);
Loading