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;
 }

Reply via email to