unsigned int recounting:1;
/* Quota root is hidden (to e.g. IMAP GETQUOTAROOT) */
unsigned int hidden:1;
+ /* Is quota_over_flag* initialized yet? */
+ unsigned int quota_over_flag_initialized:1;
/* Is user currently over quota? */
unsigned int quota_over_flag_status:1;
+ /* Did we already check quota_over_flag correctness? */
+ unsigned int quota_over_flag_checked:1;
};
struct quota_transaction_context {
const char *const *quota_root_get_resources(struct quota_root *root)
{
+ /* if we haven't checked the quota_over_flag yet, do it now */
+ quota_over_flag_check_root(root);
+
return root->backend.v.get_resources(root);
}
{
const char *name, *flag_mask;
+ if (root->quota_over_flag_initialized)
+ return;
+ root->quota_over_flag_initialized = TRUE;
+
/* e.g.: quota_over_flag_value=TRUE or quota_over_flag_value=* */
name = t_strconcat(root->set->set_name, "_over_flag_value", NULL);
flag_mask = mail_user_plugin_getenv(root->quota->user, name);
bool cur_overquota = FALSE;
int ret;
+ if (root->quota_over_flag_checked)
+ return;
+ root->quota_over_flag_checked = TRUE;
quota_over_flag_init_root(root);
resources = quota_root_get_resources(root);
}
}
-void quota_over_flag_check(struct quota *quota)
+void quota_over_flag_check_startup(struct quota *quota)
{
struct quota_root *const *roots;
unsigned int i, count;
+ const char *name;
roots = array_get("a->roots, &count);
- for (i = 0; i < count; i++)
- quota_over_flag_check_root(roots[i]);
+ for (i = 0; i < count; i++) {
+ name = t_strconcat(roots[i]->set->set_name, "_over_flag_lazy_check", NULL);
+ if (mail_user_plugin_getenv(roots[i]->quota->user, name) == NULL)
+ quota_over_flag_check_root(roots[i]);
+ }
}
void quota_transaction_rollback(struct quota_transaction_context **_ctx)