Mercurial > dovecot > original-hg > dovecot-1.2
changeset 9260:1127a2fddffc HEAD
maildir++ quota: Quota was sometimes updated wrong when it was being recalculated.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 26 Jul 2009 23:19:35 -0400 |
parents | ea2eed32d59e |
children | 51aee73e49a5 |
files | src/plugins/quota/quota-maildir.c |
diffstat | 1 files changed, 16 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ -628,10 +628,12 @@ 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; @@ -651,6 +653,8 @@ } ret = maildirsize_recalculate(root); + if (ret == 0) + *recalculated_r = TRUE; } return ret < 0 ? -1 : 0; } @@ -790,8 +794,9 @@ uint64_t *value_r) { struct maildir_quota_root *root = (struct maildir_quota_root *)_root; + bool recalculated; - if (maildirquota_refresh(root) < 0) + if (maildirquota_refresh(root, &recalculated) < 0) return -1; if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) { @@ -807,8 +812,8 @@ 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 */ @@ -819,11 +824,15 @@ 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) + if (maildirquota_refresh(root, &recalculated) < 0) return -1; - if (root->fd == -1 || ctx->recalculate || - maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0) + 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;