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