65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
autofs-5.1.4 - mark removed cache entry negative
 | 
						|
 | 
						|
From: Ian Kent <raven@themaw.net>
 | 
						|
 | 
						|
When re-reading a map entries that have been removed are detected
 | 
						|
and deleted from the map entry cache by lookup_prune_cache().
 | 
						|
 | 
						|
If a removed map entry is mounted at the time lookup_prune_cache()
 | 
						|
is called the map entry is skippedi. This is done becuase the next
 | 
						|
lookup (following the mount expire, which needs the cache entry to
 | 
						|
remain) will detect the stale cache entry and a map update done
 | 
						|
resulting in the istale entry being removed.
 | 
						|
 | 
						|
But if a map re-read is performed while the cache entry is mounted
 | 
						|
the cache will appear to up to date so the removed entry will remain
 | 
						|
valid even after it has expired.
 | 
						|
 | 
						|
To cover this case it's sufficient to mark the mounted cache entry
 | 
						|
negative during the cache prune which prevent further lookups from
 | 
						|
using the stale entry.
 | 
						|
 | 
						|
Signed-off-by: Ian Kent <raven@themaw.net>
 | 
						|
---
 | 
						|
 CHANGELOG       |    1 +
 | 
						|
 daemon/lookup.c |   12 +++++++++---
 | 
						|
 2 files changed, 10 insertions(+), 3 deletions(-)
 | 
						|
 | 
						|
--- autofs-5.1.4.orig/CHANGELOG
 | 
						|
+++ autofs-5.1.4/CHANGELOG
 | 
						|
@@ -29,6 +29,7 @@ xx/xx/2018 autofs-5.1.5
 | 
						|
 - covarity fixes.
 | 
						|
 - fix program usage message.
 | 
						|
 - fix update_negative_cache() map source usage.
 | 
						|
+- mark removed cache entry negative.
 | 
						|
 
 | 
						|
 19/12/2017 autofs-5.1.4
 | 
						|
 - fix spec file url.
 | 
						|
--- autofs-5.1.4.orig/daemon/lookup.c
 | 
						|
+++ autofs-5.1.4/daemon/lookup.c
 | 
						|
@@ -1417,15 +1417,21 @@ void lookup_prune_one_cache(struct autof
 | 
						|
 		if (valid && valid->mc == mc) {
 | 
						|
 			 /*
 | 
						|
 			  * We've found a map entry that has been removed from
 | 
						|
-			  * the current cache so it isn't really valid.
 | 
						|
+			  * the current cache so it isn't really valid. Set the
 | 
						|
+			  * mapent negative to prevent further mount requests
 | 
						|
+			  * using the cache entry.
 | 
						|
 			  */
 | 
						|
+			debug(ap->logopt, "removed map entry detected, mark negative");
 | 
						|
+			if (valid->mapent) {
 | 
						|
+				free(valid->mapent);
 | 
						|
+				valid->mapent = NULL;
 | 
						|
+			}
 | 
						|
 			cache_unlock(valid->mc);
 | 
						|
 			valid = NULL;
 | 
						|
 		}
 | 
						|
 		if (!valid &&
 | 
						|
 		    is_mounted(_PATH_MOUNTED, path, MNTS_REAL)) {
 | 
						|
-			debug(ap->logopt,
 | 
						|
-			      "prune check posponed, %s mounted", path);
 | 
						|
+			debug(ap->logopt, "prune posponed, %s mounted", path);
 | 
						|
 			free(key);
 | 
						|
 			free(path);
 | 
						|
 			continue;
 |