Merge changes from topic "revert-16575908-dont_abandon_child_qt_dev-VVMFNIYZZO" into qt-dev

* changes:
  [RESTRICT AUTOMERGE] Revert "Revert "Revert "[pm] remove old stage dirs on low storage"""
  [RESTRICT AUTOMERGE] Revert "Don't abandon child sessions (1/n)"
  [RESTRICT AUTOMERGE] Revert "Fix NPE"
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index df3f116..0321da6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -129,9 +129,6 @@
     private static final long MAX_ACTIVE_SESSIONS = 1024;
     /** Upper bound on number of historical sessions for a UID */
     private static final long MAX_HISTORICAL_SESSIONS = 1048576;
-    /** Destroy sessions older than this on storage free request */
-    private static final long MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS = 8 * DateUtils.HOUR_IN_MILLIS;
-
 
     private final Context mContext;
     private final PackageManagerService mPm;
@@ -278,28 +275,18 @@
 
     @GuardedBy("mSessions")
     private void reconcileStagesLocked(String volumeUuid) {
-        final ArraySet<File> unclaimedStages = getStagingDirsOnVolume(volumeUuid);
+        final File stagingDir = getTmpSessionDir(volumeUuid);
+        final ArraySet<File> unclaimedStages = newArraySet(
+                stagingDir.listFiles(sStageFilter));
+
         // Ignore stages claimed by active sessions
         for (int i = 0; i < mSessions.size(); i++) {
             final PackageInstallerSession session = mSessions.valueAt(i);
             unclaimedStages.remove(session.stageDir);
         }
-        removeStagingDirs(unclaimedStages);
-    }
 
-    private ArraySet<File> getStagingDirsOnVolume(String volumeUuid) {
-        final File stagingDir = getTmpSessionDir(volumeUuid);
-        final ArraySet<File> stagingDirs = newArraySet(stagingDir.listFiles(sStageFilter));
-        // We also need to clean up orphaned staging directory for staged sessions
-        final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid);
-        stagingDirs.addAll(newArraySet(stagedSessionStagingDir.listFiles()));
-        return stagingDirs;
-    }
-
-
-    private void removeStagingDirs(ArraySet<File> stagingDirsToRemove) {
         // Clean up orphaned staging directories
-        for (File stage : stagingDirsToRemove) {
+        for (File stage : unclaimedStages) {
             Slog.w(TAG, "Deleting orphan stage " + stage);
             synchronized (mPm.mInstallLock) {
                 mPm.removeCodePathLI(stage);
@@ -313,42 +300,6 @@
         }
     }
 
-    /**
-     * Called to free up some storage space from obsolete installation files
-     */
-    public void freeStageDirs(String volumeUuid) {
-        final ArraySet<File> unclaimedStagingDirsOnVolume = getStagingDirsOnVolume(volumeUuid);
-        final long currentTimeMillis = System.currentTimeMillis();
-        synchronized (mSessions) {
-            for (int i = 0; i < mSessions.size(); i++) {
-                final PackageInstallerSession session = mSessions.valueAt(i);
-                if (!unclaimedStagingDirsOnVolume.contains(session.stageDir)) {
-                    // Only handles sessions stored on the target volume
-                    continue;
-                }
-                final long age = currentTimeMillis - session.createdMillis;
-                if (age >= MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS) {
-                    // Aggressively close old sessions because we are running low on storage
-                    // Their staging dirs will be removed too
-                    PackageInstallerSession root = !session.hasParentSessionId()
-                            ? session : mSessions.get(session.getParentSessionId());
-                    if (root == null) {
-                        Slog.e(TAG, "freeStageDirs: found an orphaned session: "
-                                + session.sessionId + " parent=" + session.getParentSessionId());
-                    } else if (!root.isDestroyed() && 
-                            (!root.isStaged() || (root.isStaged() && root.isStagedSessionReady()))) 
-                    {
-                        root.abandon();
-                    }
-                } else {
-                    // Session is new enough, so it deserves to be kept even on low storage
-                    unclaimedStagingDirsOnVolume.remove(session.stageDir);
-                }
-            }
-        }
-        removeStagingDirs(unclaimedStagingDirsOnVolume);
-    }
-
     public static boolean isStageName(String name) {
         final boolean isFile = name.startsWith("vmdl") && name.endsWith(".tmp");
         final boolean isContainer = name.startsWith("smdl") && name.endsWith(".tmp");
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 3232692..7980f3c 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -2088,7 +2088,8 @@
                             + mParentSessionId +  " and may not be abandoned directly.");
         }
         synchronized (mLock) {
-            assertCallerIsOwnerOrRootOrSystemLocked();
+            assertCallerIsOwnerOrRootLocked();
+
             if (isStagedAndInTerminalState()) {
                 // We keep the session in the database if it's in a finalized state. It will be
                 // removed by PackageInstallerService when the last update time is old enough.
@@ -2115,20 +2116,6 @@
         dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
     }
 
-    /**
-     * Check if the caller is the owner of this session. Otherwise throw a
-     * {@link SecurityException}.
-     */
-    @GuardedBy("mLock")
-    private void assertCallerIsOwnerOrRootOrSystemLocked() {
-        final int callingUid = Binder.getCallingUid();
-        if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid
-                && callingUid != Process.SYSTEM_UID) {
-            throw new SecurityException("Session does not belong to uid " + callingUid);
-        }
-    }
-
-
     @Override
     public boolean isMultiPackage() {
         return params.isMultiPackage;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3549db4..af91d59 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4875,9 +4875,6 @@
                             InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
                 return;
             }
-            // 12. Clear temp install session files
-            mInstallerService.freeStageDirs(volumeUuid);
-
         } else {
             try {
                 mInstaller.freeCache(volumeUuid, bytes, 0, 0);