Module Name: src Committed By: christos Date: Tue Apr 8 17:56:10 UTC 2014
Modified Files: src/sys/miscfs/kernfs: kernfs_subr.c kernfs_vnops.c Log Message: >From Ilya Zykov: Unbreak kernfs which was broken by this commit |Make the spec_node table implementation private to spec_vnops.c. |To retrieve a spec_node, two new lookup functions (by device or by mount) |are implemented. Both return a referenced vnode, for an opened block device |the opened vnode is returned so further diagnostic checks "vp == ... sd_bdevvp" |will not fire. Otherwise any vnode matching the criteria gets returned. |No objections on tech-kern. The effect was that ls /kernfs appeared empty in most cases. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/miscfs/kernfs/kernfs_subr.c cvs rdiff -u -r1.150 -r1.151 src/sys/miscfs/kernfs/kernfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/kernfs/kernfs_subr.c diff -u src/sys/miscfs/kernfs/kernfs_subr.c:1.26 src/sys/miscfs/kernfs/kernfs_subr.c:1.27 --- src/sys/miscfs/kernfs/kernfs_subr.c:1.26 Thu Feb 27 11:51:38 2014 +++ src/sys/miscfs/kernfs/kernfs_subr.c Tue Apr 8 13:56:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_subr.c,v 1.26 2014/02/27 16:51:38 hannken Exp $ */ +/* $NetBSD: kernfs_subr.c,v 1.27 2014/04/08 17:56:10 christos Exp $ */ /* * Copyright (c) 1993 @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kernfs_subr.c,v 1.26 2014/02/27 16:51:38 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kernfs_subr.c,v 1.27 2014/04/08 17:56:10 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -88,6 +88,7 @@ __KERNEL_RCSID(0, "$NetBSD: kernfs_subr. #include <sys/mount.h> #include <miscfs/kernfs/kernfs.h> +#include <miscfs/specfs/specdev.h> void kernfs_hashins(struct kernfs_node *); void kernfs_hashrem(struct kernfs_node *); @@ -147,32 +148,6 @@ kernfs_allocvp(struct mount *mp, struct return (0); } - if (kfs_type == KFSdevice) { - /* /kern/rootdev = look for device and obey */ - /* /kern/rrootdev = look for device and obey */ - dev_t *dp; - struct vnode *fvp; - -#ifdef DIAGNOSTIC - if (!kt) - panic("kernfs: kt == NULL for KFSdevice"); -#endif - dp = kt->kt_data; - loop: - if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp)) { - mutex_exit(&kfs_hashlock); - return (ENOENT); - } - vp = fvp; - if (vn_lock(fvp, LK_EXCLUSIVE)) { - vrele(fvp); - goto loop; - } - *vpp = vp; - mutex_exit(&kfs_hashlock); - return (0); - } - error = getnewvnode(VT_KERNFS, mp, kernfs_vnodeop_p, NULL, &vp); if (error) { *vpp = NULL; @@ -220,6 +195,10 @@ again: if (kfs_type == KFSkern) vp->v_vflag = VV_ROOT; + if (kfs_type == KFSdevice) { + spec_node_init(vp, *(dev_t *)kt->kt_data); + } + kernfs_hashins(kfs); uvm_vnp_setsize(vp, 0); mutex_exit(&kfs_hashlock); Index: src/sys/miscfs/kernfs/kernfs_vnops.c diff -u src/sys/miscfs/kernfs/kernfs_vnops.c:1.150 src/sys/miscfs/kernfs/kernfs_vnops.c:1.151 --- src/sys/miscfs/kernfs/kernfs_vnops.c:1.150 Fri Feb 7 10:29:22 2014 +++ src/sys/miscfs/kernfs/kernfs_vnops.c Tue Apr 8 13:56:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_vnops.c,v 1.150 2014/02/07 15:29:22 hannken Exp $ */ +/* $NetBSD: kernfs_vnops.c,v 1.151 2014/04/08 17:56:10 christos Exp $ */ /* * Copyright (c) 1992, 1993 @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.150 2014/02/07 15:29:22 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.151 2014/04/08 17:56:10 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -59,6 +59,7 @@ __KERNEL_RCSID(0, "$NetBSD: kernfs_vnops #include <miscfs/genfs/genfs.h> #include <miscfs/kernfs/kernfs.h> +#include <miscfs/specfs/specdev.h> #include <uvm/uvm_extern.h> @@ -653,6 +654,11 @@ kernfs_getattr(void *v) vap->va_bytes = vap->va_size = DEV_BSIZE; break; + case KFSdevice: + vap->va_nlink = 1; + vap->va_rdev = ap->a_vp->v_rdev; + break; + case KFSroot: vap->va_nlink = 1; vap->va_bytes = vap->va_size = DEV_BSIZE; @@ -670,7 +676,6 @@ kernfs_getattr(void *v) case KFSstring: case KFShostname: case KFSavenrun: - case KFSdevice: case KFSmsgbuf: vap->va_nlink = 1; total = 0; @@ -832,18 +837,8 @@ kernfs_setdirentfileno_kt(struct dirent if ((error = kernfs_allocvp(ap->a_vp->v_mount, &vp, kt->kt_tag, kt, value)) != 0) return error; - if (kt->kt_tag == KFSdevice) { - struct vattr va; - - error = VOP_GETATTR(vp, &va, ap->a_cred); - if (error != 0) { - return error; - } - d->d_fileno = va.va_fileid; - } else { - kfs = VTOKERN(vp); - d->d_fileno = kfs->kfs_fileno; - } + kfs = VTOKERN(vp); + d->d_fileno = kfs->kfs_fileno; vput(vp); return 0; }