Newsgroup: mailing.netbsd.tech.kern


Received: from smtp1.google.com (smtp1.google.com [216.239.33.27])
by aueb.gr (8.8.5/8.8.5) with ESMTP id UAA06394
for <dds@aueb.gr>; Tue, 12 Mar 2002 20:20:46 +0200 (EET)
Received: from sjins1.sj.google.com ([216.239.35.4])
by smtp1.google.com with ESMTP id KAA09604
for <dds@aueb.gr>; Tue, 12 Mar 2002 10:20:47 -0800
Received: from sjdd43.sj.google.com (sjdd43.prod.google.com [10.6.30.43])
by sjins1.sj.google.com (8.9.3/8.9.3) with ESMTP id KAA00981
for <dds@aueb.gr>; Tue, 12 Mar 2002 10:20:42 -0800
Received: (from root@localhost)
by sjdd43.sj.google.com (8.9.3/8.9.3) id KAA09166;
Tue, 12 Mar 2002 10:20:42 -0800
From: posting-system@google.com
Date: Tue, 12 Mar 2002 10:20:42 -0800
Message-ID: <1af18db.0203121020.270a07c1@posting.google.com>
Reply-To: posting-system@google.com
To: dds@aueb.gr
Subject: Calling device-driver strategy routines
Errors-To: posting-system@google.com
Mime-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=ISO-8859-1
From: dds@aueb.gr (Diomidis Spinellis)
Newsgroups: mailing.netbsd.tech.kern,comp.unix.bsd.misc,comp.unix.bsd.netbsd.misc
Subject: Calling device-driver strategy routines
NNTP-Posting-Host: 195.251.255.250
Message-ID: <1af18db.0203121020.7d38fa1b@posting.google.com>
Greetings,

I am trying to understand how block device read/write calls
communicate with the respective device driver strategy routines.
After a day of digging in both directions and in Bach and
Leffler I fail to find the common link; perhaps a kind
soul will enlighten me.

Tracing the call sequence from top to bottom for an ext2fs file
I end-up with a call to ufs_strategy with vp pointing to the
original vnode which will result in a series of further recursive 
calls to ufs_strategy.  

The sequence (in NetBSD 1.5) as I understand it is:

sys_generic.c:sys_write(...)

vfs_vnops:vn_write(...)

vnode_if.c:VOP_WRITE(vp, uio, ioflag, cred) {
	a.a_vp = vp;
	return (VCALL(vp, VOFFSET(vop_write), &a));

ext2fs_readwrite.c:ext2fs_write(v) {
	*ap = v;
	vp = ap->a_vp;
	ip = VTOI(vp)
	bp can be allocated by ext2fs_balloc(ip, ...)
		vp = ITOV(ip)
		which calls getblk(vp, ...)
			which using bgetvp(vp, bp) sets 
				bp->b_vp = vp;

vfs_bio.c:bwrite(bp) {
	VOP_STRATEGY(bp);

vnode_if.h:VOP_STRATEGY(bp) {
	a.a_bp = bp;
	return (VCALL(bp->b_vp, VOFFSET(vop_strategy), &a));

#define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP))
#define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP))

ext2fs_vnops.c: { &vop_strategy_desc, ufs_strategy },

ufs_vnops.c:ufs_strategy(v)
	*ap = v;
	register struct buf *bp = ap->a_bp;
	register struct vnode *vp = bp->b_vp;
	VOCALL (vp->v_op, VOFFSET(vop_strategy), ap);

I then tried to go in the opposite direction.  The e.g. SCSI
strategy routine is stored as a pointer in a dk_driver structure
field. I grepped through the kernel source looking for it but 
could not find the point where this pointer is called or assigned
to another variable.

I am completely puzzled and will appreciate any help or just a
pointer to where I should look.

Thanks,

Diomidis - http://www.dmst.aueb.gr/dds



Newsgroup mailing.netbsd.tech.kern contents
Newsgroup list
Diomidis Spinellis home page

Creative Commons License Unless otherwise expressly stated, all original material on this page created by Diomidis Spinellis is licensed under a Creative Commons Attribution-Share Alike 3.0 Greece License.