Damien Zammit
unread,Jul 26, 2020, 3:37:47 AM7/26/20You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to bug-...@gnu.org, Damien Zammit
---
libdiskfs/boot-start.c | 11 +++++++
libdiskfs/init-startup.c | 64 +++++++++++++++++++++++++---------------
2 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c
index 29b8acc6..4fbd62c5 100644
--- a/libdiskfs/boot-start.c
+++ b/libdiskfs/boot-start.c
@@ -518,7 +518,9 @@ diskfs_S_fsys_init (struct diskfs_control *pt,
if (diskfs_exec_server_task != MACH_PORT_NULL)
{
+ mach_port_t bootstrap;
process_t execprocess;
+
err = proc_task2proc (procserver, diskfs_exec_server_task, &execprocess);
assert_perror_backtrace (err);
@@ -531,7 +533,16 @@ diskfs_S_fsys_init (struct diskfs_control *pt,
HURD_PORT_USE (&_diskfs_exec_portcell,
exec_init (port, authhandle,
execprocess, MACH_MSG_TYPE_COPY_SEND));
+
+ /* Give the real bootstrap filesystem an fsys_init
+ RPC of its own, as init would have sent it. */
+ err = task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ assert_perror_backtrace (err);
+ err = fsys_init (bootstrap, execprocess, MACH_MSG_TYPE_COPY_SEND,
+ authhandle);
mach_port_deallocate (mach_task_self (), execprocess);
+ mach_port_deallocate (mach_task_self (), bootstrap);
+ assert_perror_backtrace (err);
/* We don't need this anymore. */
mach_port_deallocate (mach_task_self (), diskfs_exec_server_task);
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
index a2e3638d..d28a49a1 100644
--- a/libdiskfs/init-startup.c
+++ b/libdiskfs/init-startup.c
@@ -32,12 +32,35 @@
char *_diskfs_chroot_directory;
-mach_port_t
-diskfs_startup_diskfs (mach_port_t bootstrap, int flags)
+static void
+diskfs_call_fsys_startup (mach_port_t bootstrap, int flags,
+ mach_port_t *realnode)
{
error_t err;
- mach_port_t realnode, right;
struct port_info *newpi;
+ mach_port_t right;
+
+ err = ports_create_port (diskfs_control_class, diskfs_port_bucket,
+ sizeof (struct port_info), &newpi);
+ if (! err)
+ {
+ right = ports_get_send_right (newpi);
+ err = fsys_startup (bootstrap, flags, right,
+ MACH_MSG_TYPE_COPY_SEND, realnode);
+ mach_port_deallocate (mach_task_self (), right);
+ ports_port_deref (newpi);
+ }
+ if (err)
+ error (1, err, "Translator startup failure: fsys_startup");
+
+ _diskfs_ncontrol_ports++;
+}
+
+mach_port_t
+diskfs_startup_diskfs (mach_port_t fs_bootstrap, int flags)
+{
+ error_t err;
+ mach_port_t realnode, bootstrap;
if (_diskfs_chroot_directory != NULL)
{
@@ -88,32 +111,27 @@ diskfs_startup_diskfs (mach_port_t bootstrap, int flags)
diskfs_nput (old);
}
- if (bootstrap != MACH_PORT_NULL)
+ if (fs_bootstrap == MACH_PORT_NULL)
{
- err = ports_create_port (diskfs_control_class, diskfs_port_bucket,
- sizeof (struct port_info), &newpi);
- if (! err)
- {
- right = ports_get_send_right (newpi);
- err = fsys_startup (bootstrap, flags, right,
- MACH_MSG_TYPE_COPY_SEND, &realnode);
- mach_port_deallocate (mach_task_self (), right);
- ports_port_deref (newpi);
- }
- if (err)
- error (1, err, "Translator startup failure: fsys_startup");
+ realnode = MACH_PORT_NULL;
- mach_port_deallocate (mach_task_self (), bootstrap);
- _diskfs_ncontrol_ports++;
+ /* We are the bootstrap filesystem; do special boot-time setup. */
+ diskfs_start_bootstrap ();
- _diskfs_init_completed ();
+ /* If we have a bootstrap port we must call fsys_startup */
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap != MACH_PORT_NULL)
+ {
+ diskfs_call_fsys_startup (bootstrap, flags, &realnode);
+ mach_port_deallocate (mach_task_self (), bootstrap);
+ }
}
else
{
- realnode = MACH_PORT_NULL;
-
- /* We are the bootstrap filesystem; do special boot-time setup. */
- diskfs_start_bootstrap ();
+ /* We do the startup from filesystem's bootstrap */
+ diskfs_call_fsys_startup (fs_bootstrap, flags, &realnode);
+ mach_port_deallocate (mach_task_self (), fs_bootstrap);
+ _diskfs_init_completed ();
}
if (diskfs_default_sync_interval)
--
2.25.1