|
|
|
@ -43,11 +43,11 @@ using android::base::StringPrintf;
|
|
|
|
|
namespace android {
|
|
|
|
|
namespace vold {
|
|
|
|
|
|
|
|
|
|
static const char* kFusePath = "/system/bin/sdcard";
|
|
|
|
|
static const char* kSdcardFsPath = "/system/bin/sdcard";
|
|
|
|
|
|
|
|
|
|
static const char* kAsecPath = "/mnt/secure/asec";
|
|
|
|
|
|
|
|
|
|
PublicVolume::PublicVolume(dev_t device) : VolumeBase(Type::kPublic), mDevice(device), mFusePid(0) {
|
|
|
|
|
PublicVolume::PublicVolume(dev_t device) : VolumeBase(Type::kPublic), mDevice(device) {
|
|
|
|
|
setId(StringPrintf("public:%u,%u", major(device), minor(device)));
|
|
|
|
|
mDevPath = StringPrintf("/dev/block/vold/%s", getId().c_str());
|
|
|
|
|
}
|
|
|
|
@ -120,10 +120,10 @@ status_t PublicVolume::doMount() {
|
|
|
|
|
|
|
|
|
|
mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str());
|
|
|
|
|
|
|
|
|
|
mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str());
|
|
|
|
|
mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str());
|
|
|
|
|
mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str());
|
|
|
|
|
mFuseFull = StringPrintf("/mnt/runtime/full/%s", stableName.c_str());
|
|
|
|
|
mSdcardFsDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str());
|
|
|
|
|
mSdcardFsRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str());
|
|
|
|
|
mSdcardFsWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str());
|
|
|
|
|
mSdcardFsFull = StringPrintf("/mnt/runtime/full/%s", stableName.c_str());
|
|
|
|
|
|
|
|
|
|
setInternalPath(mRawPath);
|
|
|
|
|
if (getMountFlags() & MountFlags::kVisible) {
|
|
|
|
@ -155,19 +155,19 @@ status_t PublicVolume::doMount() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(getMountFlags() & MountFlags::kVisible)) {
|
|
|
|
|
// Not visible to apps, so no need to spin up FUSE
|
|
|
|
|
// Not visible to apps, so no need to spin up sdcardfs or FUSE
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fs_prepare_dir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mFuseFull.c_str(), 0700, AID_ROOT, AID_ROOT)) {
|
|
|
|
|
PLOG(ERROR) << getId() << " failed to create FUSE mount points";
|
|
|
|
|
if (fs_prepare_dir(mSdcardFsDefault.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mSdcardFsRead.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mSdcardFsWrite.c_str(), 0700, AID_ROOT, AID_ROOT) ||
|
|
|
|
|
fs_prepare_dir(mSdcardFsFull.c_str(), 0700, AID_ROOT, AID_ROOT)) {
|
|
|
|
|
PLOG(ERROR) << getId() << " failed to create sdcardfs mount points";
|
|
|
|
|
return -errno;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dev_t before = GetDevice(mFuseFull);
|
|
|
|
|
dev_t before = GetDevice(mSdcardFsFull);
|
|
|
|
|
|
|
|
|
|
bool isFuse = base::GetBoolProperty(kPropFuseSnapshot, false);
|
|
|
|
|
if (isFuse) {
|
|
|
|
@ -193,10 +193,11 @@ status_t PublicVolume::doMount() {
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(mFusePid = fork())) {
|
|
|
|
|
int sdcardFsPid;
|
|
|
|
|
if (!(sdcardFsPid = fork())) {
|
|
|
|
|
if (getMountFlags() & MountFlags::kPrimary) {
|
|
|
|
|
// clang-format off
|
|
|
|
|
if (execl(kFusePath, kFusePath,
|
|
|
|
|
if (execl(kSdcardFsPath, kSdcardFsPath,
|
|
|
|
|
"-u", "1023", // AID_MEDIA_RW
|
|
|
|
|
"-g", "1023", // AID_MEDIA_RW
|
|
|
|
|
"-U", std::to_string(getMountUserId()).c_str(),
|
|
|
|
@ -209,7 +210,7 @@ status_t PublicVolume::doMount() {
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// clang-format off
|
|
|
|
|
if (execl(kFusePath, kFusePath,
|
|
|
|
|
if (execl(kSdcardFsPath, kSdcardFsPath,
|
|
|
|
|
"-u", "1023", // AID_MEDIA_RW
|
|
|
|
|
"-g", "1023", // AID_MEDIA_RW
|
|
|
|
|
"-U", std::to_string(getMountUserId()).c_str(),
|
|
|
|
@ -221,29 +222,28 @@ status_t PublicVolume::doMount() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG(ERROR) << "FUSE exiting";
|
|
|
|
|
LOG(ERROR) << "sdcardfs exiting";
|
|
|
|
|
_exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mFusePid == -1) {
|
|
|
|
|
if (sdcardFsPid == -1) {
|
|
|
|
|
PLOG(ERROR) << getId() << " failed to fork";
|
|
|
|
|
return -errno;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME);
|
|
|
|
|
while (before == GetDevice(mFuseFull)) {
|
|
|
|
|
LOG(DEBUG) << "Waiting for FUSE to spin up...";
|
|
|
|
|
while (before == GetDevice(mSdcardFsFull)) {
|
|
|
|
|
LOG(DEBUG) << "Waiting for sdcardfs to spin up...";
|
|
|
|
|
usleep(50000); // 50ms
|
|
|
|
|
|
|
|
|
|
nsecs_t now = systemTime(SYSTEM_TIME_BOOTTIME);
|
|
|
|
|
if (nanoseconds_to_milliseconds(now - start) > 5000) {
|
|
|
|
|
LOG(WARNING) << "Timed out while waiting for FUSE to spin up";
|
|
|
|
|
LOG(WARNING) << "Timed out while waiting for sdcardfs to spin up";
|
|
|
|
|
return -ETIMEDOUT;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* sdcardfs will have exited already. FUSE will still be running */
|
|
|
|
|
TEMP_FAILURE_RETRY(waitpid(mFusePid, nullptr, 0));
|
|
|
|
|
mFusePid = 0;
|
|
|
|
|
/* sdcardfs will have exited already. The filesystem will still be running */
|
|
|
|
|
TEMP_FAILURE_RETRY(waitpid(sdcardFsPid, nullptr, 0));
|
|
|
|
|
|
|
|
|
|
return OK;
|
|
|
|
|
}
|
|
|
|
@ -283,22 +283,22 @@ status_t PublicVolume::doUnmount() {
|
|
|
|
|
|
|
|
|
|
ForceUnmount(kAsecPath);
|
|
|
|
|
|
|
|
|
|
ForceUnmount(mFuseDefault);
|
|
|
|
|
ForceUnmount(mFuseRead);
|
|
|
|
|
ForceUnmount(mFuseWrite);
|
|
|
|
|
ForceUnmount(mFuseFull);
|
|
|
|
|
ForceUnmount(mSdcardFsDefault);
|
|
|
|
|
ForceUnmount(mSdcardFsRead);
|
|
|
|
|
ForceUnmount(mSdcardFsWrite);
|
|
|
|
|
ForceUnmount(mSdcardFsFull);
|
|
|
|
|
ForceUnmount(mRawPath);
|
|
|
|
|
|
|
|
|
|
rmdir(mFuseDefault.c_str());
|
|
|
|
|
rmdir(mFuseRead.c_str());
|
|
|
|
|
rmdir(mFuseWrite.c_str());
|
|
|
|
|
rmdir(mFuseFull.c_str());
|
|
|
|
|
rmdir(mSdcardFsDefault.c_str());
|
|
|
|
|
rmdir(mSdcardFsRead.c_str());
|
|
|
|
|
rmdir(mSdcardFsWrite.c_str());
|
|
|
|
|
rmdir(mSdcardFsFull.c_str());
|
|
|
|
|
rmdir(mRawPath.c_str());
|
|
|
|
|
|
|
|
|
|
mFuseDefault.clear();
|
|
|
|
|
mFuseRead.clear();
|
|
|
|
|
mFuseWrite.clear();
|
|
|
|
|
mFuseFull.clear();
|
|
|
|
|
mSdcardFsDefault.clear();
|
|
|
|
|
mSdcardFsRead.clear();
|
|
|
|
|
mSdcardFsWrite.clear();
|
|
|
|
|
mSdcardFsFull.clear();
|
|
|
|
|
mRawPath.clear();
|
|
|
|
|
|
|
|
|
|
return OK;
|
|
|
|
|