Invalidate FUSE VFS dentry
When modifying files on the lower file system over the binder
ContentResolver interface, we should invalidate any FUSE VFS cache for
that dentry.
Test: Manual
Bug: 149512775
Change-Id: I41aa308ad15210f0fda7614c76d7447099af9559
Merged-In: I41aa308ad15210f0fda7614c76d7447099af9559
(cherry picked from commit b3ede6d1de7178b67c9debbd5e03c42bd82fb69d)
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 5a3c14a..02b9e66 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -4577,6 +4577,12 @@
Log.d(TAG, "Moving " + beforePath + " to " + afterPath);
try {
Os.rename(beforePath, afterPath);
+ if (!FuseDaemon.native_is_fuse_thread()) {
+ // If we are on a FUSE thread, we don't need to invalidate,
+ // (and *must* not, otherwise we'd crash) because the rename is already
+ // reflected in the lower filesystem
+ invalidateFuseDentry(beforePath);
+ }
} catch (ErrnoException e) {
throw new IllegalStateException(e);
}
@@ -5029,6 +5035,15 @@
return ExternalStorageServiceImpl.getFuseDaemon(volume.getId());
}
+ private void invalidateFuseDentry(String path) {
+ FuseDaemon daemon = getFuseDaemonForFile(new File(path));
+ if (daemon != null) {
+ daemon.invalidateFuseDentryCache(path);
+ } else {
+ Log.w(TAG, "Failed to invalidate FUSE dentry. Daemon unavailable for path " + path);
+ }
+ }
+
/**
* Replacement for {@link #openFileHelper(Uri, String)} which enforces any
* permissions applicable to the path before returning.
@@ -5180,6 +5195,12 @@
final File file = new File(path);
checkAccess(uri, extras, file, true);
file.delete();
+ if (!FuseDaemon.native_is_fuse_thread()) {
+ // If we are on a FUSE thread, we don't need to invalidate,
+ // (and *must* not, otherwise we'd crash) because the delete is already
+ // reflected in the lower filesystem
+ invalidateFuseDentry(path);
+ }
} catch (Exception e) {
Log.e(TAG, "Couldn't delete " + path, e);
}