Date: Fri, 23 Apr 1999 01:10:24 +0800 From: Peter Wemm <peter@netplex.com.au> To: Zhihui Zhang <zzhang@cs.binghamton.edu> Cc: freebsd-hackers@freebsd.org Subject: Re: VFS initialization in FreeBSD 3.1 Message-ID: <19990422171026.3E83F1F49@spinner.netplex.com.au> In-Reply-To: Your message of "Thu, 22 Apr 1999 10:02:09 -0400." <Pine.GSO.3.96.990422095440.5541A-100000@sol.cs.binghamton.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
Zhihui Zhang wrote:
>
> I am trying to understand how VFS gets initialized in FreeBSD 3.1. In
> FreeBSD 2.2.8, the file vnode_if.c is created by vnode_if.sh. At the end
> of vnode_if.c, there is the following array:
>
> struct vnodeop_desc *vfs_op_descs[] = {......}
>
> This array will be traversed by vfs_op_init() (does not exist in FreeBSD
> 3.1) and the number of vnode operations is thus determined to be 44 in
> FreeBSD 2.2.8.
>
> In FreeBSD 3.1, however, I can not find where the vfs_op_descs is
> initialized. It seems to be initialized in vfs_add_vnodeops(), which is
> in turn called by some LKM routine. Is VFS initialized by LKM mechanism in
> FreeBSD 3.1. I expect all system initialization is done by SYSINIT() or
> SYSINIT_KT() macros as in FreeBSD 2.2.8. I hope some guru can give me
> some enlightment.
It's initiallized dynamically, via the VNODEOP_SET() macro:
/* Global vfs data structures for ufs. */
static vop_t **ufs_vnodeop_p;
static struct vnodeopv_entry_desc ufs_vnodeop_entries[] = {
{ &vop_default_desc, (vop_t *) vop_defaultop },
{ &vop_fsync_desc, (vop_t *) ufs_missingop },
{ &vop_read_desc, (vop_t *) ufs_missingop },
[..]
{ &vop_whiteout_desc, (vop_t *) ufs_whiteout },
{ NULL, NULL }
};
static struct vnodeopv_desc ufs_vnodeop_opv_desc =
{ &ufs_vnodeop_p, ufs_vnodeop_entries };
[..]
VNODEOP_SET(ufs_vnodeop_opv_desc);
VNODEOP_SET() arranges for a SYSINIT() to call the add/remove functions at
kernel boot and/or module load/unload times.
The VOP_*() vectors are 100% dynamic now - but there's a fair bit of
torture to get this to fly. You can add *new* VOP's on the fly and they
will correctly pass through stacked layers, assuming the stacking works
right. :-)
VNODEOP_SET() is a legacy name from when this was all implemented with
linker sets. This will go away and will get a proper name somewhere along
the line now that LKM mechanism has gone from 4.0-current and been replaced
with kld modules managed by the boot loader and the in-kernel linker.
Cheers,
-Peter
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990422171026.3E83F1F49>
