diff options
| author | Jeff Sharkey <jsharkey@android.com> | 2015-06-17 19:44:05 -0700 |
|---|---|---|
| committer | Jeff Sharkey <jsharkey@android.com> | 2015-06-22 14:07:10 -0700 |
| commit | 5cc0df214bbe2b169150c9060dc5288bb8aaf338 (patch) | |
| tree | 52a13874fa635458d1914112cae838d75c11986f | |
| parent | b1891b3fc9d07ef766978f0a39c382b217a529e0 (diff) | |
| download | frameworks_base-5cc0df214bbe2b169150c9060dc5288bb8aaf338.zip frameworks_base-5cc0df214bbe2b169150c9060dc5288bb8aaf338.tar.gz frameworks_base-5cc0df214bbe2b169150c9060dc5288bb8aaf338.tar.bz2 | |
Forget private partition keys.
When we forget a private partition, ask vold to also forget the key
for that partition GUID. This means we need to track both the
filesystem UUID and the partition GUID for a private volume.
Bug: 21782268
Change-Id: Icda1cbb65539d61dacc663428daf3d1a2e4c313e
| -rw-r--r-- | core/java/android/os/storage/VolumeInfo.java | 7 | ||||
| -rw-r--r-- | core/java/android/os/storage/VolumeRecord.java | 5 | ||||
| -rw-r--r-- | core/java/android/text/TextUtils.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/MountService.java | 44 |
4 files changed, 51 insertions, 10 deletions
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java index 8d11527..e33baa9 100644 --- a/core/java/android/os/storage/VolumeInfo.java +++ b/core/java/android/os/storage/VolumeInfo.java @@ -137,6 +137,7 @@ public class VolumeInfo implements Parcelable { public final String id; public final int type; public final DiskInfo disk; + public final String partGuid; public int mountFlags = 0; public int mountUserId = -1; public int state = STATE_UNMOUNTED; @@ -149,10 +150,11 @@ public class VolumeInfo implements Parcelable { /** Framework state */ public final int mtpIndex; - public VolumeInfo(String id, int type, DiskInfo disk, int mtpIndex) { + public VolumeInfo(String id, int type, DiskInfo disk, String partGuid, int mtpIndex) { this.id = Preconditions.checkNotNull(id); this.type = type; this.disk = disk; + this.partGuid = partGuid; this.mtpIndex = mtpIndex; } @@ -164,6 +166,7 @@ public class VolumeInfo implements Parcelable { } else { disk = null; } + partGuid = parcel.readString(); mountFlags = parcel.readInt(); mountUserId = parcel.readInt(); state = parcel.readInt(); @@ -385,6 +388,7 @@ public class VolumeInfo implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(getClass(), "TYPE_", type)); pw.printPair("diskId", getDiskId()); + pw.printPair("partGuid", partGuid); pw.printPair("mountFlags", DebugUtils.flagsToString(getClass(), "MOUNT_FLAG_", mountFlags)); pw.printPair("mountUserId", mountUserId); pw.printPair("state", DebugUtils.valueToString(getClass(), "STATE_", state)); @@ -453,6 +457,7 @@ public class VolumeInfo implements Parcelable { } else { parcel.writeInt(0); } + parcel.writeString(partGuid); parcel.writeInt(mountFlags); parcel.writeInt(mountUserId); parcel.writeInt(state); diff --git a/core/java/android/os/storage/VolumeRecord.java b/core/java/android/os/storage/VolumeRecord.java index 096e2dd..cb16305 100644 --- a/core/java/android/os/storage/VolumeRecord.java +++ b/core/java/android/os/storage/VolumeRecord.java @@ -39,6 +39,7 @@ public class VolumeRecord implements Parcelable { public final int type; public final String fsUuid; + public String partGuid; public String nickname; public int userFlags; @@ -50,6 +51,7 @@ public class VolumeRecord implements Parcelable { public VolumeRecord(Parcel parcel) { type = parcel.readInt(); fsUuid = parcel.readString(); + partGuid = parcel.readString(); nickname = parcel.readString(); userFlags = parcel.readInt(); } @@ -79,6 +81,8 @@ public class VolumeRecord implements Parcelable { pw.increaseIndent(); pw.printPair("type", DebugUtils.valueToString(VolumeInfo.class, "TYPE_", type)); pw.printPair("fsUuid", fsUuid); + pw.printPair("partGuid", partGuid); + pw.println(); pw.printPair("nickname", nickname); pw.printPair("userFlags", DebugUtils.flagsToString(VolumeRecord.class, "USER_FLAG_", userFlags)); @@ -133,6 +137,7 @@ public class VolumeRecord implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(type); parcel.writeString(fsUuid); + parcel.writeString(partGuid); parcel.writeString(nickname); parcel.writeInt(userFlags); } diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index d51aa79..d8f7158 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -465,6 +465,11 @@ public class TextUtils { return false; } + /** {@hide} */ + public static String nullIfEmpty(@Nullable String str) { + return isEmpty(str) ? null : str; + } + /** * Returns the length that the specified CharSequence would have if * spaces and control characters were trimmed from the start and end, diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 34dceed..458150c 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -259,6 +259,7 @@ class MountService extends IMountService.Stub private static final String TAG_VOLUME = "volume"; private static final String ATTR_TYPE = "type"; private static final String ATTR_FS_UUID = "fsUuid"; + private static final String ATTR_PART_GUID = "partGuid"; private static final String ATTR_NICKNAME = "nickname"; private static final String ATTR_USER_FLAGS = "userFlags"; @@ -689,7 +690,7 @@ class MountService extends IMountService.Stub // Create a stub volume that represents internal storage final VolumeInfo internal = new VolumeInfo(VolumeInfo.ID_PRIVATE_INTERNAL, - VolumeInfo.TYPE_PRIVATE, null, 0); + VolumeInfo.TYPE_PRIVATE, null, null, 0); internal.state = VolumeInfo.STATE_MOUNTED; internal.path = Environment.getDataDirectory().getAbsolutePath(); mVolumes.put(internal.id, internal); @@ -900,10 +901,12 @@ class MountService extends IMountService.Stub case VoldResponseCode.VOLUME_CREATED: { final String id = cooked[1]; final int type = Integer.parseInt(cooked[2]); - final String diskId = (cooked.length == 4) ? cooked[3] : null; + final String diskId = TextUtils.nullIfEmpty(cooked[3]); + final String partGuid = TextUtils.nullIfEmpty(cooked[4]); + final DiskInfo disk = mDisks.get(diskId); final int mtpIndex = allocateMtpIndex(id); - final VolumeInfo vol = new VolumeInfo(id, type, disk, mtpIndex); + final VolumeInfo vol = new VolumeInfo(id, type, disk, partGuid, mtpIndex); mVolumes.put(id, vol); onVolumeCreatedLocked(vol); break; @@ -1091,13 +1094,21 @@ class MountService extends IMountService.Stub // Remember that we saw this volume so we're ready to accept user // metadata, or so we can annoy them when a private volume is ejected if (vol.isMountedReadable() && !TextUtils.isEmpty(vol.fsUuid)) { - if (!mRecords.containsKey(vol.fsUuid)) { - final VolumeRecord rec = new VolumeRecord(vol.type, vol.fsUuid); + VolumeRecord rec = mRecords.get(vol.fsUuid); + if (rec == null) { + rec = new VolumeRecord(vol.type, vol.fsUuid); + rec.partGuid = vol.partGuid; if (vol.type == VolumeInfo.TYPE_PRIVATE) { rec.nickname = vol.disk.getDescription(); } mRecords.put(rec.fsUuid, rec); writeSettingsLocked(); + } else { + // Handle upgrade case where we didn't store partition GUID + if (TextUtils.isEmpty(rec.partGuid)) { + rec.partGuid = vol.partGuid; + writeSettingsLocked(); + } } } @@ -1347,6 +1358,7 @@ class MountService extends IMountService.Stub final int type = readIntAttribute(in, ATTR_TYPE); final String fsUuid = readStringAttribute(in, ATTR_FS_UUID); final VolumeRecord meta = new VolumeRecord(type, fsUuid); + meta.partGuid = readStringAttribute(in, ATTR_PART_GUID); meta.nickname = readStringAttribute(in, ATTR_NICKNAME); meta.userFlags = readIntAttribute(in, ATTR_USER_FLAGS); return meta; @@ -1356,6 +1368,7 @@ class MountService extends IMountService.Stub out.startTag(null, TAG_VOLUME); writeIntAttribute(out, ATTR_TYPE, rec.type); writeStringAttribute(out, ATTR_FS_UUID, rec.fsUuid); + writeStringAttribute(out, ATTR_PART_GUID, rec.partGuid); writeStringAttribute(out, ATTR_NICKNAME, rec.nickname); writeIntAttribute(out, ATTR_USER_FLAGS, rec.userFlags); out.endTag(null, TAG_VOLUME); @@ -1573,9 +1586,11 @@ class MountService extends IMountService.Stub Preconditions.checkNotNull(fsUuid); synchronized (mLock) { - mRecords.remove(fsUuid); - - // TODO: tell vold to forget keys + final VolumeRecord rec = mRecords.remove(fsUuid); + if (rec != null && !TextUtils.isEmpty(rec.partGuid)) { + forgetPartition(rec.partGuid); + } + mCallbacks.notifyVolumeForgotten(fsUuid); // If this had been primary storage, revert back to internal and // reset vold so we bind into new volume into place. @@ -1584,7 +1599,6 @@ class MountService extends IMountService.Stub resetIfReadyAndConnected(); } - mCallbacks.notifyVolumeForgotten(fsUuid); writeSettingsLocked(); } } @@ -1597,6 +1611,10 @@ class MountService extends IMountService.Stub synchronized (mLock) { for (int i = 0; i < mRecords.size(); i++) { final String fsUuid = mRecords.keyAt(i); + final VolumeRecord rec = mRecords.valueAt(i); + if (!TextUtils.isEmpty(rec.partGuid)) { + forgetPartition(rec.partGuid); + } mCallbacks.notifyVolumeForgotten(fsUuid); } mRecords.clear(); @@ -1610,6 +1628,14 @@ class MountService extends IMountService.Stub } } + private void forgetPartition(String partGuid) { + try { + mConnector.execute("volume", "forget_partition", partGuid); + } catch (NativeDaemonConnectorException e) { + Slog.w(TAG, "Failed to forget key for " + partGuid + ": " + e); + } + } + @Override public void setDebugFlags(int flags, int mask) { enforcePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS); |
