Mercurial > dovecot > original-hg > dovecot-1.2
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--; +}