dovecot-2.0: maildir++ quota: Quota was sometimes updated wrong ...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jul 27 06:19:55 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/3d3d090db66f
changeset: 9673:3d3d090db66f
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jul 26 23:19:35 2009 -0400
description:
maildir++ quota: Quota was sometimes updated wrong when it was being recalculated.

diffstat:

1 file changed, 19 insertions(+), 10 deletions(-)
src/plugins/quota/quota-maildir.c |   29 +++++++++++++++++++----------

diffs (70 lines):

diff -r 436d2bead41b -r 3d3d090db66f src/plugins/quota/quota-maildir.c
--- a/src/plugins/quota/quota-maildir.c	Sun Jul 26 22:40:02 2009 -0400
+++ b/src/plugins/quota/quota-maildir.c	Sun Jul 26 23:19:35 2009 -0400
@@ -629,10 +629,12 @@ static bool maildirquota_limits_init(str
 	return root->maildirsize_path != NULL;
 }
 
-static int maildirquota_refresh(struct maildir_quota_root *root)
+static int
+maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
 {
 	int ret;
 
+	*recalculated_r = FALSE;
 	if (!maildirquota_limits_init(root))
 		return 0;
 
@@ -652,6 +654,8 @@ static int maildirquota_refresh(struct m
 		}
 
 		ret = maildirsize_recalculate(root);
+		if (ret == 0)
+			*recalculated_r = TRUE;
 	}
 	return ret < 0 ? -1 : 0;
 }
@@ -792,8 +796,9 @@ maildir_quota_get_resource(struct quota_
 			   uint64_t *value_r)
 {
 	struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
-
-	if (maildirquota_refresh(root) < 0)
+	bool recalculated;
+
+	if (maildirquota_refresh(root, &recalculated) < 0)
 		return -1;
 
 	if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) {
@@ -809,8 +814,8 @@ maildir_quota_update(struct quota_root *
 maildir_quota_update(struct quota_root *_root,
 		     struct quota_transaction_context *ctx)
 {
-	struct maildir_quota_root *root =
-		(struct maildir_quota_root *) _root;
+	struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
+	bool recalculated;
 
 	if (!maildirquota_limits_init(root)) {
 		/* no limits */
@@ -821,11 +826,15 @@ maildir_quota_update(struct quota_root *
 	   we do want to make sure the header gets updated if the limits have
 	   changed. also this makes sure the maildirsize file is created if
 	   it doesn't exist. */
-	if (maildirquota_refresh(root) < 0)
-		return -1;
-
-	if (root->fd == -1 || ctx->recalculate ||
-	    maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0)
+	if (maildirquota_refresh(root, &recalculated) < 0)
+		return -1;
+
+	if (recalculated) {
+		/* quota was just recalculated and it already contains the changes
+		   we wanted to do. */
+	} else if (root->fd == -1 || ctx->recalculate)
+		maildirsize_rebuild_later(root);
+	else if (maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0)
 		maildirsize_rebuild_later(root);
 
 	return 0;


More information about the dovecot-cvs mailing list