# HG changeset patch # User Timo Sirainen # Date 1248664775 14400 # Node ID 1127a2fddffc69df60eb9e6285b51b66f3051c8c # Parent ea2eed32d59e3aa6b47522756313e8c6e8bc6f44 maildir++ quota: Quota was sometimes updated wrong when it was being recalculated. diff -r ea2eed32d59e -r 1127a2fddffc 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 @@ -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;