From d470a1eca6ec47fe09513e40788e0abea3d12c1f Mon Sep 17 00:00:00 2001 From: Jerry Zhang Date: Mon, 14 May 2018 12:19:08 -0700 Subject: [PATCH] Call access(2) on all files/dirs modified by Mtp External sdcards are accessed through /mnt/media_rw, so access() each touched file for sdcardfs to update its metadata. Java handles single object renames directly so that is the only place where it is needed. Bug: 77849654 Test: use mtp with emulated sdcard Change-Id: Ie460398010f1fe74d8084808a6333b121674362c --- media/java/android/mtp/MtpDatabase.java | 10 ++++++++++ .../src/android/mtp/MtpStorageManagerTest.java | 8 ++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 7976f67c64a8a..e568ef79b4cc8 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -35,6 +35,9 @@ import android.provider.MediaStore; import android.provider.MediaStore.Audio; import android.provider.MediaStore.Files; import android.provider.MediaStore.MediaColumns; +import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; import android.util.Log; import android.view.Display; import android.view.WindowManager; @@ -560,6 +563,13 @@ public class MtpDatabase implements AutoCloseable { return MtpConstants.RESPONSE_GENERAL_ERROR; Path newPath = obj.getPath(); boolean success = oldPath.toFile().renameTo(newPath.toFile()); + try { + Os.access(oldPath.toString(), OsConstants.F_OK); + Os.access(newPath.toString(), OsConstants.F_OK); + } catch (ErrnoException e) { + // Ignore. Could fail if the metadata was already updated. + } + if (!mManager.endRenameObject(obj, oldPath.getFileName().toString(), success)) { Log.e(TAG, "Failed to end rename object"); } diff --git a/media/tests/MtpTests/src/android/mtp/MtpStorageManagerTest.java b/media/tests/MtpTests/src/android/mtp/MtpStorageManagerTest.java index 0d7f3feaaae67..b05242d5c9c54 100644 --- a/media/tests/MtpTests/src/android/mtp/MtpStorageManagerTest.java +++ b/media/tests/MtpTests/src/android/mtp/MtpStorageManagerTest.java @@ -104,10 +104,10 @@ public class MtpStorageManagerTest { mainStorageDir = createNewDir(TEMP_DIR_FILE); secondaryStorageDir = createNewDir(TEMP_DIR_FILE); - StorageVolume mainStorage = new StorageVolume("1", mainStorageDir, "", true, false, true, - false, -1, UserHandle.CURRENT, "", ""); - StorageVolume secondaryStorage = new StorageVolume("2", secondaryStorageDir, "", false, - false, true, false, -1, UserHandle.CURRENT, "", ""); + StorageVolume mainStorage = new StorageVolume("1", mainStorageDir, mainStorageDir, + "", true, false, true, false, -1, UserHandle.CURRENT, "", ""); + StorageVolume secondaryStorage = new StorageVolume("2", secondaryStorageDir, + secondaryStorageDir, "", false, false, true, false, -1, UserHandle.CURRENT, "", ""); objectsAdded = new ArrayList<>(); objectsRemoved = new ArrayList<>();