changeset 9933:27904121ae72 HEAD

maildir quota: Limits weren't read early enough from maildirsize file.
author Timo Sirainen <tss@iki.fi>
date Sun, 13 Sep 2009 18:37:05 -0400
parents accb1c02e03c
children 9444d7964766
files src/plugins/quota/quota-dict.c src/plugins/quota/quota-dirsize.c src/plugins/quota/quota-fs.c src/plugins/quota/quota-maildir.c src/plugins/quota/quota-private.h src/plugins/quota/quota.c
diffstat 6 files changed, 53 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 		dict_quota_deinit,
 		NULL,
 		NULL,
+		NULL,
 		dict_quota_root_get_resources,
 		dict_quota_get_resource,
 		dict_quota_update,
--- 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 @@
 		dirsize_quota_deinit,
 		NULL,
 		NULL,
+		NULL,
 		dirsize_quota_root_get_resources,
 		dirsize_quota_get_resource,
 		dirsize_quota_update,
--- 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 @@
 		fs_quota_init,
 		fs_quota_deinit,
 		NULL,
+		NULL,
 
 		fs_quota_namespace_added,
 
--- 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 @@
 	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 &&
@@ -743,6 +752,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_namespace_added(struct quota_root *_root,
 				   struct mail_namespace *ns)
@@ -848,6 +864,7 @@
 		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,
--- 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 @@
 	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,
--- 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,15 +497,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;
 
@@ -527,7 +532,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;
 }
 
 void quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns)
@@ -769,8 +774,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)
@@ -827,8 +834,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,
@@ -998,6 +1009,7 @@
 {
 	struct quota_root *const *roots;
 	unsigned int i, count;
+	int ret;
 
 	*too_large_r = FALSE;
 
@@ -1011,10 +1023,13 @@
 		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 @@
 			break;
 		}
 	}
-
 	return 0;
 }