changeset 20507:bceab6533a28

fs-metawrap: Use fs_wrapper_*() wherever possible
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 05 Jul 2016 17:59:08 +0300
parents 06ab8b2728d9
children c97e2a2d88b1
files src/lib-fs/fs-metawrap.c
diffstat 1 files changed, 40 insertions(+), 142 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fs/fs-metawrap.c	Tue Jul 05 17:55:12 2016 +0300
+++ b/src/lib-fs/fs-metawrap.c	Tue Jul 05 17:59:08 2016 +0300
@@ -21,7 +21,7 @@
 struct metawrap_fs_file {
 	struct fs_file file;
 	struct metawrap_fs *fs;
-	struct fs_file *super, *super_read;
+	struct fs_file *super_read;
 	enum fs_open_mode open_mode;
 	struct istream *input;
 	bool metadata_read;
@@ -33,11 +33,6 @@
 	bool metadata_changed_since_write;
 };
 
-struct metawrap_fs_iter {
-	struct fs_iter iter;
-	struct fs_iter *super;
-};
-
 static struct fs *fs_metawrap_alloc(void)
 {
 	struct metawrap_fs *fs;
@@ -117,15 +112,15 @@
 	/* avoid unnecessarily creating two seekable streams */
 	flags &= ~FS_OPEN_FLAG_SEEKABLE;
 
-	file->super = fs_file_init(_fs->parent, path, mode | flags);
+	file->file.parent = fs_file_init(_fs->parent, path, mode | flags);
 	if (file->fs->wrap_metadata && mode == FS_OPEN_MODE_READONLY &&
 	    (flags & FS_OPEN_FLAG_ASYNC) == 0) {
-		/* use async stream for super, so fs_read_stream() won't create
+		/* use async stream for parent, so fs_read_stream() won't create
 		   another seekable stream unneededly */
 		file->super_read = fs_file_init(_fs->parent, path, mode | flags |
 						FS_OPEN_FLAG_ASYNC);
 	} else {
-		file->super_read = file->super;
+		file->super_read = file->file.parent;
 	}
 	fs_metadata_init(&file->file);
 	return &file->file;
@@ -135,11 +130,11 @@
 {
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
-	if (file->super_read != file->super && file->super_read != NULL)
+	if (file->super_read != _file->parent && file->super_read != NULL)
 		fs_file_deinit(&file->super_read);
 	if (file->metadata_header != NULL)
 		str_free(&file->metadata_header);
-	fs_file_deinit(&file->super);
+	fs_file_deinit(&_file->parent);
 	i_free(file->file.path);
 	i_free(file);
 }
@@ -152,30 +147,8 @@
 		i_stream_unref(&file->input);
 	if (file->super_read != NULL)
 		fs_file_close(file->super_read);
-	if (file->super != NULL)
-		fs_file_close(file->super);
-}
-
-static const char *fs_metawrap_file_get_path(struct fs_file *_file)
-{
-	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
-
-	return fs_file_path(file->super);
-}
-
-static void
-fs_metawrap_set_async_callback(struct fs_file *_file,
-			       fs_file_async_callback_t *callback,
-			       void *context)
-{
-	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
-
-	fs_file_set_async_callback(file->super, callback, context);
-}
-
-static int fs_metawrap_wait_async(struct fs *_fs)
-{
-	return fs_wait_async(_fs->parent);
+	if (_file->parent != NULL)
+		fs_file_close(_file->parent);
 }
 
 static void
@@ -185,7 +158,7 @@
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
 	if (!file->fs->wrap_metadata)
-		fs_set_metadata(file->super, key, value);
+		fs_set_metadata(_file->parent, key, value);
 	else {
 		fs_default_set_metadata(_file, key, value);
 		file->metadata_changed_since_write = TRUE;
@@ -201,7 +174,7 @@
 	char c;
 
 	if (!file->fs->wrap_metadata)
-		return fs_get_metadata(file->super, metadata_r);
+		return fs_get_metadata(_file->parent, metadata_r);
 
 	if (file->metadata_read) {
 		/* we have the metadata */
@@ -235,7 +208,7 @@
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
 	if (!file->fs->wrap_metadata)
-		return fs_prefetch(file->super, length);
+		return fs_prefetch(_file->parent, length);
 	else
 		return fs_prefetch(file->super_read, length);
 }
@@ -245,7 +218,7 @@
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
 	if (!file->fs->wrap_metadata)
-		return fs_read(file->super, buf, size);
+		return fs_read(_file->parent, buf, size);
 	return fs_read_via_stream(_file, buf, size);
 }
 
@@ -273,7 +246,7 @@
 	struct istream *input;
 
 	if (!file->fs->wrap_metadata)
-		return fs_read_stream(file->super, max_buffer_size);
+		return fs_read_stream(_file->parent, max_buffer_size);
 
 	if (file->input != NULL) {
 		i_stream_ref(file->input);
@@ -293,7 +266,7 @@
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
 	if (!file->fs->wrap_metadata)
-		return fs_write(file->super, data, size);
+		return fs_write(_file->parent, data, size);
 	return fs_write_via_stream(_file, data, size);
 }
 
@@ -339,7 +312,7 @@
 	i_assert(_file->output == NULL);
 
 	if (!file->fs->wrap_metadata) {
-		file->super_output = fs_write_stream(file->super);
+		file->super_output = fs_write_stream(_file->parent);
 		_file->output = file->super_output;
 	} else {
 		file->temp_output =
@@ -392,7 +365,7 @@
 		if (file->super_output != NULL) {
 			/* no metawrap */
 			i_assert(file->temp_output == NULL);
-			fs_write_stream_abort(file->super, &file->super_output);
+			fs_write_stream_abort(_file->parent, &file->super_output);
 		} else {
 			i_assert(file->temp_output != NULL);
 			o_stream_destroy(&file->temp_output);
@@ -403,12 +376,12 @@
 	if (file->super_output != NULL) {
 		/* no metawrap */
 		i_assert(file->temp_output == NULL);
-		return fs_write_stream_finish(file->super, &file->super_output);
+		return fs_write_stream_finish(_file->parent, &file->super_output);
 	}
 	if (file->temp_output == NULL) {
 		/* finishing up */
 		i_assert(file->super_output == NULL);
-		return fs_write_stream_finish_async(file->super);
+		return fs_write_stream_finish_async(_file->parent);
 	}
 	/* finish writing the temporary file */
 	input = iostream_temp_finish(&file->temp_output, IO_BLOCK_SIZE);
@@ -421,48 +394,28 @@
 		input = fs_metawrap_create_updated_istream(file, input);
 		i_stream_unref(&input2);
 	}
-	file->super_output = fs_write_stream(file->super);
+	file->super_output = fs_write_stream(_file->parent);
 	(void)o_stream_send_istream(file->super_output, input);
 	if (input->stream_errno != 0) {
 		fs_set_error(_file->fs, "read(%s) failed: %s",
 			     i_stream_get_name(input),
 			     i_stream_get_error(input));
-		fs_write_stream_abort(file->super, &file->super_output);
+		fs_write_stream_abort(_file->parent, &file->super_output);
 		ret = -1;
 	} else if (file->super_output->stream_errno != 0) {
 		fs_set_error(_file->fs, "write(%s) failed: %s",
 			     o_stream_get_name(file->super_output),
 			     o_stream_get_error(file->super_output));
-		fs_write_stream_abort(file->super, &file->super_output);
+		fs_write_stream_abort(_file->parent, &file->super_output);
 		ret = -1;
 	} else {
 		i_assert(i_stream_is_eof(input));
-		ret = fs_write_stream_finish(file->super, &file->super_output);
+		ret = fs_write_stream_finish(_file->parent, &file->super_output);
 	}
 	i_stream_unref(&input);
 	return ret;
 }
 
-static int
-fs_metawrap_lock(struct fs_file *_file, unsigned int secs, struct fs_lock **lock_r)
-{
-	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
-
-	return fs_lock(file->super, secs, lock_r);
-}
-
-static void fs_metawrap_unlock(struct fs_lock *_lock ATTR_UNUSED)
-{
-	i_unreached();
-}
-
-static int fs_metawrap_exists(struct fs_file *_file)
-{
-	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
-
-	return fs_exists(file->super);
-}
-
 static int fs_metawrap_stat(struct fs_file *_file, struct stat *st_r)
 {
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
@@ -471,11 +424,11 @@
 	ssize_t ret;
 
 	if (!file->fs->wrap_metadata)
-		return fs_stat(file->super, st_r);
+		return fs_stat(_file->parent, st_r);
 
 	if (file->metadata_write_size != 0) {
 		/* fs_stat() after a write. we can do this quickly. */
-		if (fs_stat(file->super, st_r) < 0)
+		if (fs_stat(_file->parent, st_r) < 0)
 			return -1;
 		if ((uoff_t)st_r->st_size < file->metadata_write_size) {
 			fs_set_error(_file->fs,
@@ -510,7 +463,7 @@
 		return -1;
 	}
 
-	if (fs_stat(file->super, st_r) < 0) {
+	if (fs_stat(_file->parent, st_r) < 0) {
 		i_assert(errno != EAGAIN); /* read should have caught this */
 		return -1;
 	}
@@ -520,67 +473,12 @@
 
 static int fs_metawrap_copy(struct fs_file *_src, struct fs_file *_dest)
 {
-	struct metawrap_fs_file *src = (struct metawrap_fs_file *)_src;
-	struct metawrap_fs_file *dest = (struct metawrap_fs_file *)_dest;
-
-	if (!dest->fs->wrap_metadata || !_dest->metadata_changed) {
-		if (_src != NULL)
-			return fs_copy(src->super, dest->super);
-		else
-			return fs_copy_finish_async(dest->super);
-	}
-	return fs_default_copy(_src, _dest);
-}
-
-static int fs_metawrap_rename(struct fs_file *_src, struct fs_file *_dest)
-{
-	struct metawrap_fs_file *src = (struct metawrap_fs_file *)_src;
 	struct metawrap_fs_file *dest = (struct metawrap_fs_file *)_dest;
 
-	return fs_rename(src->super, dest->super);
-}
-
-static int fs_metawrap_delete(struct fs_file *_file)
-{
-	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
-
-	return fs_delete(file->super);
-}
-
-static struct fs_iter *
-fs_metawrap_iter_init(struct fs *_fs, const char *path,
-		      enum fs_iter_flags flags)
-{
-	struct metawrap_fs_iter *iter;
-
-	iter = i_new(struct metawrap_fs_iter, 1);
-	iter->iter.fs = _fs;
-	iter->iter.flags = flags;
-	iter->super = fs_iter_init(_fs->parent, path, flags);
-	return &iter->iter;
-}
-
-static const char *fs_metawrap_iter_next(struct fs_iter *_iter)
-{
-	struct metawrap_fs_iter *iter = (struct metawrap_fs_iter *)_iter;
-	const char *fname;
-
-	iter->super->async_callback = _iter->async_callback;
-	iter->super->async_context = _iter->async_context;
-
-	fname = fs_iter_next(iter->super);
-	_iter->async_have_more = iter->super->async_have_more;
-	return fname;
-}
-
-static int fs_metawrap_iter_deinit(struct fs_iter *_iter)
-{
-	struct metawrap_fs_iter *iter = (struct metawrap_fs_iter *)_iter;
-	int ret;
-
-	ret = fs_iter_deinit(&iter->super);
-	i_free(iter);
-	return ret;
+	if (!dest->fs->wrap_metadata || !_dest->metadata_changed)
+		return fs_wrapper_copy(_src, _dest);
+	else
+		return fs_default_copy(_src, _dest);
 }
 
 const struct fs fs_class_metawrap = {
@@ -593,9 +491,9 @@
 		fs_metawrap_file_init,
 		fs_metawrap_file_deinit,
 		fs_metawrap_file_close,
-		fs_metawrap_file_get_path,
-		fs_metawrap_set_async_callback,
-		fs_metawrap_wait_async,
+		fs_wrapper_file_get_path,
+		fs_wrapper_set_async_callback,
+		fs_wrapper_wait_async,
 		fs_metawrap_set_metadata,
 		fs_metawrap_get_metadata,
 		fs_metawrap_prefetch,
@@ -604,16 +502,16 @@
 		fs_metawrap_write,
 		fs_metawrap_write_stream,
 		fs_metawrap_write_stream_finish,
-		fs_metawrap_lock,
-		fs_metawrap_unlock,
-		fs_metawrap_exists,
+		fs_wrapper_lock,
+		fs_wrapper_unlock,
+		fs_wrapper_exists,
 		fs_metawrap_stat,
 		fs_metawrap_copy,
-		fs_metawrap_rename,
-		fs_metawrap_delete,
-		fs_metawrap_iter_init,
-		fs_metawrap_iter_next,
-		fs_metawrap_iter_deinit,
+		fs_wrapper_rename,
+		fs_wrapper_delete,
+		fs_wrapper_iter_init,
+		fs_wrapper_iter_next,
+		fs_wrapper_iter_deinit,
 		NULL
 	}
 };