Subject: VOP_* changes?
To: None <tech-kern@netbsd.org>
From: Darren Reed <darrenr@reed.wattle.id.au>
List: tech-kern
Date: 01/29/2002 13:14:34
In all the filesystem stuff that has been changing recently, have there
been any changes which would have had a noticable affect on anyone using
the VOP_* macros ?

The background to this is I was testing IPFilter as an LKM on 1.5Z last
week and it "hung" the disk I/O system.  (Or that was the appearance of
it anyway, given keyboard was active but ctl-alt-esc to ddb never showed
anything useful, to me).

How does IPFilter use the VOP_* macros?  Like this:

(1) Remove existing files in /dev

                NDINIT(&nd, DELETE, LOCKPARENT, UIO_SYSSPACE, name, curproc);
                if ((error = namei(&nd)))
                        return (error);
                VOP_LEASE(nd.ni_vp, curproc, curproc->p_ucred, LEASE_WRITE);
                vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY);
                VOP_LEASE(nd.ni_dvp, curproc, curproc->p_ucred, LEASE_WRITE);
                (void) VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);

(2) Create new files in /dev

                NDINIT(&nd, CREATE, LOCKPARENT, UIO_SYSSPACE, name, curproc);
                if ((error = namei(&nd)))
                        return error;
                if (nd.ni_vp != NULL) {
                        VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);
                        if (nd.ni_dvp == nd.ni_vp)
                                vrele(nd.ni_dvp);
                        else
                                vput(nd.ni_dvp);
                        vrele(nd.ni_vp);
                        return (EEXIST);
                }
                VATTR_NULL(&vattr);
                vattr.va_type = VCHR;
                vattr.va_mode = (fmode & 07777);
                vattr.va_rdev = (ipl_major << 8) | i;
                VOP_LEASE(nd.ni_dvp, curproc, curproc->p_ucred, LEASE_WRITE);
                error = VOP_MKNOD(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr);

What'd be really nice would be an equivalent to this in Solaris:

                ddi_create_minor_node(dip, "ipf", S_IFCHR, IPL_LOGIPF,
                                      DDI_PSEUDO, 0)
                ddi_create_minor_node(dip, "ipnat", S_IFCHR, IPL_LOGNAT,
                                      DDI_PSEUDO, 0)

Darren