summaryrefslogtreecommitdiff
path: root/init/builtins.cpp
diff options
context:
space:
mode:
authorTom Cherry <tomcherry@google.com>2019-06-17 15:47:09 -0700
committerTom Cherry <tomcherry@google.com>2019-06-24 13:23:49 -0700
commit71bdf2820ee0fbf698840f84fdd1255dbf8d3aee (patch)
tree05a4ab73c56808bd3c2a5c2b5efb55e7e907ab53 /init/builtins.cpp
parent99087decb9c9bb63ea20e18f6fa5ccbcefe8cf2b (diff)
init: Handle properties in the background of calling fs_mgr
It's been a long standing problem that init calls fs_mgr functions synchronously and therefore stops handling properties, which causes deadlocks if either fs_mgr, or vdc, or vold attempt to set properties. Previous work, b/21904461, shows that there is a large performance penalty for adding any amount of locking to properties, so moving property service into its own thread generically is not a viable option. However, we can be sure that init is not setting properties while the fs_mgr functions are running, so we can poll the property socket in a thread while we call these functions. The other alternative would have been to separate the fs_mgr functions into smaller pieces and revisit the main init loop between each piece. Unfortunately, this would be difficult, since fs_mgr_mount_all() calls out to different processes via logwrapper, which synchronously polls on a logging FD from the child, among other complexities that would make this strategy much more difficult than it would be worth. Bug: 21904461 Test: device boots, including when setting property in fs_mgr_mount_all() Change-Id: Ib0b7123024035884f9d90f9b489c1e2f5a2e1707
Diffstat (limited to 'init/builtins.cpp')
-rw-r--r--init/builtins.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 44cac4b7d..d9b1b8530 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -588,7 +588,12 @@ static Result<void> do_mount_all(const BuiltinArguments& args) {
if (!ReadFstabFromFile(fstab_file, &fstab)) {
return Error() << "Could not read fstab";
}
- auto mount_fstab_return_code = fs_mgr_mount_all(&fstab, mount_mode);
+
+ auto mount_fstab_return_code =
+ CallFunctionAndHandleProperties(fs_mgr_mount_all, &fstab, mount_mode);
+ if (!mount_fstab_return_code) {
+ return Error() << "Could not call fs_mgr_mount_all(): " << mount_fstab_return_code.error();
+ }
property_set(prop_name, std::to_string(t.duration().count()));
if (import_rc && SelinuxGetVendorAndroidVersion() <= __ANDROID_API_Q__) {
@@ -599,7 +604,7 @@ static Result<void> do_mount_all(const BuiltinArguments& args) {
if (queue_event) {
/* queue_fs_event will queue event based on mount_fstab return code
* and return processed return code*/
- auto queue_fs_result = queue_fs_event(mount_fstab_return_code);
+ auto queue_fs_result = queue_fs_event(*mount_fstab_return_code);
if (!queue_fs_result) {
return Error() << "queue_fs_event() failed: " << queue_fs_result.error();
}
@@ -615,8 +620,13 @@ static Result<void> do_umount_all(const BuiltinArguments& args) {
return Error() << "Could not read fstab";
}
- if (auto result = fs_mgr_umount_all(&fstab); result != 0) {
- return Error() << "umount_fstab() failed " << result;
+ auto result = CallFunctionAndHandleProperties(fs_mgr_umount_all, &fstab);
+ if (!result) {
+ return Error() << "Could not call fs_mgr_mount_all() " << result.error();
+ }
+
+ if (*result != 0) {
+ return Error() << "fs_mgr_mount_all() failed: " << *result;
}
return {};
}
@@ -627,8 +637,13 @@ static Result<void> do_swapon_all(const BuiltinArguments& args) {
return Error() << "Could not read fstab '" << args[1] << "'";
}
- if (!fs_mgr_swapon_all(fstab)) {
- return Error() << "fs_mgr_swapon_all() failed";
+ auto result = CallFunctionAndHandleProperties(fs_mgr_swapon_all, fstab);
+ if (!result) {
+ return Error() << "Could not call fs_mgr_swapon_all() " << result.error();
+ }
+
+ if (*result == 0) {
+ return Error() << "fs_mgr_swapon_all() failed.";
}
return {};