From 0d3df382d616f37efb5191548a22656f8494ca76 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Sun, 1 Mar 2015 00:08:40 +0100 Subject: Invalidate dirfd less aggressively src/safe.c (safe_rename, safe_rmdir): Only invalidate cache entries when the underlying sycall succeeds and the entry actually goes away. This keeps the cache filled upon speculative rmdir when the directory may not be empty, for example. --- src/safe.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/safe.c b/src/safe.c index 129ccf4..69803ea 100644 --- a/src/safe.c +++ b/src/safe.c @@ -508,8 +508,11 @@ int safe_rename (const char *oldpath, const char *newpath) return newdirfd; ret = renameat (olddirfd, oldpath, newdirfd, newpath); - invalidate_cached_dirfd (olddirfd, oldpath); - invalidate_cached_dirfd (newdirfd, newpath); + if (! ret) + { + invalidate_cached_dirfd (olddirfd, oldpath); + invalidate_cached_dirfd (newdirfd, newpath); + } return ret; } @@ -535,7 +538,8 @@ int safe_rmdir (const char *pathname) return dirfd; ret = unlinkat (dirfd, pathname, AT_REMOVEDIR); - invalidate_cached_dirfd (dirfd, pathname); + if (! ret) + invalidate_cached_dirfd (dirfd, pathname); return ret; } -- cgit v1.2.1