Pantek Library
Hosting Provided By
CybrHost
High Speed Hosting

kernel/2947: kernfs cleanup

From: <peterw(at)ifost.org.au>
Date: Fri Oct 04 2002 - 12:30:44 EDT

>Number:         2947
>Category:       kernel
>Synopsis:       kernfs cleanup
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Nov 07 13:17:22 MST 2002
>Closed-Date:
>Last-Modified:
>Originator:     Peter Werner
>Release:        OpenBSD-current
>Organization:

http://www.ifost.org.au
>Environment:
	System      : OpenBSD 3.2-beta
	Architecture: OpenBSD.i386
	Machine     : i386

>Description:

this is a cleanup of kernfs, it makes it so all the vnode operations are in kernfs_vnops.c, the vfs operations kernfs_vfsop.c and the rest get put in kernfs_subr.c. this keeps its layout similar to the other filesystems. it also makes sure it hasnt slept in MALLOC and about to insert a duplicate entry in its vnode cache.

>How-To-Repeat:
n/a
>Fix:

diff -urN --exclude=CVS /usr/src/sys/miscfs/kernfs/kernfs.h sys/miscfs/kernfs/kernfs.h

--- /usr/src/sys/miscfs/kernfs/kernfs.h	Thu Mar 14 01:27:08 2002

+++ sys/miscfs/kernfs/kernfs.h Fri Oct 4 16:15:00 2002
@@ -97,9 +97,17 @@ #define kernfs_checkexp ((int (*)(struct mount *, struct mbuf *, \ int *, struct ucred **))eopnotsupp) -int kernfs_init(struct vfsconf *);
+struct vnode *kernfs_node_find(struct kern_target *, struct mount *, \
+ struct proc *);
int kernfs_allocvp(struct kern_target *, struct mount *, struct vnode **);
+int kernfs_xread(struct kern_target *, int, char **, int);
+int kernfs_xwrite(struct kern_target *, char *, int);
+int kernfs_freevp(struct vnode *, struct proc *);
+int kernfs_listinit(void);
+void kernfs_get_rrootdev(void);
+
struct kern_target *kernfs_findtarget(char *, int);

+

 extern int (**kernfs_vnodeop_p)(void *);  extern struct vfsops kernfs_vfsops;
 extern dev_t rrootdev;
diff -urN --exclude=CVS /usr/src/sys/miscfs/kernfs/kernfs_subr.c sys/miscfs/kernfs/kernfs_subr.c
--- /usr/src/sys/miscfs/kernfs/kernfs_subr.c	Thu Jan  1 01:00:00 1970

+++ sys/miscfs/kernfs/kernfs_subr.c Fri Oct 4 16:25:49 2002
@@ -0,0 +1,431 @@
+/* $OpenBSD: kernfs_vnops.c,v 1.27 2002/03/14 20:31:31 mickey Exp $ */
+/* $NetBSD: kernfs_vnops.c,v 1.43 1996/03/16 23:52:47 christos Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
diff -urN --exclude=CVS /usr/src/sys/miscfs/kernfs/kernfs_vfsops.c sys/miscfs/kernfs/kernfs_vfsops.c
--- /usr/src/sys/miscfs/kernfs/kernfs_vfsops.c	Thu Mar 14 01:27:08 2002

+++ sys/miscfs/kernfs/kernfs_vfsops.c Fri Oct 4 15:33:46 2002
@@ -45,7 +45,6 @@  
 #include <sys/param.h>
 #include <sys/systm.h>
-#include <sys/conf.h>
 #include <sys/types.h>
 #include <sys/proc.h>
 #include <sys/vnode.h>

@@ -58,37 +57,19 @@
 #include <miscfs/specfs/specdev.h>
 #include <miscfs/kernfs/kernfs.h>  
-dev_t rrootdev = NODEV;
-
-void	kernfs_get_rrootdev(void);
 int	kernfs_mount(struct mount *, const char *, void *, struct nameidata *,
 			  struct proc *);
 int	kernfs_start(struct mount *, int, struct proc *);
 int	kernfs_unmount(struct mount *, int, struct proc *);
 int	kernfs_root(struct mount *, struct vnode **);
 int	kernfs_statfs(struct mount *, struct statfs *, struct proc *);

+int kernfs_init(struct vfsconf *);

-void
-kernfs_get_rrootdev()
+int
+kernfs_init(v)
+ struct vfsconf *v;

 {

-	static int tried = 0;
-	int cmaj;
-
-	if (tried) {
-		/* Already did it once. */
-		return;
Do you need help?X
- } - tried = 1; - - if (rootdev == NODEV) - return; - for (cmaj = 0; cmaj < nchrdev; cmaj++) { - rrootdev = makedev(cmaj, minor(rootdev)); - if (chrtoblk(rrootdev) == rootdev) - return; - } - rrootdev = NODEV; - printf("kernfs_get_rrootdev: no raw root device\n");
+ return(kernfs_listinit());

 }  

 /*
diff -urN --exclude=CVS /usr/src/sys/miscfs/kernfs/kernfs_vnops.c sys/miscfs/kernfs/kernfs_vnops.c

--- /usr/src/sys/miscfs/kernfs/kernfs_vnops.c	Thu Mar 14 20:31:31 2002

+++ sys/miscfs/kernfs/kernfs_vnops.c Fri Oct 4 16:26:02 2002
@@ -64,58 +64,8 @@  
 #define KSTRING	256		/* Largest I/O available via this filesystem */
 #define	UIO_MX 32
-
-#define	READ_MODE	(S_IRUSR|S_IRGRP|S_IROTH)
-#define	WRITE_MODE	(S_IWUSR|READ_MODE)
-#define DIR_MODE	(S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
-
-static int	byteorder = BYTE_ORDER;
-static int	posix = _POSIX_VERSION;
-static int	osrev = OpenBSD;
-static int	ncpu = 1;	/* XXX */
-extern char machine[], cpu_model[];
-
-#ifdef IPSEC
-extern int ipsp_kern(int, char **, int);
-#endif
-
-struct kern_target kern_targets[] = {
-/* NOTE: The name must be less than UIO_MX-16 chars in length */
-#define N(s) sizeof(s)-1, s
-     /*        name            data          tag           type  ro/rw */
-     { DT_DIR, N("."),         0,            KTT_NULL,     VDIR, DIR_MODE   },
-     { DT_DIR, N(".."),        0,            KTT_NULL,     VDIR, DIR_MODE   },
-     { DT_REG, N("boottime"),  &boottime.tv_sec, KTT_INT,  VREG, READ_MODE  },
-     { DT_REG, N("byteorder"), &byteorder,   KTT_INT,      VREG, READ_MODE  },
-     { DT_REG, N("copyright"), (void*)copyright,KTT_STRING,   VREG, READ_MODE  },
-     { DT_REG, N("hostname"),  0,            KTT_HOSTNAME, VREG, WRITE_MODE },
-     { DT_REG, N("domainname"),0,            KTT_DOMAIN,   VREG, WRITE_MODE },
-     { DT_REG, N("hz"),        &hz,          KTT_INT,      VREG, READ_MODE  },
Do you need more help?X
- { DT_REG, N("loadavg"), 0, KTT_AVENRUN, VREG, READ_MODE }, - { DT_REG, N("machine"), machine, KTT_STRING, VREG, READ_MODE }, - { DT_REG, N("model"), cpu_model, KTT_STRING, VREG, READ_MODE }, - { DT_REG, N("msgbuf"), 0, KTT_MSGBUF, VREG, READ_MODE }, - { DT_REG, N("ncpu"), &ncpu, KTT_INT, VREG, READ_MODE }, - { DT_REG, N("ostype"), (void*)&ostype,KTT_STRING, VREG, READ_MODE }, - { DT_REG, N("osrelease"), (void*)&osrelease,KTT_STRING,VREG, READ_MODE }, - { DT_REG, N("osrev"), &osrev, KTT_INT, VREG, READ_MODE }, - { DT_REG, N("pagesize"), &uvmexp.pagesize, KTT_INT, VREG, READ_MODE }, - { DT_REG, N("physmem"), &physmem, KTT_PHYSMEM, VREG, READ_MODE }, - { DT_REG, N("posix"), &posix, KTT_INT, VREG, READ_MODE }, -#if 0 - { DT_DIR, N("root"), 0, KTT_NULL, VDIR, DIR_MODE }, -#endif - { DT_BLK, N("rootdev"), &rootdev, KTT_DEVICE, VBLK, READ_MODE }, - { DT_CHR, N("rrootdev"), &rrootdev, KTT_DEVICE, VCHR, READ_MODE }, - { DT_REG, N("time"), 0, KTT_TIME, VREG, READ_MODE }, - { DT_REG, N("usermem"), 0, KTT_USERMEM, VREG, READ_MODE }, - { DT_REG, N("version"), (void*)version,KTT_STRING, VREG, READ_MODE }, -#ifdef IPSEC - { DT_REG, N("ipsec"), 0, KTT_IPSECSPI, VREG, READ_MODE }, -#endif -#undef N

-};
-static int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]);
+extern struct kern_target kern_targets[];
+extern int nkern_targets;
 

 int kernfs_badop(void *);  

@@ -160,10 +110,6 @@

 #define	kernfs_update	eopnotsupp
 #define	kernfs_bwrite	eopnotsupp
 
-int	kernfs_xread(struct kern_target *, int, char **, int);
-int	kernfs_xwrite(struct kern_target *, char *, int);
-int	kernfs_freevp(struct vnode *, struct proc *);
-
 int (**kernfs_vnodeop_p)(void *);
 struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = {
Can we help you?X

         { &vop_default_desc, vn_default_error }, @@ -206,267 +152,6 @@
 struct vnodeopv_desc kernfs_vnodeop_opv_desc =

         { &kernfs_vnodeop_p, kernfs_vnodeop_entries };  

-TAILQ_HEAD(, kernfs_node) kfshead;
Can't find what you're looking for?X
-static struct lock kfscache_lock; - -int -kernfs_init(vfsp) - struct vfsconf *vfsp; -{ - lockinit(&kfscache_lock, PVFS, "kfs", 0, 0); - TAILQ_INIT(&kfshead); - return(0); -} - -int -kernfs_allocvp(kt, mp, vpp) - struct kern_target *kt; - struct mount *mp; - struct vnode **vpp; -{ - struct proc *p = curproc; - struct kernfs_node *kf; - struct vnode *vp; - int error = 0; - -#ifdef KERNFS_DIAGNOSTIC - /* this should never happen */ - if (kt == NULL) - panic("kernfs_allocvp passed NULL kt, mp %p, vpp %p!\n", mp, vpp); - - printf("kernfs_allocvp: looking for %s\n", kt->kt_name); -#endif - if ((error = lockmgr(&kfscache_lock, LK_EXCLUSIVE, NULL, p)) != 0) - return(error); - -loop: - for (kf = TAILQ_FIRST(&kfshead); kf != NULL; kf = TAILQ_NEXT(kf, list)) { - vp = KERNTOV(kf); - if (vp->v_mount == mp && kt->kt_namlen == kf->kf_namlen && - bcmp(kf->kf_name, kt->kt_name, kt->kt_namlen) == 0) { -#ifdef KERNFS_DIAGNOSTIC - printf("kernfs_allocvp: hit %s\n", kt->kt_name); -#endif - if (vget(vp, 0, p)) - goto loop; - *vpp = vp; - goto out; - } - } - - MALLOC(kf, void *, sizeof(struct kernfs_node), M_TEMP, M_WAITOK); - error = getnewvnode(VT_KERNFS, mp, kernfs_vnodeop_p, vpp); - if (error) { - FREE(kf, M_TEMP); - goto out; - } - vp = *vpp; - kf->kf_kt = kt; - kf->kf_vnode = vp; - vp->v_type = kf->kf_vtype; - vp->v_data = kf; - if (kf->kf_namlen == 1 && bcmp(kf->kf_name, ".", 1) == 0) - vp->v_flag |= VROOT; - - TAILQ_INSERT_TAIL(&kfshead, kf, list); -out: - lockmgr(&kfscache_lock, LK_RELEASE, NULL, p); - -#ifdef KERNFS_DIAGNOSTIC - if (error) - printf("kernfs_allocvp: error %d\n", error); -#endif - return(error); -} - -int -kernfs_freevp(vp, p) - struct vnode *vp; - struct proc *p; -{ - struct kernfs_node *kf = VTOKERN(vp); - - TAILQ_REMOVE(&kfshead, kf, list); - VOP_UNLOCK(vp, 0, p); - FREE(vp->v_data, M_TEMP); - vp->v_data = 0; - return(0); -} - -struct kern_target * -kernfs_findtarget(name, namlen) - char *name;
Don't know where to look next?X
- int namlen; -{ - struct kern_target *kt = NULL; - int i; - - for (i = 0; i < nkern_targets; i++) { - if (kern_targets[i].kt_namlen == namlen && - bcmp(kern_targets[i].kt_name, name, namlen) == 0) { - kt = &kern_targets[i]; - break; - } - } - -#ifdef KERNFS_DIAGNOSTIC - if (i == nkern_targets || kt == NULL) - printf("kernfs_findtarget: no match for %s\n"); -#endif - return(kt); -} - - -int -kernfs_xread(kt, off, bufp, len) - struct kern_target *kt; - int off; - char **bufp; - int len; -{ - - switch (kt->kt_tag) { - case KTT_TIME: { - struct timeval tv; - - microtime(&tv); - sprintf(*bufp, "%ld %ld\n", tv.tv_sec, tv.tv_usec); - break; - } - - case KTT_INT: { - int *ip = kt->kt_data; - - sprintf(*bufp, "%d\n", *ip); - break; - } - - case KTT_STRING: { - char *cp = kt->kt_data; - - *bufp = cp; - break; - } - - case KTT_MSGBUF: { - extern struct msgbuf *msgbufp; - long n; - - if (msgbufp == NULL || msgbufp->msg_magic != MSG_MAGIC) - return (ENXIO); - - /* - * Note that reads of /kern/msgbuf won't necessarily yield - * consistent results, if the message buffer is modified - * while the read is in progress. The worst that can happen - * is that incorrect data will be read. There's no way - * that this can crash the system unless the values in the - * message buffer header are corrupted, but that'll cause - * the system to die anyway. - */ - if (msgbufp->msg_bufl < msgbufp->msg_bufs) { - if (off >= msgbufp->msg_bufx) - return (0); - n = off; - len = msgbufp->msg_bufx - n; - } else { - if (off >= msgbufp->msg_bufs) - return (0); - n = msgbufp->msg_bufx + off; - if (n >= msgbufp->msg_bufs) - n -= msgbufp->msg_bufs; - len = min(msgbufp->msg_bufs - n, msgbufp->msg_bufs - off); - } - *bufp = msgbufp->msg_bufc + n;
Confused? Frustrated?X
- return (len); - } - - case KTT_HOSTNAME: { - char *cp = hostname; - int xlen = hostnamelen; - - if (xlen >= (len-2)) - return (EINVAL); - - bcopy(cp, *bufp, xlen); - (*bufp)[xlen] = '\n'; - (*bufp)[xlen+1] = '\0'; - break; - } - - case KTT_DOMAIN: { - char *cp = domainname; - int xlen = domainnamelen; - - if (xlen >= (len-2)) - return (EINVAL); - - bcopy(cp, *bufp, xlen); - (*bufp)[xlen] = '\n'; - (*bufp)[xlen+1] = '\0'; - break; - } - - case KTT_AVENRUN: - averunnable.fscale = FSCALE; - sprintf(*bufp, "%d %d %d %ld\n", - averunnable.ldavg[0], averunnable.ldavg[1], - averunnable.ldavg[2], averunnable.fscale); - break; - - case KTT_USERMEM: - sprintf(*bufp, "%u\n", ctob(physmem - uvmexp.wired)); - break; - - case KTT_PHYSMEM: - sprintf(*bufp, "%u\n", ctob(physmem)); - break; - -#ifdef IPSEC - case KTT_IPSECSPI: - return(ipsp_kern(off, bufp, len)); -#endif - default: - return (0); - } - - len = strlen(*bufp); - if (len <= off) - return (0); - *bufp += off; - return (len - off); -} - -int -kernfs_xwrite(kt, buf, len) - struct kern_target *kt; - char *buf; - int len; -{ - - switch (kt->kt_tag) { - case KTT_DOMAIN: - if (buf[len-1] == '\n') - --len; - bcopy(buf, domainname, len); - domainname[len] = '\0'; - domainnamelen = len; - return (0); - - case KTT_HOSTNAME: - if (buf[len-1] == '\n') - --len; - bcopy(buf, hostname, len); - hostname[len] = '\0'; - hostnamelen = len; - return (0); - - default: - return (EIO); - } -} - - /*
  • vp is the current namei directory
  • ndp is the name to locate in that directory... @@ -558,7 +243,7 @@ } */ *ap = v; struct vnode *vp = ap->a_vp;
    • mode_t fmode = (vp->v_flag & VROOT) ? DIR_MODE : VTOKERN(vp)->kf_mode;
      + mode_t fmode = VTOKERN(vp)->kf_mode;

         return (vaccess(fmode, (uid_t)0, (gid_t)0, ap->a_mode, ap->a_cred));  }
@@ -597,12 +282,12 @@

         vap->va_bytes = 0;  

         if (vp->v_flag & VROOT) {

-#ifdef KERNFS_DIAGNOSTIC
 		struct kern_target *kt = VTOKERN(vp)->kf_kt;

+#ifdef KERNFS_DIAGNOSTIC
printf("kernfs_getattr: stat rootdir (%s)\n", kt->kt_name); #endif - vap->va_type = VDIR; - vap->va_mode = DIR_MODE;
+ vap->va_type = kt->kt_vtype;
+ vap->va_mode = kt->kt_mode;
vap->va_nlink = 2; vap->va_fileid = 2; vap->va_size = DEV_BSIZE;
Call Pantek today for Open Source Technical Support at 1-877-546-8934 - 24/7/365X
--- /usr/src/sys/conf/files Tue Sep 3 17:30:54 2002
+++ sys/conf/files Fri Oct 4 15:23:02 2002
@@ -571,7 +571,7 @@ file miscfs/fifofs/fifo_vnops.c fifo file miscfs/kernfs/kernfs_vfsops.c kernfs file miscfs/kernfs/kernfs_vnops.c kernfs -file miscfs/nullfs/null_subr.c nullfs
+file miscfs/kernfs/kernfs_subr.c kernfs
file miscfs/nullfs/null_vfsops.c nullfs file miscfs/nullfs/null_vnops.c nullfs file miscfs/tcfs/tcfs_subr.c tcfs >Release-Note:

>Audit-Trail:
>Unformatted: Received on Thu Nov 7 16:52:40 2002

This archive was generated by hypermail 2.1.8 : Wed Aug 23 2006 - 13:29:37 EDT


Contact Us  Legal Notices  Order Services Online 
Pantek Home  Privacy Policy  IT news  Site Map  Pantek Library