trans.recalculate = QUOTA_RECALCULATE_FORCED;
array_foreach(&quser->quota->roots, root) {
- (void)(*root)->backend.v.update(*root, &trans);
+ const char *error;
+ if ((*root)->backend.v.update(*root, &trans, &error) < 0)
+ i_error("Recalculating quota failed: %s", error);
if ((*root)->backend.v.flush != NULL)
(*root)->backend.v.flush(*root);
}
static int
count_quota_update(struct quota_root *root,
- struct quota_transaction_context *ctx)
+ struct quota_transaction_context *ctx,
+ const char **error_r)
{
struct count_quota_root *croot = (struct count_quota_root *)root;
croot->cache_timeval.tv_sec = 0;
if (ctx->recalculate == QUOTA_RECALCULATE_FORCED) {
- if (quota_count_recalculate(root) < 0)
+ if (quota_count_recalculate(root) < 0) {
+ *error_r = "Calculating quota failed";
return -1;
+ }
}
return 0;
}
static int
dict_quota_update(struct quota_root *_root,
- struct quota_transaction_context *ctx)
+ struct quota_transaction_context *ctx,
+ const char **error_r)
{
struct dict_quota_root *root = (struct dict_quota_root *) _root;
struct dict_transaction_context *dt;
uint64_t value;
if (ctx->recalculate != QUOTA_RECALCULATE_DONT) {
- if (dict_quota_count(root, TRUE, &value) < 0)
+ if (dict_quota_count(root, TRUE, &value) < 0) {
+ *error_r = "Dict quota count failed";
return -1;
+ }
} else {
dt = dict_transaction_begin(root->dict);
if (ctx->bytes_used != 0) {
static int
dirsize_quota_update(struct quota_root *root ATTR_UNUSED,
- struct quota_transaction_context *ctx ATTR_UNUSED)
+ struct quota_transaction_context *ctx ATTR_UNUSED,
+ const char **error_r ATTR_UNUSED)
{
return 0;
}
static int
fs_quota_update(struct quota_root *root ATTR_UNUSED,
- struct quota_transaction_context *ctx ATTR_UNUSED)
+ struct quota_transaction_context *ctx ATTR_UNUSED,
+ const char **error_r ATTR_UNUSED)
{
return 0;
}
static int
imapc_quota_update(struct quota_root *root ATTR_UNUSED,
- struct quota_transaction_context *ctx ATTR_UNUSED)
+ struct quota_transaction_context *ctx ATTR_UNUSED,
+ const char **error_r ATTR_UNUSED)
{
return 0;
}
static int
maildir_quota_update(struct quota_root *_root,
- struct quota_transaction_context *ctx)
+ struct quota_transaction_context *ctx,
+ const char **error_r)
{
struct maildir_quota_root *root = (struct maildir_quota_root *)_root;
bool recalculated;
we do want to make sure the header gets updated if the limits have
changed. also this makes sure the maildirsize file is created if
it doesn't exist. */
- if (maildirquota_refresh(root, &recalculated) < 0)
+ if (maildirquota_refresh(root, &recalculated) < 0) {
+ *error_r = "Failed to refresh maildir quota";
return -1;
+ }
if (recalculated) {
/* quota was just recalculated and it already contains the changes
const char **error_r);
int (*update)(struct quota_root *root,
- struct quota_transaction_context *ctx);
+ struct quota_transaction_context *ctx,
+ const char **error_r);
bool (*match_box)(struct quota_root *root, struct mailbox *box);
void (*flush)(struct quota_root *root);
};
continue;
}
- if (roots[i]->backend.v.update(roots[i], ctx) < 0)
+ const char *error;
+ if (roots[i]->backend.v.update(roots[i], ctx, &error) < 0) {
+ i_error("Failed to update quota for %s: %s",
+ mailbox_name, error);
ret = -1;
+ }
else if (!ctx->sync_transaction)
array_append(&warn_roots, &roots[i], 1);
}