void acl_backend_vfile_acllist_refresh(struct acl_backend_vfile *backend)
{
+ i_assert(!backend->iterating_acllist);
+
if (backend->acllist_last_check +
(time_t)backend->cache_secs > ioloop_time)
return;
gid_t gid;
int fd, ret;
+ i_assert(!backend->rebuilding_acllist);
+
rootdir = mailbox_list_get_path(list, NULL,
MAILBOX_LIST_PATH_TYPE_DIR);
if (rootdir == NULL)
if (mailbox_list_iter_deinit(&iter) < 0)
ret = -1;
o_stream_destroy(&output);
- backend->rebuilding_acllist = FALSE;
if (ret == 0) {
if (fstat(fd, &st) < 0) {
if (unlink(str_c(path)) < 0 && errno != ENOENT)
i_error("unlink(%s) failed: %m", str_c(path));
}
+ backend->rebuilding_acllist = FALSE;
return ret;
}
{
const struct acl_backend_vfile_acllist *acllist;
+ if (backend->rebuilding_acllist || backend->iterating_acllist)
+ return;
+
acl_backend_vfile_acllist_refresh(backend);
acllist = acl_backend_vfile_acllist_find(backend, name);
- if (acllist != NULL && acllist->mtime != mtime &&
- !backend->rebuilding_acllist)
+ if (acllist != NULL && acllist->mtime != mtime)
(void)acl_backend_vfile_acllist_rebuild(backend);
}
ctx = i_new(struct acl_mailbox_list_context_vfile, 1);
ctx->ctx.backend = _backend;
+ backend->iterating_acllist = TRUE;
return &ctx->ctx;
}
void
acl_backend_vfile_nonowner_iter_deinit(struct acl_mailbox_list_context *ctx)
{
+ struct acl_backend_vfile *backend =
+ (struct acl_backend_vfile *)ctx->backend;
+
+ backend->iterating_acllist = FALSE;
i_free(ctx);
}