Mercurial > dovecot > original-hg > dovecot-1.2
changeset 8422:6d97abf20724 HEAD
acl: After updating ACLs, try to avoid re-reading the ACLs on next access.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 16 Nov 2008 14:15:13 +0200 |
parents | 2df1b964d32a |
children | 1f93b1bd8a32 |
files | src/plugins/acl/acl-backend-vfile.c |
diffstat | 1 files changed, 25 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/acl/acl-backend-vfile.c Sun Nov 16 14:06:15 2008 +0200 +++ b/src/plugins/acl/acl-backend-vfile.c Sun Nov 16 14:15:13 2008 +0200 @@ -1068,6 +1068,24 @@ return ret; } +static void acl_backend_vfile_update_cache(struct acl_object *_aclobj, int fd) +{ + struct acl_backend_vfile_validity *validity; + struct stat st; + + if (fstat(fd, &st) < 0) { + /* we'll just recalculate or fail it later */ + acl_cache_flush(_aclobj->backend->cache, _aclobj->name); + return; + } + + validity = acl_cache_get_validity(_aclobj->backend->cache, + _aclobj->name); + validity->local_validity.last_read_time = ioloop_time; + validity->local_validity.last_mtime = st.st_mtime; + validity->local_validity.last_size = st.st_size; +} + static int acl_backend_vfile_object_update(struct acl_object *_aclobj, const struct acl_rights_update *update) @@ -1097,14 +1115,18 @@ file_dotlock_delete(&dotlock); return 0; } else { - acl_cache_flush(_aclobj->backend->cache, _aclobj->name); - path = file_dotlock_get_lock_path(dotlock); if (acl_backend_vfile_update_write(aclobj, fd, path) < 0) { file_dotlock_delete(&dotlock); + acl_cache_flush(_aclobj->backend->cache, _aclobj->name); return -1; } - return file_dotlock_replace(&dotlock, 0); + acl_backend_vfile_update_cache(_aclobj, fd); + if (file_dotlock_replace(&dotlock, 0) < 0) { + acl_cache_flush(_aclobj->backend->cache, _aclobj->name); + return -1; + } + return 0; } }