12870: Don't send invalidation for inodes still referenced by kernel
authorPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 5 Jan 2018 19:39:51 +0000 (19:39 +0000)
committerPeter Amstutz <pamstutz@veritasgenetics.com>
Fri, 5 Jan 2018 19:39:51 +0000 (19:39 +0000)
When trying to flush cached inode contents, invalidating dentries
which are still referenced can race with lookups, causing the kernel to return
spurious "not found" errors.

Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <pamstutz@veritasgenetics.com>

services/fuse/arvados_fuse/__init__.py

index 418f748fe1a25fe65232abd904312bf44267992d..788d475e33c0d094d719503e6b9fc4dba386e1ec 100644 (file)
@@ -159,10 +159,11 @@ class InodeCache(object):
             if obj.in_use():
                 _logger.debug("InodeCache cannot clear inode %i, in use", obj.inode)
                 return
-            obj.kernel_invalidate()
             if obj.has_ref(True):
-                _logger.debug("InodeCache sent kernel invalidate inode %i", obj.inode)
+                _logger.debug("InodeCache cannot clear inode %i, still referenced", obj.inode)
                 return
+            obj.kernel_invalidate()
+            _logger.debug("InodeCache sent kernel invalidate inode %i", obj.inode)
             obj.clear()
 
         # The llfuse lock is released in del_entry(), which is called by