]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Fixes to stats count tracking
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 5 May 2016 13:15:15 +0000 (16:15 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 5 May 2016 13:15:15 +0000 (16:15 +0300)
fs_exists(), fs_copy(), fs_rename() and fs_delete() could have increased the
count multiple times on async operations.

src/lib-fs/fs-api.c

index 8ee140950e2179787cc8c73dbb59975481d9eb0c..1a2a5e2a458263de1b29fcb176ff914f6b66bf68 100644 (file)
@@ -765,13 +765,14 @@ int fs_exists(struct fs_file *file)
                else
                        return errno == ENOENT ? 0 : -1;
        }
-       file->fs->stats.exists_count++;
        fs_file_timing_start(file, FS_OP_EXISTS);
        T_BEGIN {
                ret = file->fs->v.exists(file);
        } T_END;
-       if (!(ret < 0 && errno == EAGAIN))
+       if (!(ret < 0 && errno == EAGAIN)) {
+               file->fs->stats.exists_count++;
                fs_file_timing_end(file, FS_OP_EXISTS);
+       }
        return ret;
 }
 
@@ -859,13 +860,13 @@ int fs_copy(struct fs_file *src, struct fs_file *dest)
                return -1;
        }
 
-       dest->fs->stats.copy_count++;
        fs_file_timing_start(dest, FS_OP_COPY);
        T_BEGIN {
                ret = src->fs->v.copy(src, dest);
        } T_END;
        if (!(ret < 0 && errno == EAGAIN)) {
                fs_file_timing_end(dest, FS_OP_COPY);
+               dest->fs->stats.copy_count++;
                dest->metadata_changed = FALSE;
        }
        return ret;
@@ -880,6 +881,7 @@ int fs_copy_finish_async(struct fs_file *dest)
        } T_END;
        if (!(ret < 0 && errno == EAGAIN)) {
                fs_file_timing_end(dest, FS_OP_COPY);
+               dest->fs->stats.copy_count++;
                dest->metadata_changed = FALSE;
        }
        return ret;
@@ -891,13 +893,14 @@ int fs_rename(struct fs_file *src, struct fs_file *dest)
 
        i_assert(src->fs == dest->fs);
 
-       dest->fs->stats.rename_count++;
        fs_file_timing_start(dest, FS_OP_RENAME);
        T_BEGIN {
                ret = src->fs->v.rename(src, dest);
        } T_END;
-       if (!(ret < 0 && errno == EAGAIN))
+       if (!(ret < 0 && errno == EAGAIN)) {
+               dest->fs->stats.rename_count++;
                fs_file_timing_end(dest, FS_OP_RENAME);
+       }
        return ret;
 }
 
@@ -905,13 +908,14 @@ int fs_delete(struct fs_file *file)
 {
        int ret;
 
-       file->fs->stats.delete_count++;
        fs_file_timing_start(file, FS_OP_DELETE);
        T_BEGIN {
                ret = file->fs->v.delete_file(file);
        } T_END;
-       if (!(ret < 0 && errno == EAGAIN))
+       if (!(ret < 0 && errno == EAGAIN)) {
+               file->fs->stats.delete_count++;
                fs_file_timing_end(file, FS_OP_DELETE);
+       }
        return ret;
 }