|
|||||||||||
|
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:
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 + 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+ +/* + * 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@@ -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 *);
-void
- static int tried = 0;
- int cmaj;
-
- if (tried) {
- /* Already did it once. */
- return;
- }
- 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");
}
/*
--- /usr/src/sys/miscfs/kernfs/kernfs_vnops.c Thu Mar 14 20:31:31 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 },
- { 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[] = {
{ &vop_default_desc, vn_default_error },
@@ -206,267 +152,6 @@
{ &kernfs_vnodeop_p, kernfs_vnodeop_entries }; -TAILQ_HEAD(, kernfs_node) kfshead; -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; - 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; - 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); - } -} - - /*
return (vaccess(fmode, (uid_t)0, (gid_t)0, ap->a_mode, ap->a_cred));
}
vap->va_bytes = 0; if (vp->v_flag & VROOT) { -#ifdef KERNFS_DIAGNOSTIC struct kern_target *kt = VTOKERN(vp)->kf_kt; >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 |
||||||||||
|
|||||||||||