changeset 9380:fe063e0d7109 HEAD

maildir quota: Limits weren't read early enough from maildirsize file.
author Timo Sirainen <tss@iki.fi>
date Sun, 13 Sep 2009 18:36:09 -0400
parents a493ceb26615
children 28241a6e1178
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 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,
--- 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,
--- 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,
 
--- 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,
--- 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,
--- 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;
 }