dovecot-2.2: lib-fs: Added fs_file_close() to explicitly close a...

dovecot at dovecot.org dovecot at dovecot.org
Wed Apr 10 21:18:21 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/5ce775d70c7d
changeset: 16269:5ce775d70c7d
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Apr 10 21:18:07 2013 +0300
description:
lib-fs: Added fs_file_close() to explicitly close all streams that the file has open.

diffstat:

 src/lib-fs/fs-api-private.h |   1 +
 src/lib-fs/fs-api.c         |  22 +++++++++++++++-------
 src/lib-fs/fs-api.h         |   3 +++
 src/lib-fs/fs-metawrap.c    |  17 ++++++++++++++---
 src/lib-fs/fs-posix.c       |  10 ++++++----
 src/lib-fs/fs-sis-queue.c   |   9 +++++++++
 src/lib-fs/fs-sis.c         |  13 +++++++++++--
 7 files changed, 59 insertions(+), 16 deletions(-)

diffs (216 lines):

diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-api-private.h
--- a/src/lib-fs/fs-api-private.h	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-api-private.h	Wed Apr 10 21:18:07 2013 +0300
@@ -15,6 +15,7 @@
 				     enum fs_open_mode mode,
 				     enum fs_open_flags flags);
 	void (*file_deinit)(struct fs_file *file);
+	void (*file_close)(struct fs_file *file);
 	const char *(*get_path)(struct fs_file *file);
 
 	void (*set_async_callback)(struct fs_file *file,
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-api.c
--- a/src/lib-fs/fs-api.c	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-api.c	Wed Apr 10 21:18:07 2013 +0300
@@ -164,6 +164,19 @@
 
 	*_file = NULL;
 
+	fs_file_close(file);
+
+	file->fs->files_open_count--;
+	T_BEGIN {
+		file->fs->v.file_deinit(file);
+	} T_END;
+
+	if (metadata_pool != NULL)
+		pool_unref(&metadata_pool);
+}
+
+void fs_file_close(struct fs_file *file)
+{
 	if (file->pending_read_input != NULL)
 		i_stream_unref(&file->pending_read_input);
 	if (file->seekable_input != NULL)
@@ -173,14 +186,9 @@
 		i_stream_unref(&file->copy_input);
 		(void)fs_write_stream_abort(file, &file->copy_output);
 	}
-
-	file->fs->files_open_count--;
-	T_BEGIN {
-		file->fs->v.file_deinit(file);
+	if (file->fs->v.file_close != NULL) T_BEGIN {
+		file->fs->v.file_close(file);
 	} T_END;
-
-	if (metadata_pool != NULL)
-		pool_unref(&metadata_pool);
 }
 
 enum fs_properties fs_get_properties(struct fs *fs)
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-api.h
--- a/src/lib-fs/fs-api.h	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-api.h	Wed Apr 10 21:18:07 2013 +0300
@@ -95,6 +95,9 @@
 struct fs_file *fs_file_init(struct fs *fs, const char *path, int mode_flags);
 void fs_file_deinit(struct fs_file **file);
 
+/* If the file has an input streams open, close them. */
+void fs_file_close(struct fs_file *file);
+
 /* Return properties supported by backend. */
 enum fs_properties fs_get_properties(struct fs *fs);
 
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-metawrap.c
--- a/src/lib-fs/fs-metawrap.c	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-metawrap.c	Wed Apr 10 21:18:07 2013 +0300
@@ -123,15 +123,25 @@
 {
 	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
 
-	if (file->input != NULL)
-		i_stream_unref(&file->input);
-	if (file->super_read != file->super)
+	if (file->super_read != file->super && file->super_read != NULL)
 		fs_file_deinit(&file->super_read);
 	fs_file_deinit(&file->super);
 	i_free(file->file.path);
 	i_free(file);
 }
 
+static void fs_metawrap_file_close(struct fs_file *_file)
+{
+	struct metawrap_fs_file *file = (struct metawrap_fs_file *)_file;
+
+	if (file->input != NULL)
+		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;
@@ -408,6 +418,7 @@
 		fs_metawrap_get_properties,
 		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,
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-posix.c
--- a/src/lib-fs/fs-posix.c	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-posix.c	Wed Apr 10 21:18:07 2013 +0300
@@ -252,8 +252,10 @@
 	return &file->file;
 }
 
-static void fs_posix_file_close(struct posix_fs_file *file)
+static void fs_posix_file_close(struct fs_file *_file)
 {
+	struct posix_fs_file *file = (struct posix_fs_file *)_file;
+
 	if (file->fd != -1 && file->file.output == NULL) {
 		if (close(file->fd) < 0) {
 			fs_set_critical(file->file.fs, "close(%s) failed: %m",
@@ -286,7 +288,6 @@
 		break;
 	}
 
-	fs_posix_file_close(file);
 	i_free(file->temp_path);
 	i_free(file->file.path);
 	i_free(file);
@@ -333,7 +334,7 @@
 	ret = read(file->fd, buf, size);
 	if (ret < 0)
 		fs_set_error(_file->fs, "read(%s) failed: %m", _file->path);
-	fs_posix_file_close(file);
+	fs_posix_file_close(_file);
 	return ret;
 }
 
@@ -349,7 +350,7 @@
 	} else {
 		input = i_stream_create_fd(file->fd, max_buffer_size, FALSE);
 	}
-	i_stream_add_destroy_callback(input, fs_posix_file_close, file);
+	i_stream_add_destroy_callback(input, fs_posix_file_close, _file);
 	return input;
 }
 
@@ -754,6 +755,7 @@
 		fs_posix_get_properties,
 		fs_posix_file_init,
 		fs_posix_file_deinit,
+		fs_posix_file_close,
 		NULL,
 		NULL, NULL,
 		NULL, NULL,
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-sis-queue.c
--- a/src/lib-fs/fs-sis-queue.c	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-sis-queue.c	Wed Apr 10 21:18:07 2013 +0300
@@ -117,6 +117,14 @@
 	i_free(file);
 }
 
+static void fs_sis_queue_file_close(struct fs_file *_file)
+{
+	struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
+
+	if (file->super != NULL)
+		fs_file_close(file->super);
+}
+
 static const char *fs_sis_queue_file_get_path(struct fs_file *_file)
 {
 	struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
@@ -352,6 +360,7 @@
 		fs_sis_queue_get_properties,
 		fs_sis_queue_file_init,
 		fs_sis_queue_file_deinit,
+		fs_sis_queue_file_close,
 		fs_sis_queue_file_get_path,
 		fs_sis_queue_set_async_callback,
 		fs_sis_queue_wait_async,
diff -r a3bd79aec23a -r 5ce775d70c7d src/lib-fs/fs-sis.c
--- a/src/lib-fs/fs-sis.c	Wed Apr 10 18:48:54 2013 +0300
+++ b/src/lib-fs/fs-sis.c	Wed Apr 10 21:18:07 2013 +0300
@@ -145,8 +145,6 @@
 {
 	struct sis_fs_file *file = (struct sis_fs_file *)_file;
 
-	if (file->hash_input != NULL)
-		i_stream_unref(&file->hash_input);
 	fs_file_deinit(&file->hash_file);
 	fs_file_deinit(&file->super);
 	i_free(file->hash);
@@ -155,6 +153,16 @@
 	i_free(file);
 }
 
+static void fs_sis_file_close(struct fs_file *_file)
+{
+	struct sis_fs_file *file = (struct sis_fs_file *)_file;
+
+	if (file->hash_input != NULL)
+		i_stream_unref(&file->hash_input);
+	fs_file_close(file->hash_file);
+	fs_file_close(file->super);
+}
+
 static const char *fs_sis_file_get_path(struct fs_file *_file)
 {
 	struct sis_fs_file *file = (struct sis_fs_file *)_file;
@@ -486,6 +494,7 @@
 		fs_sis_get_properties,
 		fs_sis_file_init,
 		fs_sis_file_deinit,
+		fs_sis_file_close,
 		fs_sis_file_get_path,
 		fs_sis_set_async_callback,
 		fs_sis_wait_async,


More information about the dovecot-cvs mailing list