| 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
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.