From 08726dfb2c87d950334b23fcba8baed42030cf2c Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Tue, 24 Jul 2018 14:47:47 +0300 Subject: [PATCH] quota: Mark noenforcing quotas with unlimited quota This allows quota to be properly updated for unenforced quotas so they can be used for tracking only. This fixes issue where using noenforcing would not update quota during mail save, but requires a manual quota update. --- src/plugins/quota/quota.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/plugins/quota/quota.c b/src/plugins/quota/quota.c index 34030ece95..6058982841 100644 --- a/src/plugins/quota/quota.c +++ b/src/plugins/quota/quota.c @@ -935,12 +935,15 @@ int quota_transaction_set_limits(struct quota_transaction_context *ctx, roots = array_get(&ctx->quota->roots, &count); for (i = 0; i < count; i++) { if (!quota_root_is_visible(roots[i], ctx->box) || - roots[i]->no_enforcing) + (roots[i]->no_enforcing && ctx->auto_updating)) continue; - - if (quota_root_get_rule_limits(roots[i], mailbox_name, - &bytes_limit, &count_limit, - &ignored, &error) < 0) { + else if (roots[i]->no_enforcing) { + bytes_limit = (uint64_t)-1; + count_limit = (uint64_t)-1; + ignored = FALSE; + } else if (quota_root_get_rule_limits(roots[i], mailbox_name, + &bytes_limit, &count_limit, + &ignored, &error) < 0) { ctx->failed = TRUE; *error_result_r = QUOTA_GET_RESULT_INTERNAL_ERROR; *error_r = t_strdup_printf( @@ -955,7 +958,10 @@ int quota_transaction_set_limits(struct quota_transaction_context *ctx, ret = quota_get_resource(roots[i], mailbox_name, QUOTA_NAME_STORAGE_BYTES, ¤t, &limit, &error); - if (ret == QUOTA_GET_RESULT_LIMITED) { + if (roots[i]->no_enforcing) { + ctx->bytes_ceil = (uint64_t)-1; + ctx->bytes_ceil2 = (uint64_t)-1; + } else if (ret == QUOTA_GET_RESULT_LIMITED) { if (limit <= current) { /* over quota */ ctx->bytes_ceil = 0; @@ -987,7 +993,9 @@ int quota_transaction_set_limits(struct quota_transaction_context *ctx, ret = quota_get_resource(roots[i], mailbox_name, QUOTA_NAME_MESSAGES, ¤t, &limit, &error); - if (ret == QUOTA_GET_RESULT_LIMITED) { + if (roots[i]->no_enforcing) { + ctx->count_ceil = (uint64_t)-1; + } else if (ret == QUOTA_GET_RESULT_LIMITED) { if (limit <= current) { /* over quota */ ctx->count_ceil = 0;