changeset 4087:61fc347bcceb HEAD

Cleanups.
author Timo Sirainen <timo.sirainen@movial.fi>
date Mon, 06 Mar 2006 17:48:33 +0200
parents 07c3a801c3dc
children 43a03c8a6f01
files 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 5 files changed, 114 insertions(+), 176 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/quota/quota-dirsize.c	Mon Mar 06 12:31:11 2006 +0200
+++ b/src/plugins/quota/quota-dirsize.c	Mon Mar 06 17:48:33 2006 +0200
@@ -206,6 +206,7 @@
 	}
 
 	ctx->bytes_limit = root->storage_limit * 1024;
+	ctx->count_limit = (uint64_t)-1;
 	return ctx;
 }
 
@@ -218,66 +219,6 @@
 	return ret;
 }
 
-static void
-dirsize_quota_transaction_rollback(struct quota_root_transaction_context *ctx)
-{
-	i_free(ctx);
-}
-
-static int
-dirsize_quota_try_alloc_bytes(struct quota_root_transaction_context *ctx,
-			      uoff_t size, bool *too_large_r)
-{
-	if (ctx->bytes_current == (uint64_t)-1)
-		return -1;
-
-	*too_large_r = size > ctx->bytes_limit;
-
-	if (ctx->bytes_current + ctx->bytes_diff + size > ctx->bytes_limit)
-		return 0;
-
-	ctx->bytes_diff += size;
-	return 1;
-}
-
-static int
-dirsize_quota_try_alloc(struct quota_root_transaction_context *ctx,
-			struct mail *mail, bool *too_large_r)
-{
-	uoff_t size;
-
-	if (ctx->bytes_current == (uint64_t)-1)
-		return -1;
-
-	size = mail_get_physical_size(mail);
-	if (size == (uoff_t)-1)
-		return -1;
-
-	return dirsize_quota_try_alloc_bytes(ctx, size, too_large_r);
-}
-
-static void
-dirsize_quota_alloc(struct quota_root_transaction_context *ctx,
-		    struct mail *mail)
-{
-	uoff_t size;
-
-	size = mail_get_physical_size(mail);
-	if (size != (uoff_t)-1)
-		ctx->bytes_diff += size;
-}
-
-static void
-dirsize_quota_free(struct quota_root_transaction_context *ctx,
-		   struct mail *mail)
-{
-	uoff_t size;
-
-	size = mail_get_physical_size(mail);
-	if (size != (uoff_t)-1)
-		ctx->bytes_diff -= size;
-}
-
 struct quota_backend quota_backend_dirsize = {
 	"dirsize",
 
@@ -295,11 +236,11 @@
 
 		dirsize_quota_transaction_begin,
 		dirsize_quota_transaction_commit,
-		dirsize_quota_transaction_rollback,
+		quota_default_transaction_rollback,
 
-		dirsize_quota_try_alloc,
-		dirsize_quota_try_alloc_bytes,
-		dirsize_quota_alloc,
-		dirsize_quota_free
+		quota_default_try_alloc,
+		quota_default_try_alloc_bytes,
+		quota_default_alloc,
+		quota_default_free
 	}
 };
--- a/src/plugins/quota/quota-fs.c	Mon Mar 06 12:31:11 2006 +0200
+++ b/src/plugins/quota/quota-fs.c	Mon Mar 06 17:48:33 2006 +0200
@@ -307,6 +307,7 @@
 	root_ctx = i_new(struct quota_root_transaction_context, 1);
 	root_ctx->root = root;
 	root_ctx->ctx = ctx;
+	root_ctx->disabled = TRUE;
 	return root_ctx;
 }
 
@@ -317,45 +318,6 @@
 	return 0;
 }
 
-static void
-fs_quota_transaction_rollback(struct quota_root_transaction_context *ctx)
-{
-	i_free(ctx);
-}
-
-static int
-fs_quota_try_alloc(struct quota_root_transaction_context *ctx __attr_unused__,
-		   struct mail *mail __attr_unused__,
-		   bool *too_large_r __attr_unused__)
-{
-	/* no-op */
-	return 1;
-}
-
-static int
-fs_quota_try_alloc_bytes(struct quota_root_transaction_context *ctx
-			 	__attr_unused__,
-			 uoff_t size __attr_unused__,
-			 bool *too_large_r __attr_unused__)
-{
-	/* no-op */
-	return 1;
-}
-
-static void
-fs_quota_alloc(struct quota_root_transaction_context *ctx __attr_unused__,
-	       struct mail *mail __attr_unused__)
-{
-	/* no-op */
-}
-
-static void
-fs_quota_free(struct quota_root_transaction_context *ctx __attr_unused__,
-	      struct mail *mail __attr_unused__)
-{
-	/* no-op */
-}
-
 struct quota_backend quota_backend_fs = {
 	"fs",
 
@@ -373,12 +335,12 @@
 
 		fs_quota_transaction_begin,
 		fs_quota_transaction_commit,
-		fs_quota_transaction_rollback,
+		quota_default_transaction_rollback,
 
-		fs_quota_try_alloc,
-		fs_quota_try_alloc_bytes,
-		fs_quota_alloc,
-		fs_quota_free
+		quota_default_try_alloc,
+		quota_default_try_alloc_bytes,
+		quota_default_alloc,
+		quota_default_free
 	}
 };
 
--- a/src/plugins/quota/quota-maildir.c	Mon Mar 06 12:31:11 2006 +0200
+++ b/src/plugins/quota/quota-maildir.c	Mon Mar 06 17:48:33 2006 +0200
@@ -582,7 +582,10 @@
 	ctx->ctx = _ctx;
 
 	if (maildirquota_refresh(root,
-				 maildir_quota_root_get_storage(_root)) == 0) {
+				 maildir_quota_root_get_storage(_root)) < 0) {
+		/* failed calculating the current quota */
+		ctx->bytes_current = (uint64_t)-1;
+	} else {
 		ctx->bytes_limit = root->message_bytes_limit;
 		ctx->count_limit = root->message_count_limit;
 		ctx->bytes_current = root->total_bytes;
@@ -596,74 +599,16 @@
 {
 	struct maildir_quota_root *root =
 		(struct maildir_quota_root *)ctx->root;
+	int ret = ctx->bytes_current == (uint64_t)-1 ? -1 : 0;
 
-	if (root->fd != -1) {
+	if (root->fd != -1 && ret == 0) {
 		/* if writing fails, we don't care all that much */
 		(void)maildirsize_update(root,
 				maildir_quota_root_get_storage(ctx->root),
 				ctx->count_diff, ctx->bytes_diff);
 	}
 	i_free(ctx);
-	return 0;
-}
-
-static void
-maildir_quota_transaction_rollback(struct quota_root_transaction_context *ctx)
-{
-	i_free(ctx);
-}
-
-static int
-maildir_quota_try_alloc_bytes(struct quota_root_transaction_context *ctx,
-			      uoff_t size, bool *too_large_r)
-{
-	*too_large_r = size > ctx->bytes_limit;
-
-	if (ctx->bytes_current + ctx->bytes_diff + size > ctx->bytes_limit)
-		return 0;
-	if (ctx->count_current + ctx->count_diff + 1 > ctx->count_limit)
-		return 0;
-
-	ctx->count_diff++;
-	ctx->bytes_diff += size;
-	return 1;
-}
-
-static int
-maildir_quota_try_alloc(struct quota_root_transaction_context *ctx,
-			struct mail *mail, bool *too_large_r)
-{
-	uoff_t size;
-
-	size = mail_get_physical_size(mail);
-	if (size == (uoff_t)-1)
-		return -1;
-
-	return maildir_quota_try_alloc_bytes(ctx, size, too_large_r);
-}
-
-static void
-maildir_quota_alloc(struct quota_root_transaction_context *ctx,
-		    struct mail *mail)
-{
-	uoff_t size;
-
-	size = mail_get_physical_size(mail);
-	if (size != (uoff_t)-1)
-		ctx->bytes_diff += size;
-	ctx->count_diff++;
-}
-
-static void
-maildir_quota_free(struct quota_root_transaction_context *ctx,
-		   struct mail *mail)
-{
-	uoff_t size;
-
-	size = mail_get_physical_size(mail);
-	if (size != (uoff_t)-1)
-		ctx->bytes_diff -= size;
-	ctx->count_diff--;
+	return ret;
 }
 
 struct quota_backend quota_backend_maildir = {
@@ -683,11 +628,11 @@
 
 		maildir_quota_transaction_begin,
 		maildir_quota_transaction_commit,
-		maildir_quota_transaction_rollback,
+		quota_default_transaction_rollback,
 
-		maildir_quota_try_alloc,
-		maildir_quota_try_alloc_bytes,
-		maildir_quota_alloc,
-		maildir_quota_free
+		quota_default_try_alloc,
+		quota_default_try_alloc_bytes,
+		quota_default_alloc,
+		quota_default_free
 	}
 };
--- a/src/plugins/quota/quota-private.h	Mon Mar 06 12:31:11 2006 +0200
+++ b/src/plugins/quota/quota-private.h	Mon Mar 06 17:48:33 2006 +0200
@@ -99,6 +99,8 @@
 
 	uint64_t bytes_limit, count_limit;
 	uint64_t bytes_current, count_current;
+
+	unsigned int disabled:1;
 };
 
 /* Register storage to all user's quota roots. */
@@ -113,4 +115,16 @@
 
 void quota_set_error(struct quota *quota, const char *errormsg);
 
+/* default simple implementations for bytes/count updating */
+void
+quota_default_transaction_rollback(struct quota_root_transaction_context *ctx);
+int quota_default_try_alloc_bytes(struct quota_root_transaction_context *ctx,
+				  uoff_t size, bool *too_large_r);
+int quota_default_try_alloc(struct quota_root_transaction_context *ctx,
+			    struct mail *mail, bool *too_large_r);
+void quota_default_alloc(struct quota_root_transaction_context *ctx,
+			 struct mail *mail);
+void quota_default_free(struct quota_root_transaction_context *ctx,
+			struct mail *mail);
+
 #endif
--- a/src/plugins/quota/quota.c	Mon Mar 06 12:31:11 2006 +0200
+++ b/src/plugins/quota/quota.c	Mon Mar 06 17:48:33 2006 +0200
@@ -362,3 +362,79 @@
 	i_free(quota->last_error);
 	quota->last_error = i_strdup(errormsg);
 }
+
+void
+quota_default_transaction_rollback(struct quota_root_transaction_context *ctx)
+{
+	i_free(ctx);
+}
+
+int quota_default_try_alloc_bytes(struct quota_root_transaction_context *ctx,
+				  uoff_t size, bool *too_large_r)
+{
+	if (ctx->disabled) {
+		*too_large_r = FALSE;
+		return 1;
+	}
+	if (ctx->bytes_current == (uint64_t)-1) {
+		/* failure in transaction initialization */
+		return -1;
+	}
+
+	*too_large_r = size > ctx->bytes_limit;
+
+	if (ctx->bytes_current + ctx->bytes_diff + size > ctx->bytes_limit)
+		return 0;
+	if (ctx->count_current + ctx->count_diff + 1 > ctx->count_limit)
+		return 0;
+
+	ctx->count_diff++;
+	ctx->bytes_diff += size;
+	return 1;
+}
+
+int quota_default_try_alloc(struct quota_root_transaction_context *ctx,
+			    struct mail *mail, bool *too_large_r)
+{
+	uoff_t size;
+
+	if (ctx->disabled)
+		return 1;
+
+	size = mail_get_physical_size(mail);
+	if (size == (uoff_t)-1) {
+		mail_storage_set_critical(mail->box->storage,
+			"Quota: Couldn't get new message's size");
+		return -1;
+	}
+
+	return quota_default_try_alloc_bytes(ctx, size, too_large_r);
+}
+
+void quota_default_alloc(struct quota_root_transaction_context *ctx,
+			 struct mail *mail)
+{
+	uoff_t size;
+
+	if (ctx->disabled)
+		return;
+
+	size = mail_get_physical_size(mail);
+	if (size != (uoff_t)-1)
+		ctx->bytes_diff += size;
+	ctx->count_diff++;
+}
+
+void quota_default_free(struct quota_root_transaction_context *ctx,
+			struct mail *mail)
+{
+	uoff_t size;
+
+	if (ctx->disabled)
+		return;
+
+	size = mail_get_physical_size(mail);
+	if (size != (uoff_t)-1)
+		ctx->bytes_diff -= size;
+	ctx->count_diff--;
+}