|
|
|
@ -48,6 +48,7 @@ EmulatedVolume::EmulatedVolume(const std::string& rawPath, int userId)
|
|
|
|
|
mRawPath = rawPath;
|
|
|
|
|
mLabel = "emulated";
|
|
|
|
|
mFuseMounted = false;
|
|
|
|
|
mAndroidMounted = false;
|
|
|
|
|
mUseSdcardFs = IsFilesystemSupported("sdcardfs");
|
|
|
|
|
mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false);
|
|
|
|
|
}
|
|
|
|
@ -59,6 +60,7 @@ EmulatedVolume::EmulatedVolume(const std::string& rawPath, dev_t device, const s
|
|
|
|
|
mRawPath = rawPath;
|
|
|
|
|
mLabel = fsUuid;
|
|
|
|
|
mFuseMounted = false;
|
|
|
|
|
mAndroidMounted = false;
|
|
|
|
|
mUseSdcardFs = IsFilesystemSupported("sdcardfs");
|
|
|
|
|
mAppDataIsolationEnabled = base::GetBoolProperty(kVoldAppDataIsolationEnabled, false);
|
|
|
|
|
}
|
|
|
|
@ -87,6 +89,8 @@ static status_t doFuseBindMount(const std::string& source, const std::string& ta
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t EmulatedVolume::mountFuseBindMounts() {
|
|
|
|
|
CHECK(!mAndroidMounted);
|
|
|
|
|
|
|
|
|
|
std::string androidSource;
|
|
|
|
|
std::string label = getLabel();
|
|
|
|
|
int userId = getMountUserId();
|
|
|
|
@ -109,6 +113,8 @@ status_t EmulatedVolume::mountFuseBindMounts() {
|
|
|
|
|
if (status != OK) {
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
mAndroidMounted = true;
|
|
|
|
|
|
|
|
|
|
// Installers get the same view as all other apps, with the sole exception that the
|
|
|
|
|
// OBB dirs (Android/obb) are writable to them. On sdcardfs devices, this requires
|
|
|
|
|
// a special bind mount, since app-private and OBB dirs share the same GID, but we
|
|
|
|
@ -129,6 +135,8 @@ status_t EmulatedVolume::mountFuseBindMounts() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
status_t EmulatedVolume::unmountFuseBindMounts() {
|
|
|
|
|
CHECK(mAndroidMounted);
|
|
|
|
|
|
|
|
|
|
std::string label = getLabel();
|
|
|
|
|
int userId = getMountUserId();
|
|
|
|
|
|
|
|
|
@ -158,7 +166,6 @@ status_t EmulatedVolume::unmountFuseBindMounts() {
|
|
|
|
|
}
|
|
|
|
|
LOG(INFO) << "Unmounted " << androidTarget;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -297,7 +304,10 @@ status_t EmulatedVolume::doUnmount() {
|
|
|
|
|
|
|
|
|
|
// Ignoring unmount return status because we do want to try to unmount
|
|
|
|
|
// the rest cleanly.
|
|
|
|
|
unmountFuseBindMounts();
|
|
|
|
|
if (mAndroidMounted) {
|
|
|
|
|
unmountFuseBindMounts();
|
|
|
|
|
mAndroidMounted = false;
|
|
|
|
|
}
|
|
|
|
|
if (UnmountUserFuse(userId, getInternalPath(), label) != OK) {
|
|
|
|
|
PLOG(INFO) << "UnmountUserFuse failed on emulated fuse volume";
|
|
|
|
|
return -errno;
|
|
|
|
|