Mount /dev/fuse on /mnt/user/<userid>/<volumeid>
Since system_server cannot mount devices by itself,
add a binder interface to vold that system_server
can call to initiate this mount when required.
BUG: 135341433
Test: manual
Test: atest --test-mapping packages/providers/MediaProvider
Test: ExternalStorageHostTest DownloadProviderTests
Change-Id: If4fd02a1f1a8d921a3f96783d8c73e085c5b7ca1
diff --git a/VoldNativeService.cpp b/VoldNativeService.cpp
index 1762b70..9004b40 100644
--- a/VoldNativeService.cpp
+++ b/VoldNativeService.cpp
@@ -326,7 +326,8 @@
}
binder::Status VoldNativeService::mount(const std::string& volId, int32_t mountFlags,
- int32_t mountUserId) {
+ int32_t mountUserId,
+ android::base::unique_fd* _aidl_return) {
ENFORCE_UID(AID_SYSTEM);
CHECK_ARGUMENT_ID(volId);
ACQUIRE_LOCK;
@@ -343,6 +344,14 @@
if (res != OK) {
return translate(res);
}
+
+ _aidl_return->reset(vol->getDeviceFd());
+ if (_aidl_return->get() == -1) {
+ // Let's not return invalid fd since binder will not allow null fds. Instead give it a
+ // default value.
+ _aidl_return->reset(open("/dev/null", O_RDONLY | O_CLOEXEC));
+ }
+
if ((mountFlags & MOUNT_FLAG_PRIMARY) != 0) {
res = VolumeManager::Instance()->setPrimary(vol);
if (res != OK) {