David Gnedt: Thanks for your patch! I had to think moderately hard about whether nih_main_loop_exit always gets called eventually. I think there is one case where it does not get called. Consider this sequence of events:
* All filesystems but one get successfully mounted, with a remote mount process outstanding
* try_mounts returns since newly_mounted is false and there's still a child watch
* The remote mount fails, so the remote mount process exits non-zero
* spawn_child_handler calls run_mount_finished with status != 0
* run_mount_finished returns more or less immediately without doing anything that might set newly_mounted to true
As far as I can see, mountall will now be hung, which will hang the boot process. If you agree with this analysis, perhaps try_mounts needs to be adjusted to cope with this case?
David Gnedt: Thanks for your patch! I had to think moderately hard about whether nih_main_loop_exit always gets called eventually. I think there is one case where it does not get called. Consider this sequence of events:
* All filesystems but one get successfully mounted, with a remote mount process outstanding
* try_mounts returns since newly_mounted is false and there's still a child watch
* The remote mount fails, so the remote mount process exits non-zero
* spawn_child_handler calls run_mount_finished with status != 0
* run_mount_finished returns more or less immediately without doing anything that might set newly_mounted to true
As far as I can see, mountall will now be hung, which will hang the boot process. If you agree with this analysis, perhaps try_mounts needs to be adjusted to cope with this case?