From: Timo Sirainen Date: Sun, 16 Nov 2008 12:15:13 +0000 (+0200) Subject: acl: After updating ACLs, try to avoid re-reading the ACLs on next access. X-Git-Tag: 1.2.alpha4~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f1124cbd48c2c36dd8061e5c3e028faeaf62dca;p=thirdparty%2Fdovecot%2Fcore.git acl: After updating ACLs, try to avoid re-reading the ACLs on next access. --HG-- branch : HEAD --- diff --git a/src/plugins/acl/acl-backend-vfile.c b/src/plugins/acl/acl-backend-vfile.c index 333be1bdb8..0f9b11efc4 100644 --- a/src/plugins/acl/acl-backend-vfile.c +++ b/src/plugins/acl/acl-backend-vfile.c @@ -1068,6 +1068,24 @@ acl_backend_vfile_update_write(struct acl_object_vfile *aclobj, 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 @@ acl_backend_vfile_object_update(struct acl_object *_aclobj, 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; + } + 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 file_dotlock_replace(&dotlock, 0); + return 0; } }