]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
maildir quota: Limits weren't read early enough from maildirsize file.
authorTimo Sirainen <tss@iki.fi>
Sun, 13 Sep 2009 22:37:05 +0000 (18:37 -0400)
committerTimo Sirainen <tss@iki.fi>
Sun, 13 Sep 2009 22:37:05 +0000 (18:37 -0400)
--HG--
branch : HEAD

src/plugins/quota/quota-dict.c
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

index 6b5e69561700ac332719dc904fec609a2c300f7b..c6f39d1298a1a933671ac9fa4eb6175ea8ad09f1 100644 (file)
@@ -206,6 +206,7 @@ struct quota_backend quota_backend_dict = {
                dict_quota_deinit,
                NULL,
                NULL,
+               NULL,
                dict_quota_root_get_resources,
                dict_quota_get_resource,
                dict_quota_update,
index 687504a36a5e44504ef16cee1894e6b13bb9229e..39d979c433d7abbb88bea6dd5f413a184e2b965d 100644 (file)
@@ -215,6 +215,7 @@ struct quota_backend quota_backend_dirsize = {
                dirsize_quota_deinit,
                NULL,
                NULL,
+               NULL,
                dirsize_quota_root_get_resources,
                dirsize_quota_get_resource,
                dirsize_quota_update,
index c42dad9429c3c1c19fb21ab666d6952a780469b6..613373d84b0f7ea645e41f110390bd0211b4b939 100644 (file)
@@ -795,6 +795,7 @@ struct quota_backend quota_backend_fs = {
                fs_quota_init,
                fs_quota_deinit,
                NULL,
+               NULL,
 
                fs_quota_namespace_added,
 
index 4b35c9cbb299a8b7cbc15da803951ac9c3be2b96..6a25b5d80212086b76ccb4841294a0777011ec10 100644 (file)
@@ -629,18 +629,27 @@ static bool maildirquota_limits_init(struct maildir_quota_root *root)
        return root->maildirsize_path != NULL;
 }
 
-static int
-maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
+static int maildirquota_read_limits(struct maildir_quota_root *root)
 {
        int ret;
 
-       *recalculated_r = FALSE;
        if (!maildirquota_limits_init(root))
-               return 0;
+               return 1;
 
        T_BEGIN {
                ret = maildirsize_read(root);
        } T_END;
+       return ret;
+}
+
+static int
+maildirquota_refresh(struct maildir_quota_root *root, bool *recalculated_r)
+{
+       int ret;
+
+       *recalculated_r = FALSE;
+
+       ret = maildirquota_read_limits(root);
        if (ret == 0) {
                if (root->root.bytes_limit == 0 &&
                    root->root.count_limit == 0 &&
@@ -743,6 +752,13 @@ maildir_quota_parse_rule(struct quota_root_settings *root_set ATTR_UNUSED,
        return TRUE;
 }
 
+static int maildir_quota_init_limits(struct quota_root *_root)
+{
+       struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
+
+       return maildirquota_read_limits(root) < 0 ? -1 : 0;
+}
+
 static void
 maildir_quota_root_namespace_added(struct quota_root *_root,
                                   struct mail_namespace *ns)
@@ -848,6 +864,7 @@ struct quota_backend quota_backend_maildir = {
                maildir_quota_init,
                maildir_quota_deinit,
                maildir_quota_parse_rule,
+               maildir_quota_init_limits,
                maildir_quota_namespace_added,
                maildir_quota_root_get_resources,
                maildir_quota_get_resource,
index 4899bd3d54b470a1a44470a0a6b21c8ae1d68f69..f545f92c5e2634b20667e42c7cc1ea5581febd58 100644 (file)
@@ -53,6 +53,7 @@ struct quota_backend_vfuncs {
        bool (*parse_rule)(struct quota_root_settings *root_set,
                           struct quota_rule *rule,
                           const char *str, const char **error_r);
+       int (*init_limits)(struct quota_root *root);
 
        /* called once for each namespace */
        void (*namespace_added)(struct quota *quota,
index 7dc5fe2b6fcd9cd2b4db122b6a88fe1b235d8631..2db8f437e992a4c42233ba99ad4dc1d820dcb8e1 100644 (file)
@@ -497,15 +497,20 @@ int quota_root_add_rule(struct quota_root_settings *root_set,
        return ret;
 }
 
-static bool quota_root_get_rule_limits(struct quota_root *root,
-                                      const char *mailbox_name,
-                                      uint64_t *bytes_limit_r,
-                                      uint64_t *count_limit_r)
+static int quota_root_get_rule_limits(struct quota_root *root,
+                                     const char *mailbox_name,
+                                     uint64_t *bytes_limit_r,
+                                     uint64_t *count_limit_r)
 {
        struct quota_rule *rule;
        int64_t bytes_limit, count_limit;
        bool found;
 
+       if (!root->set->force_default_rule) {
+               if (root->backend.v.init_limits(root) < 0)
+                       return -1;
+       }
+
        bytes_limit = root->bytes_limit;
        count_limit = root->count_limit;
 
@@ -527,7 +532,7 @@ static bool quota_root_get_rule_limits(struct quota_root *root,
 
        *bytes_limit_r = bytes_limit <= 0 ? 0 : bytes_limit;
        *count_limit_r = count_limit <= 0 ? 0 : count_limit;
-       return found;
+       return found ? 1 : 0;
 }
 
 void quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns)
@@ -769,8 +774,10 @@ int quota_get_resource(struct quota_root *root, const char *mailbox_name,
        if (ret <= 0)
                return ret;
 
-       (void)quota_root_get_rule_limits(root, mailbox_name,
-                                        &bytes_limit, &count_limit);
+       if (quota_root_get_rule_limits(root, mailbox_name,
+                                      &bytes_limit, &count_limit) < 0)
+               return -1;
+
        if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0)
                *limit_r = bytes_limit;
        else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0)
@@ -827,8 +834,12 @@ static int quota_transaction_set_limits(struct quota_transaction_context *ctx)
                if (!quota_root_is_visible(roots[i], ctx->box, TRUE))
                        continue;
 
-               (void)quota_root_get_rule_limits(roots[i], mailbox_name,
-                                                &bytes_limit, &count_limit);
+               if (quota_root_get_rule_limits(roots[i], mailbox_name,
+                                              &bytes_limit,
+                                              &count_limit) < 0) {
+                       ctx->failed = TRUE;
+                       return -1;
+               }
 
                if (bytes_limit > 0) {
                        ret = quota_get_resource(roots[i], mailbox_name,
@@ -998,6 +1009,7 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx,
 {
        struct quota_root *const *roots;
        unsigned int i, count;
+       int ret;
 
        *too_large_r = FALSE;
 
@@ -1011,10 +1023,13 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx,
                if (!quota_root_is_visible(roots[i], ctx->box, TRUE))
                        continue;
 
-               if (!quota_root_get_rule_limits(roots[i],
-                                               mailbox_get_vname(ctx->box),
-                                               &bytes_limit, &count_limit))
+               ret = quota_root_get_rule_limits(roots[i],
+                                                mailbox_get_vname(ctx->box),
+                                                &bytes_limit, &count_limit);
+               if (ret == 0)
                        continue;
+               if (ret < 0)
+                       return -1;
 
                /* if size is bigger than any limit, then
                   it is bigger than the lowest limit */
@@ -1023,7 +1038,6 @@ static int quota_default_test_alloc(struct quota_transaction_context *ctx,
                        break;
                }
        }
-
        return 0;
 }