dovecot-2.0: maildir++ quota: Quota was sometimes updated wrong ...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jul 27 06:19:55 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/3d3d090db66f
changeset: 9673:3d3d090db66f
user: Timo Sirainen <tss at iki.fi>
date: Sun Jul 26 23:19:35 2009 -0400
description:
maildir++ quota: Quota was sometimes updated wrong when it was being recalculated.
diffstat:
1 file changed, 19 insertions(+), 10 deletions(-)
src/plugins/quota/quota-maildir.c | 29 +++++++++++++++++++----------
diffs (70 lines):
diff -r 436d2bead41b -r 3d3d090db66f src/plugins/quota/quota-maildir.c
--- a/src/plugins/quota/quota-maildir.c Sun Jul 26 22:40:02 2009 -0400
+++ b/src/plugins/quota/quota-maildir.c Sun Jul 26 23:19:35 2009 -0400
@@ -629,10 +629,12 @@ static bool maildirquota_limits_init(str
return root->maildirsize_path != NULL;
}
-static int maildirquota_refresh(struct maildir_quota_root *root)
+static int
+maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
{
int ret;
+ *recalculated_r = FALSE;
if (!maildirquota_limits_init(root))
return 0;
@@ -652,6 +654,8 @@ static int maildirquota_refresh(struct m
}
ret = maildirsize_recalculate(root);
+ if (ret == 0)
+ *recalculated_r = TRUE;
}
return ret < 0 ? -1 : 0;
}
@@ -792,8 +796,9 @@ maildir_quota_get_resource(struct quota_
uint64_t *value_r)
{
struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
-
- if (maildirquota_refresh(root) < 0)
+ bool recalculated;
+
+ if (maildirquota_refresh(root, &recalculated) < 0)
return -1;
if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) {
@@ -809,8 +814,8 @@ maildir_quota_update(struct quota_root *
maildir_quota_update(struct quota_root *_root,
struct quota_transaction_context *ctx)
{
- struct maildir_quota_root *root =
- (struct maildir_quota_root *) _root;
+ struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
+ bool recalculated;
if (!maildirquota_limits_init(root)) {
/* no limits */
@@ -821,11 +826,15 @@ maildir_quota_update(struct quota_root *
we do want to make sure the header gets updated if the limits have
changed. also this makes sure the maildirsize file is created if
it doesn't exist. */
- if (maildirquota_refresh(root) < 0)
- return -1;
-
- if (root->fd == -1 || ctx->recalculate ||
- maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0)
+ if (maildirquota_refresh(root, &recalculated) < 0)
+ return -1;
+
+ if (recalculated) {
+ /* quota was just recalculated and it already contains the changes
+ we wanted to do. */
+ } else if (root->fd == -1 || ctx->recalculate)
+ maildirsize_rebuild_later(root);
+ else if (maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0)
maildirsize_rebuild_later(root);
return 0;
More information about the dovecot-cvs
mailing list