vold: Unmount StubVolume disks before unmounting EmulatedVolumes

The current shutdown / reset logic in VolumeManager unmounts
EmulatedVolume first, and unmounts the other disks.

In ARC (Android on ChromeOS), ChromeOS Downloads directory (exposed from
ChromeOS to Android as a disk having StubVolume) is bind-mounted to
/data/media/0/Download in the ARC-customized version of
StubVolume::doMount() (http://shortn/_lKaAhTLhY3), and the current
unmount order causes EmulatedVolume not to be cleanly unmounted. This
patch hence changes the order of the unmount of volumes to first unmount
StubVolume disks, then unmount the EmulatedVolumes, then unmount the
non-StubVolume disks.

Bug: 304369444
Test: On an Android phone, create a virtual public volume with the
  following commands on adb shell (taken from
  android.scopedstorage.cts.lib.TestUtils.createNewPublicVolume()):
  $ sm set-force-adoptable on
  $ sm set-virtual-disk true
  $ sm list-disks  # <- This returns the virtual disk name
  $ sm partition <virtual disk name> public
  Then, run `vdc volume reset` on lynx adb shell, observe logcat from
  vold and check that no error is observed.
Test: Run `vdc volume reset` on ARC adb shell, and confirm that:
  * Without this patch, the primary emulated volume fails to unmount
    with "Device or resource busy", followed by MyFiles volume unmount.
  * With this patch, MyFiles volume is unmounted before the primary
    emulated volume, and no error is observed.

Change-Id: I54f60e3320574ccf8d3589545ff77967fff14fc7
1 file changed