diff options
author | Tom Cherry <tomcherry@google.com> | 2019-06-17 15:47:09 -0700 |
---|---|---|
committer | Tom Cherry <tomcherry@google.com> | 2019-06-24 13:23:49 -0700 |
commit | 71bdf2820ee0fbf698840f84fdd1255dbf8d3aee (patch) | |
tree | 05a4ab73c56808bd3c2a5c2b5efb55e7e907ab53 /init/builtins.cpp | |
parent | 99087decb9c9bb63ea20e18f6fa5ccbcefe8cf2b (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.cpp | 27 |
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 {}; |