]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Add fs_write_stream_abort_parent and use it
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 22 Aug 2016 06:42:26 +0000 (09:42 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 23 Aug 2016 10:48:05 +0000 (13:48 +0300)
Will do all the things abort_error does, but leaves
error untouched. You are expected to set one yourself.

src/lib-fs/fs-api.c
src/lib-fs/fs-api.h
src/lib-fs/fs-metawrap.c
src/lib-fs/fs-sis-queue.c
src/lib-fs/fs-sis.c
src/lib-fs/fs-wrapper.c
src/plugins/fs-compress/fs-compress.c

index 49d099b439a5741fe48ae3c149f58ccdb22e4796..bb46cffabe26e50397669a8256852f3adcd580a8 100644 (file)
@@ -272,7 +272,8 @@ void fs_file_close(struct fs_file *file)
 
        if (file->copy_input != NULL) {
                i_stream_unref(&file->copy_input);
-               fs_write_stream_abort(file, &file->copy_output);
+               fs_write_stream_abort_error(file, &file->copy_output, "fs_file_close(%s)",
+                                           o_stream_get_name(file->copy_output));
        }
        i_free_and_null(file->write_digest);
        if (file->fs->v.file_close != NULL) T_BEGIN {
@@ -704,11 +705,9 @@ int fs_write_stream_finish_async(struct fs_file *file)
        return fs_write_stream_finish_int(file, TRUE);
 }
 
-void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...)
+static void fs_write_stream_abort_int(struct fs_file *file, struct ostream **output)
 {
        int ret;
-       va_list args;
-       va_start(args, error_fmt);
 
        i_assert(*output == file->output);
        i_assert(file->output != NULL);
@@ -717,10 +716,16 @@ void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output,
        *output = NULL;
        o_stream_ignore_last_errors(file->output);
        /* make sure we don't have an old error lying around */
-       fs_set_verror(file->fs, error_fmt, args);
        ret = fs_write_stream_finish_int(file, FALSE);
        i_assert(ret != 0);
+}
 
+void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...)
+{
+       va_list args;
+       va_start(args, error_fmt);
+       fs_set_verror(file->fs, error_fmt, args);
+       fs_write_stream_abort_int(file, output);
        va_end(args);
 }
 
@@ -729,6 +734,13 @@ void fs_write_stream_abort(struct fs_file *file, struct ostream **output)
        fs_write_stream_abort_error(file, output, "Write aborted");
 }
 
+void fs_write_stream_abort_parent(struct fs_file *file, struct ostream **output)
+{
+       i_assert(file->parent != NULL);
+       i_assert(fs_filelast_error(file->parent) != NULL);
+       fs_write_stream_abort_int(file, output);
+}
+
 void fs_write_set_hash(struct fs_file *file, const struct hash_method *method,
                       const void *digest)
 {
index c1e7b3f6994a02e26c8fb8eb362f257e156069ef..6f1c67d491badf090c714775e51cc6ec17d5014b 100644 (file)
@@ -277,6 +277,9 @@ int fs_write_stream_finish_async(struct fs_file *file);
 void fs_write_stream_abort(struct fs_file *file, struct ostream **output);
 void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...) ATTR_FORMAT(3, 4);
 
+/* Same as above, except it closes the *parent* file and error is left untouched */
+void fs_write_stream_abort_parent(struct fs_file *file, struct ostream **output);
+
 /* Set a hash to the following write. The storage can then verify that the
    input data matches the specified hash, or fail if it doesn't. Typically
    implemented by Content-MD5 header. */
index 75dff993869a3f75974dd4d6ea328d57db9033ca..f2d4acb3464682b7692f996a374a78989c7efa00 100644 (file)
@@ -365,9 +365,7 @@ static int fs_metawrap_write_stream_finish(struct fs_file *_file, bool success)
                if (file->super_output != NULL) {
                        /* no metawrap */
                        i_assert(file->temp_output == NULL);
-                       fs_write_stream_abort_error(_file->parent, &file->super_output, "error(%s): %s",
-                                                   o_stream_get_name(file->super_output),
-                                                   o_stream_get_error(file->super_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->super_output);
                } else {
                        i_assert(file->temp_output != NULL);
                        o_stream_destroy(&file->temp_output);
index 3936933355e3db5b54cc29cb6aab48776d72d35e..a317a9aa830de3fb09ea3d0f7f1cc1990926aa2e 100644 (file)
@@ -149,10 +149,7 @@ static int fs_sis_queue_write_stream_finish(struct fs_file *_file, bool success)
 
        if (!success) {
                if (_file->parent != NULL)
-                       fs_write_stream_abort_error(_file->parent, &_file->output,
-                                                   "write(%s) failed: %s",
-                                                   o_stream_get_name(_file->output),
-                                                   o_stream_get_error(_file->output));
+                       fs_write_stream_abort_parent(_file->parent, &_file->output);
                return -1;
        }
 
index d36daf501262b0b09f223abfdfe51b545629d667..a806fa5609532eb0f5be0d7ced198a5d2ebc4c91 100644 (file)
@@ -287,10 +287,7 @@ static int fs_sis_write_stream_finish(struct fs_file *_file, bool success)
 
        if (!success) {
                if (_file->parent != NULL)
-                       fs_write_stream_abort_error(_file->parent, &file->fs_output,
-                                                   "write(%s) error: %s",
-                                                   o_stream_get_name(file->fs_output),
-                                                   o_stream_get_error(file->fs_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->fs_output);
                o_stream_unref(&_file->output);
                return -1;
        }
@@ -300,7 +297,7 @@ static int fs_sis_write_stream_finish(struct fs_file *_file, bool success)
            i_stream_is_eof(file->hash_input)) {
                o_stream_unref(&_file->output);
                if (fs_sis_try_link(file)) {
-                       fs_write_stream_abort(_file->parent, &file->fs_output);
+                       fs_write_stream_abort_parent(_file->parent, &file->fs_output);
                        return 1;
                }
        }
index 2b44c324e2de352e663d07a19eae919a6ab44b37..ee1f8aab4d5f87c5a9d2e64cdc6f69b3aa129ac3 100644 (file)
@@ -79,10 +79,7 @@ void fs_wrapper_write_stream(struct fs_file *file)
 int fs_wrapper_write_stream_finish(struct fs_file *file, bool success)
 {
        if (!success) {
-               fs_write_stream_abort_error(file->parent, &file->output,
-                                           "write(%s) failed: %s",
-                                           o_stream_get_name(file->output),
-                                           o_stream_get_error(file->output));
+               fs_write_stream_abort_parent(file->parent, &file->output);
                return -1;
        }
 
index d0cd6ed7c6cd616214500449dc29502ede04a629..5d6e527ed03cde6ade13fc7ee839b2728e4cade5 100644 (file)
@@ -201,10 +201,7 @@ static int fs_compress_write_stream_finish(struct fs_file *_file, bool success)
                if (file->temp_output != NULL)
                        o_stream_destroy(&file->temp_output);
                if (file->super_output != NULL)
-                       fs_write_stream_abort_error(_file->parent, &file->super_output,
-                                                   "write(%s) failed: %s",
-                                                   o_stream_get_name(file->super_output),
-                                                   o_stream_get_error(file->super_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->super_output);
                return -1;
        }