Subject: Re: Where/how is rootvp set in kernel initialisation?
To: None <>
From: Bill Studenmund <>
List: tech-kern
Date: 09/19/2000 12:57:45
On Tue, 19 Sep 2000 wrote:

> Background: I am the maintainer of the Booter program for the Mac68k
> 	    port, and I am trying to build a MacOS program which uses
> 	    the actual kernel code for doing FFS volume manipulation
> 	    (instead of the hacked old UFS code it uses now).


> Status: I have a few libraries of the relevant files from the syssrc
> 	archive, and a hacked together main. When my main does the
> 	guts of vfs_mountroot(), it accesses non-existant memory when
> 	ffs_mountroot() calls ffs_mountfs() with rootvp.
> 	(basically, vinvalbuf() does a VSYNC, but because
> 	 rootvp is not set to anything but NULL, v_op is invalid)

The routine you need to look at is in ffs_mountroot(). A few lines above
the ffs_mountfs() call is a call to bdevvp(rootdev, &rootvp);. That's the
call which will set up rootvp. Make sure it works right, and you'll have a
good vnode. bdevvp() will call into kern/vfs_subr.c and you'll need files
from miscfs/specfs so that spec_vnode_p is set up. Then the v_op table
will be ok.

> 	I have searched through the kernel source, and these are the
> only three places that seem to set rootvp:
> coda_vfsops.c   : coda_mount()

Note that there is a local variable in this routine named rootvp, so it's
not changing the global rootvp. :-)

> vfs_getcwd.c    : sys___getcwd()

As best I could tell, this one was just reading rootvp. ??

> kernfs_vfsops.c : kernfs_unmount()

This one too has a local variable for rootvp. I think both it and the coda
code are refering to the root of the file system, not the system's overall
root vnode.

> 	Assuming that I haven't stuffed up in my searching,
> which of these is called (indirectly) from init_main(), and why ?

You'll need to make sure that your init_main() has the vfs initialization
in it, then all should be well.

Take care,