diff options
author | Jeff Sharkey <jsharkey@android.com> | 2018-05-01 10:01:52 -0600 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2018-05-01 10:03:18 -0600 |
commit | b00d5ea59a5218cde5d7b2e84572f6fd26611f25 (patch) | |
tree | 15859f855b7a3c2cfe7e1c770aa0cce1d5a4c219 /packages/ExternalStorageProvider | |
parent | 68f36d6b5d5ad4711811160795cab399d247845d (diff) |
Return to modifying raw /mnt/media_rw paths.
We thought we could push everyone through sdcardfs, but secondary
devices mounted in a stable location don't give full write access to
apps holding WRITE_EXTERNAL_STORAGE, so system internals still need
to reach behind sdcardfs.
To keep sdcardfs in the loop about changes that we make behind its
back, we issue access(2) calls which should be enough for it to
invalidate any cached details.
Bug: 74132243
Test: manual
Change-Id: I727cd179a5a825b16ec4df6e2f41a079758d41c5
Diffstat (limited to 'packages/ExternalStorageProvider')
-rw-r--r-- | packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 2a82fc9b28df..0a720a5b234e 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -38,6 +38,9 @@ import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Path; import android.provider.DocumentsContract.Root; import android.provider.Settings; +import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; import android.text.TextUtils; import android.util.ArrayMap; import android.util.DebugUtils; @@ -360,14 +363,19 @@ public class ExternalStorageProvider extends FileSystemProvider { @Override protected File getFileForDocId(String docId, boolean visible) throws FileNotFoundException { + return getFileForDocId(docId, visible, true); + } + + private File getFileForDocId(String docId, boolean visible, boolean mustExist) + throws FileNotFoundException { RootInfo root = getRootFromDocId(docId); - return buildFile(root, docId, visible); + return buildFile(root, docId, visible, mustExist); } private Pair<RootInfo, File> resolveDocId(String docId, boolean visible) throws FileNotFoundException { RootInfo root = getRootFromDocId(docId); - return Pair.create(root, buildFile(root, docId, visible)); + return Pair.create(root, buildFile(root, docId, visible, true)); } private RootInfo getRootFromDocId(String docId) throws FileNotFoundException { @@ -385,7 +393,7 @@ public class ExternalStorageProvider extends FileSystemProvider { return root; } - private File buildFile(RootInfo root, String docId, boolean visible) + private File buildFile(RootInfo root, String docId, boolean visible, boolean mustExist) throws FileNotFoundException { final int splitIndex = docId.indexOf(':', 1); final String path = docId.substring(splitIndex + 1); @@ -398,7 +406,7 @@ public class ExternalStorageProvider extends FileSystemProvider { target.mkdirs(); } target = new File(target, path); - if (!target.exists()) { + if (mustExist && !target.exists()) { throw new FileNotFoundException("Missing file for " + docId + " at " + target); } return target; @@ -410,6 +418,19 @@ public class ExternalStorageProvider extends FileSystemProvider { } @Override + protected void onDocIdChanged(String docId) { + try { + // Touch the visible path to ensure that any sdcardfs caches have + // been updated to reflect underlying changes on disk. + final File visiblePath = getFileForDocId(docId, true, false); + if (visiblePath != null) { + Os.access(visiblePath.getAbsolutePath(), OsConstants.F_OK); + } + } catch (FileNotFoundException | ErrnoException ignored) { + } + } + + @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection)); synchronized (mRootsLock) { |