dovecot-2.0: maildir quota: Limits weren't read early enough fro...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Sep 14 01:37:10 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/27904121ae72
changeset: 9933:27904121ae72
user: Timo Sirainen <tss at iki.fi>
date: Sun Sep 13 18:37:05 2009 -0400
description:
maildir quota: Limits weren't read early enough from maildirsize file.
diffstat:
6 files changed, 52 insertions(+), 17 deletions(-)
src/plugins/quota/quota-dict.c | 1
src/plugins/quota/quota-dirsize.c | 1
src/plugins/quota/quota-fs.c | 1
src/plugins/quota/quota-maildir.c | 25 +++++++++++++++++++----
src/plugins/quota/quota-private.h | 1
src/plugins/quota/quota.c | 40 ++++++++++++++++++++++++-------------
diffs (198 lines):
diff -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota-dict.c
--- a/src/plugins/quota/quota-dict.c Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota-dict.c Sun Sep 13 18:37:05 2009 -0400
@@ -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 -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota-dirsize.c
--- a/src/plugins/quota/quota-dirsize.c Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota-dirsize.c Sun Sep 13 18:37:05 2009 -0400
@@ -215,6 +215,7 @@ struct quota_backend quota_backend_dirsi
dirsize_quota_deinit,
NULL,
NULL,
+ NULL,
dirsize_quota_root_get_resources,
dirsize_quota_get_resource,
dirsize_quota_update,
diff -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota-fs.c
--- a/src/plugins/quota/quota-fs.c Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota-fs.c Sun Sep 13 18:37:05 2009 -0400
@@ -795,6 +795,7 @@ struct quota_backend quota_backend_fs =
fs_quota_init,
fs_quota_deinit,
NULL,
+ NULL,
fs_quota_namespace_added,
diff -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota-maildir.c
--- a/src/plugins/quota/quota-maildir.c Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota-maildir.c Sun Sep 13 18:37:05 2009 -0400
@@ -629,18 +629,27 @@ static bool maildirquota_limits_init(str
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_ro
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_maild
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 -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota-private.h
--- a/src/plugins/quota/quota-private.h Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota-private.h Sun Sep 13 18:37:05 2009 -0400
@@ -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 -r accb1c02e03c -r 27904121ae72 src/plugins/quota/quota.c
--- a/src/plugins/quota/quota.c Fri Sep 11 15:30:45 2009 -0400
+++ b/src/plugins/quota/quota.c Sun Sep 13 18:37:05 2009 -0400
@@ -497,14 +497,19 @@ int quota_root_add_rule(struct quota_roo
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(s
*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
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(
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(stru
{
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(stru
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(stru
break;
}
}
-
return 0;
}
More information about the dovecot-cvs
mailing list