# HG changeset patch # User Timo Sirainen # Date 1252881369 14400 # Node ID fe063e0d71096529bfcd94ac19fb42a51db53899 # Parent a493ceb26615cb34be3ba2d495b0708adab49d93 maildir quota: Limits weren't read early enough from maildirsize file. diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota-dict.c --- a/src/plugins/quota/quota-dict.c Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota-dict.c Sun Sep 13 18:36:09 2009 -0400 @@ -208,6 +208,7 @@ dict_quota_deinit, NULL, NULL, + NULL, dict_quota_root_get_resources, dict_quota_get_resource, dict_quota_update, diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota-dirsize.c --- a/src/plugins/quota/quota-dirsize.c Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota-dirsize.c Sun Sep 13 18:36:09 2009 -0400 @@ -213,6 +213,7 @@ dirsize_quota_deinit, NULL, NULL, + NULL, dirsize_quota_root_get_resources, dirsize_quota_get_resource, dirsize_quota_update, diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota-fs.c --- a/src/plugins/quota/quota-fs.c Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota-fs.c Sun Sep 13 18:36:09 2009 -0400 @@ -795,6 +795,7 @@ fs_quota_init, fs_quota_deinit, NULL, + NULL, fs_quota_storage_added, diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota-maildir.c --- a/src/plugins/quota/quota-maildir.c Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota-maildir.c Sun Sep 13 18:36:09 2009 -0400 @@ -628,18 +628,27 @@ return root->maildirsize_path != NULL; } +static int maildirquota_read_limits(struct maildir_quota_root *root) +{ + int ret; + + if (!maildirquota_limits_init(root)) + 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; - if (!maildirquota_limits_init(root)) - return 0; - T_BEGIN { - ret = maildirsize_read(root); - } T_END; + ret = maildirquota_read_limits(root); if (ret == 0) { if (root->root.bytes_limit == 0 && root->root.count_limit == 0 && @@ -742,6 +751,13 @@ 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_storage_added(struct quota_root *_root, struct mail_storage *storage) @@ -846,6 +862,7 @@ maildir_quota_init, maildir_quota_deinit, maildir_quota_parse_rule, + maildir_quota_init_limits, maildir_quota_storage_added, maildir_quota_root_get_resources, maildir_quota_get_resource, diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota-private.h --- a/src/plugins/quota/quota-private.h Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota-private.h Sun Sep 13 18:36:09 2009 -0400 @@ -52,6 +52,7 @@ 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 backend */ void (*storage_added)(struct quota *quota, diff -r a493ceb26615 -r fe063e0d7109 src/plugins/quota/quota.c --- a/src/plugins/quota/quota.c Fri Sep 11 12:26:03 2009 -0400 +++ b/src/plugins/quota/quota.c Sun Sep 13 18:36:09 2009 -0400 @@ -434,15 +434,20 @@ 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; @@ -464,7 +469,7 @@ *bytes_limit_r = bytes_limit <= 0 ? 0 : bytes_limit; *count_limit_r = count_limit <= 0 ? 0 : count_limit; - return found; + return found ? 1 : 0; } static void quota_maildir_storage_set(struct mail_storage *storage) @@ -720,8 +725,10 @@ 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) @@ -778,8 +785,12 @@ 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, @@ -949,6 +960,7 @@ { struct quota_root *const *roots; unsigned int i, count; + int ret; *too_large_r = FALSE; @@ -962,10 +974,13 @@ if (!quota_root_is_visible(roots[i], ctx->box, TRUE)) continue; - if (!quota_root_get_rule_limits(roots[i], - mailbox_get_name(ctx->box), - &bytes_limit, &count_limit)) + ret = quota_root_get_rule_limits(roots[i], + mailbox_get_name(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 */ @@ -974,7 +989,6 @@ break; } } - return 0; }