Merge "storagemenager: Skip fstrim while doing block based checkpoint" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
274b17c925
@@ -1074,6 +1074,15 @@ class StorageManagerService extends IStorageManager.Stub
|
|||||||
mVold.onUserStarted(userId, packages, appIds, sandboxIds);
|
mVold.onUserStarted(userId, packages, appIds, sandboxIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean supportsBlockCheckpoint() throws RemoteException {
|
||||||
|
// Only the system process is permitted to start checkpoints
|
||||||
|
if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
|
||||||
|
throw new SecurityException("no permission to check block based checkpoint support");
|
||||||
|
}
|
||||||
|
|
||||||
|
return mVold.supportsBlockCheckpoint();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAwakeStateChanged(boolean isAwake) {
|
public void onAwakeStateChanged(boolean isAwake) {
|
||||||
// Ignored
|
// Ignored
|
||||||
@@ -2116,6 +2125,11 @@ class StorageManagerService extends IStorageManager.Stub
|
|||||||
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
|
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Block based checkpoint process runs fstrim. So, if checkpoint is in progress
|
||||||
|
// (first boot after OTA), We skip idle maintenance and make sure the last
|
||||||
|
// fstrim time is still updated. If file based checkpoints are used, we run
|
||||||
|
// idle maintenance (GC + fstrim) regardless of checkpoint status.
|
||||||
|
if (!needsCheckpoint() || !supportsBlockCheckpoint()) {
|
||||||
mVold.fstrim(flags, new IVoldTaskListener.Stub() {
|
mVold.fstrim(flags, new IVoldTaskListener.Stub() {
|
||||||
@Override
|
@Override
|
||||||
public void onStatus(int status, PersistableBundle extras) {
|
public void onStatus(int status, PersistableBundle extras) {
|
||||||
@@ -2147,6 +2161,9 @@ class StorageManagerService extends IStorageManager.Stub
|
|||||||
// TODO: benchmark when desired
|
// TODO: benchmark when desired
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
Slog.i(TAG, "Skipping fstrim - block based checkpoint in progress");
|
||||||
|
}
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowAsRuntimeException();
|
throw e.rethrowAsRuntimeException();
|
||||||
}
|
}
|
||||||
@@ -2156,6 +2173,11 @@ class StorageManagerService extends IStorageManager.Stub
|
|||||||
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
|
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// Block based checkpoint process runs fstrim. So, if checkpoint is in progress
|
||||||
|
// (first boot after OTA), We skip idle maintenance and make sure the last
|
||||||
|
// fstrim time is still updated. If file based checkpoints are used, we run
|
||||||
|
// idle maintenance (GC + fstrim) regardless of checkpoint status.
|
||||||
|
if (!needsCheckpoint() || !supportsBlockCheckpoint()) {
|
||||||
mVold.runIdleMaint(new IVoldTaskListener.Stub() {
|
mVold.runIdleMaint(new IVoldTaskListener.Stub() {
|
||||||
@Override
|
@Override
|
||||||
public void onStatus(int status, PersistableBundle extras) {
|
public void onStatus(int status, PersistableBundle extras) {
|
||||||
@@ -2168,6 +2190,9 @@ class StorageManagerService extends IStorageManager.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
Slog.i(TAG, "Skipping idle maintenance - block based checkpoint in progress");
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Slog.wtf(TAG, e);
|
Slog.wtf(TAG, e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user