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;
 	}
 }