changeset 9260:1127a2fddffc HEAD

maildir++ quota: Quota was sometimes updated wrong when it was being recalculated.
author Timo Sirainen <tss@iki.fi>
date Sun, 26 Jul 2009 23:19:35 -0400
parents ea2eed32d59e
children 51aee73e49a5
files src/plugins/quota/quota-maildir.c
diffstat 1 files changed, 16 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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
@@ -628,10 +628,12 @@
 	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;
 
@@ -651,6 +653,8 @@
 		}
 
 		ret = maildirsize_recalculate(root);
+		if (ret == 0)
+			*recalculated_r = TRUE;
 	}
 	return ret < 0 ? -1 : 0;
 }
@@ -790,8 +794,9 @@
 			   uint64_t *value_r)
 {
 	struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
+	bool recalculated;
 
-	if (maildirquota_refresh(root) < 0)
+	if (maildirquota_refresh(root, &recalculated) < 0)
 		return -1;
 
 	if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0) {
@@ -807,8 +812,8 @@
 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 */
@@ -819,11 +824,15 @@
 	   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)
+	if (maildirquota_refresh(root, &recalculated) < 0)
 		return -1;
 
-	if (root->fd == -1 || ctx->recalculate ||
-	    maildirsize_update(root, ctx->count_used, ctx->bytes_used) < 0)
+	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;