From: Timo Sirainen Date: Sun, 13 Sep 2009 22:37:05 +0000 (-0400) Subject: maildir quota: Limits weren't read early enough from maildirsize file. X-Git-Tag: 2.0.alpha1~119 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cb931f84e3ec8e3deda253a1c0ae0409023de096;p=thirdparty%2Fdovecot%2Fcore.git maildir quota: Limits weren't read early enough from maildirsize file. --HG-- branch : HEAD --- diff --git a/src/plugins/quota/quota-dict.c b/src/plugins/quota/quota-dict.c index 6b5e695617..c6f39d1298 100644 --- a/src/plugins/quota/quota-dict.c +++ b/src/plugins/quota/quota-dict.c @@ -206,6 +206,7 @@ struct quota_backend quota_backend_dict = { dict_quota_deinit, NULL, NULL, + NULL, dict_quota_root_get_resources, dict_quota_get_resource, dict_quota_update, diff --git a/src/plugins/quota/quota-dirsize.c b/src/plugins/quota/quota-dirsize.c index 687504a36a..39d979c433 100644 --- a/src/plugins/quota/quota-dirsize.c +++ b/src/plugins/quota/quota-dirsize.c @@ -215,6 +215,7 @@ struct quota_backend quota_backend_dirsize = { dirsize_quota_deinit, NULL, NULL, + NULL, dirsize_quota_root_get_resources, dirsize_quota_get_resource, dirsize_quota_update, diff --git a/src/plugins/quota/quota-fs.c b/src/plugins/quota/quota-fs.c index c42dad9429..613373d84b 100644 --- a/src/plugins/quota/quota-fs.c +++ b/src/plugins/quota/quota-fs.c @@ -795,6 +795,7 @@ struct quota_backend quota_backend_fs = { fs_quota_init, fs_quota_deinit, NULL, + NULL, fs_quota_namespace_added, diff --git a/src/plugins/quota/quota-maildir.c b/src/plugins/quota/quota-maildir.c index 4b35c9cbb2..6a25b5d802 100644 --- a/src/plugins/quota/quota-maildir.c +++ b/src/plugins/quota/quota-maildir.c @@ -629,18 +629,27 @@ static bool maildirquota_limits_init(struct maildir_quota_root *root) return root->maildirsize_path != NULL; } -static int -maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r) +static int maildirquota_read_limits(struct maildir_quota_root *root) { int ret; - *recalculated_r = FALSE; if (!maildirquota_limits_init(root)) - return 0; + return 1; T_BEGIN { ret = maildirsize_read(root); } T_END; + return ret; +} + +static int +maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r) +{ + int ret; + + *recalculated_r = FALSE; + + ret = maildirquota_read_limits(root); if (ret == 0) { if (root->root.bytes_limit == 0 && root->root.count_limit == 0 && @@ -743,6 +752,13 @@ maildir_quota_parse_rule(struct quota_root_settings *root_set ATTR_UNUSED, return TRUE; } +static int maildir_quota_init_limits(struct quota_root *_root) +{ + struct maildir_quota_root *root = (struct maildir_quota_root *)_root; + + return maildirquota_read_limits(root) < 0 ? -1 : 0; +} + static void maildir_quota_root_namespace_added(struct quota_root *_root, struct mail_namespace *ns) @@ -848,6 +864,7 @@ struct quota_backend quota_backend_maildir = { maildir_quota_init, maildir_quota_deinit, maildir_quota_parse_rule, + maildir_quota_init_limits, maildir_quota_namespace_added, maildir_quota_root_get_resources, maildir_quota_get_resource, diff --git a/src/plugins/quota/quota-private.h b/src/plugins/quota/quota-private.h index 4899bd3d54..f545f92c5e 100644 --- a/src/plugins/quota/quota-private.h +++ b/src/plugins/quota/quota-private.h @@ -53,6 +53,7 @@ struct quota_backend_vfuncs { bool (*parse_rule)(struct quota_root_settings *root_set, struct quota_rule *rule, const char *str, const char **error_r); + int (*init_limits)(struct quota_root *root); /* called once for each namespace */ void (*namespace_added)(struct quota *quota, diff --git a/src/plugins/quota/quota.c b/src/plugins/quota/quota.c index 7dc5fe2b6f..2db8f437e9 100644 --- a/src/plugins/quota/quota.c +++ b/src/plugins/quota/quota.c @@ -497,15 +497,20 @@ int quota_root_add_rule(struct quota_root_settings *root_set, return ret; } -static bool quota_root_get_rule_limits(struct quota_root *root, - const char *mailbox_name, - uint64_t *bytes_limit_r, - uint64_t *count_limit_r) +static int quota_root_get_rule_limits(struct quota_root *root, + const char *mailbox_name, + uint64_t *bytes_limit_r, + uint64_t *count_limit_r) { struct quota_rule *rule; int64_t bytes_limit, count_limit; bool found; + if (!root->set->force_default_rule) { + if (root->backend.v.init_limits(root) < 0) + return -1; + } + bytes_limit = root->bytes_limit; count_limit = root->count_limit; @@ -527,7 +532,7 @@ static bool quota_root_get_rule_limits(struct quota_root *root, *bytes_limit_r = bytes_limit <= 0 ? 0 : bytes_limit; *count_limit_r = count_limit <= 0 ? 0 : count_limit; - return found; + return found ? 1 : 0; } void quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns) @@ -769,8 +774,10 @@ int quota_get_resource(struct quota_root *root, const char *mailbox_name, if (ret <= 0) return ret; - (void)quota_root_get_rule_limits(root, mailbox_name, - &bytes_limit, &count_limit); + if (quota_root_get_rule_limits(root, mailbox_name, + &bytes_limit, &count_limit) < 0) + return -1; + if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) *limit_r = bytes_limit; else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0) @@ -827,8 +834,12 @@ static int quota_transaction_set_limits(struct quota_transaction_context *ctx) if (!quota_root_is_visible(roots[i], ctx->box, TRUE)) continue; - (void)quota_root_get_rule_limits(roots[i], mailbox_name, - &bytes_limit, &count_limit); + if (quota_root_get_rule_limits(roots[i], mailbox_name, + &bytes_limit, + &count_limit) < 0) { + ctx->failed = TRUE; + return -1; + } if (bytes_limit > 0) { ret = quota_get_resource(roots[i], mailbox_name, @@ -998,6 +1009,7 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx, { struct quota_root *const *roots; unsigned int i, count; + int ret; *too_large_r = FALSE; @@ -1011,10 +1023,13 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx, if (!quota_root_is_visible(roots[i], ctx->box, TRUE)) continue; - if (!quota_root_get_rule_limits(roots[i], - mailbox_get_vname(ctx->box), - &bytes_limit, &count_limit)) + ret = quota_root_get_rule_limits(roots[i], + mailbox_get_vname(ctx->box), + &bytes_limit, &count_limit); + if (ret == 0) continue; + if (ret < 0) + return -1; /* if size is bigger than any limit, then it is bigger than the lowest limit */ @@ -1023,7 +1038,6 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx, break; } } - return 0; }