[dovecot-cvs] dovecot/src/plugins/quota quota-dirsize.c, 1.7, 1.8 quota-fs.c, 1.9, 1.10 quota-maildir.c, 1.1, 1.2 quota-private.h, 1.6, 1.7 quota.c, 1.7, 1.8

tss-movial at dovecot.org tss-movial at dovecot.org
Mon Mar 6 17:48:36 EET 2006


Update of /var/lib/cvs/dovecot/src/plugins/quota
In directory talvi:/tmp/cvs-serv24127

Modified Files:
	quota-dirsize.c quota-fs.c quota-maildir.c quota-private.h 
	quota.c 
Log Message:
Cleanups.



Index: quota-dirsize.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/plugins/quota/quota-dirsize.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- quota-dirsize.c	6 Mar 2006 10:31:11 -0000	1.7
+++ quota-dirsize.c	6 Mar 2006 15:48:33 -0000	1.8
@@ -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
 	}
 };

Index: quota-fs.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/plugins/quota/quota-fs.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- quota-fs.c	1 Mar 2006 09:15:03 -0000	1.9
+++ quota-fs.c	6 Mar 2006 15:48:33 -0000	1.10
@@ -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
 	}
 };
 

Index: quota-maildir.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/plugins/quota/quota-maildir.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- quota-maildir.c	6 Mar 2006 10:31:11 -0000	1.1
+++ quota-maildir.c	6 Mar 2006 15:48:33 -0000	1.2
@@ -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
 	}
 };

Index: quota-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/plugins/quota/quota-private.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- quota-private.h	6 Mar 2006 10:31:11 -0000	1.6
+++ quota-private.h	6 Mar 2006 15:48:33 -0000	1.7
@@ -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

Index: quota.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/plugins/quota/quota.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- quota.c	6 Mar 2006 10:31:11 -0000	1.7
+++ quota.c	6 Mar 2006 15:48:33 -0000	1.8
@@ -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--;
+}



More information about the dovecot-cvs mailing list