Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/miscfs/kernfs/kernfs_vnops.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/miscfs/kernfs/kernfs_vnops.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.95 retrieving revision 1.100 diff -u -p -r1.95 -r1.100 --- src/sys/miscfs/kernfs/kernfs_vnops.c 2003/09/10 09:59:47 1.95 +++ src/sys/miscfs/kernfs/kernfs_vnops.c 2004/05/07 14:56:48 1.100 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_vnops.c,v 1.95 2003/09/10 09:59:47 dan Exp $ */ +/* $NetBSD: kernfs_vnops.c,v 1.100 2004/05/07 14:56:48 cl Exp $ */ /* * Copyright (c) 1992, 1993 @@ -39,7 +39,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.95 2003/09/10 09:59:47 dan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.100 2004/05/07 14:56:48 cl Exp $"); #ifdef _KERNEL_OPT #include "opt_ipsec.h" @@ -86,44 +86,44 @@ __KERNEL_RCSID(0, "$NetBSD: kernfs_vnops const struct kern_target kern_targets[] = { /* NOTE: The name must be less than UIO_MX-16 chars in length */ /* name data tag type ro/rw */ - { DT_DIR, N("."), 0, Pkern, VDIR, DIR_MODE }, - { DT_DIR, N(".."), 0, Proot, VDIR, DIR_MODE }, - { DT_REG, N("boottime"), &boottime.tv_sec, Pint, VREG, READ_MODE }, + { DT_DIR, N("."), 0, KFSkern, VDIR, DIR_MODE }, + { DT_DIR, N(".."), 0, KFSroot, VDIR, DIR_MODE }, + { DT_REG, N("boottime"), &boottime.tv_sec, KFSint, VREG, READ_MODE }, /* XXX cast away const */ { DT_REG, N("copyright"), (void *)copyright, - Pstring, VREG, READ_MODE }, - { DT_REG, N("hostname"), 0, Phostname, VREG, WRITE_MODE }, - { DT_REG, N("hz"), &hz, Pint, VREG, READ_MODE }, + KFSstring, VREG, READ_MODE }, + { DT_REG, N("hostname"), 0, KFShostname, VREG, WRITE_MODE }, + { DT_REG, N("hz"), &hz, KFSint, VREG, READ_MODE }, #ifdef IPSEC - { DT_DIR, N("ipsecsa"), 0, Pipsecsadir, VDIR, UDIR_MODE }, - { DT_DIR, N("ipsecsp"), 0, Pipsecspdir, VDIR, UDIR_MODE }, + { DT_DIR, N("ipsecsa"), 0, KFSipsecsadir, VDIR, UDIR_MODE }, + { DT_DIR, N("ipsecsp"), 0, KFSipsecspdir, VDIR, UDIR_MODE }, #endif - { DT_REG, N("loadavg"), 0, Pavenrun, VREG, READ_MODE }, - { DT_REG, N("msgbuf"), 0, Pmsgbuf, VREG, READ_MODE }, - { DT_REG, N("pagesize"), &uvmexp.pagesize, Pint, VREG, READ_MODE }, - { DT_REG, N("physmem"), &physmem, Pint, VREG, READ_MODE }, + { DT_REG, N("loadavg"), 0, KFSavenrun, VREG, READ_MODE }, + { DT_REG, N("msgbuf"), 0, KFSmsgbuf, VREG, READ_MODE }, + { DT_REG, N("pagesize"), &uvmexp.pagesize, KFSint, VREG, READ_MODE }, + { DT_REG, N("physmem"), &physmem, KFSint, VREG, READ_MODE }, #if 0 - { DT_DIR, N("root"), 0, Pnull, VDIR, DIR_MODE }, + { DT_DIR, N("root"), 0, KFSnull, VDIR, DIR_MODE }, #endif - { DT_BLK, N("rootdev"), &rootdev, Pdevice, VBLK, READ_MODE }, - { DT_CHR, N("rrootdev"), &rrootdev, Pdevice, VCHR, READ_MODE }, - { DT_REG, N("time"), 0, Ptime, VREG, READ_MODE }, + { DT_BLK, N("rootdev"), &rootdev, KFSdevice, VBLK, READ_MODE }, + { DT_CHR, N("rrootdev"), &rrootdev, KFSdevice, VCHR, READ_MODE }, + { DT_REG, N("time"), 0, KFStime, VREG, READ_MODE }, /* XXX cast away const */ { DT_REG, N("version"), (void *)version, - Pstring, VREG, READ_MODE }, + KFSstring, VREG, READ_MODE }, }; #ifdef IPSEC const struct kern_target ipsecsa_targets[] = { /* NOTE: The name must be less than UIO_MX-16 chars in length */ /* name data tag type ro/rw */ - { DT_DIR, N("."), 0, Pipsecsadir, VDIR, DIR_MODE }, - { DT_DIR, N(".."), 0, Pkern, VDIR, DIR_MODE }, + { DT_DIR, N("."), 0, KFSipsecsadir, VDIR, DIR_MODE }, + { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_MODE }, }; const struct kern_target ipsecsp_targets[] = { /* NOTE: The name must be less than UIO_MX-16 chars in length */ /* name data tag type ro/rw */ - { DT_DIR, N("."), 0, Pipsecspdir, VDIR, DIR_MODE }, - { DT_DIR, N(".."), 0, Pkern, VDIR, DIR_MODE }, + { DT_DIR, N("."), 0, KFSipsecspdir, VDIR, DIR_MODE }, + { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_MODE }, }; #endif #undef N @@ -246,7 +246,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) kt = kfs->kfs_kt; switch (kfs->kfs_type) { - case Ptime: { + case KFStime: { struct timeval tv; microtime(&tv); @@ -254,21 +254,21 @@ kernfs_xread(kfs, off, bufp, len, wrlen) break; } - case Pint: { + case KFSint: { int *ip = kt->kt_data; snprintf(*bufp, len, "%d\n", *ip); break; } - case Pstring: { + case KFSstring: { char *cp = kt->kt_data; *bufp = cp; break; } - case Pmsgbuf: { + case KFSmsgbuf: { long n; /* @@ -302,7 +302,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) return (0); } - case Phostname: { + case KFShostname: { char *cp = hostname; int xlen = hostnamelen; @@ -316,7 +316,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) break; } - case Pavenrun: + case KFSavenrun: averunnable.fscale = FSCALE; snprintf(*bufp, len, "%d %d %d %ld\n", averunnable.ldavg[0], averunnable.ldavg[1], @@ -324,7 +324,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) break; #ifdef IPSEC - case Pipsecsa: + case KFSipsecsa: /* * Note that SA configuration could be changed during the * read operation, resulting in garbled output. @@ -344,7 +344,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) m_freem(m); return (0); - case Pipsecsp: + case KFSipsecsp: /* * Note that SP configuration could be changed during the * read operation, resulting in garbled output. @@ -398,7 +398,7 @@ kernfs_xwrite(kfs, buf, len) { switch (kfs->kfs_type) { - case Phostname: + case KFShostname: if (buf[len-1] == '\n') --len; memcpy(hostname, buf, len); @@ -452,7 +452,7 @@ kernfs_lookup(v) wantpunlock = (~cnp->cn_flags & (LOCKPARENT | ISLASTCN)); kfs = VTOKERN(dvp); switch (kfs->kfs_type) { - case Pkern: + case KFSkern: /* * Shouldn't get here with .. in the root node. */ @@ -476,19 +476,17 @@ kernfs_lookup(v) return (error); #ifdef IPSEC - case Pipsecsadir: - for (i = 0; i < nipsecsa_targets; i++) { + case KFSipsecsadir: + if (cnp->cn_flags & ISDOTDOT) { + kt = &kern_targets[0]; + goto found; + } + + for (i = 2; i < nipsecsa_targets; i++) { kt = &ipsecsa_targets[i]; if (cnp->cn_namelen == kt->kt_namlen && - memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) { - error = kernfs_allocvp(dvp->v_mount, vpp, - kt->kt_tag, kt, 0); - if ((error == 0) && wantpunlock) { - VOP_UNLOCK(dvp, 0); - cnp->cn_flags |= PDIRUNLOCK; - } - return (error); - } + memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) + goto found; } ep = NULL; @@ -496,26 +494,24 @@ kernfs_lookup(v) if (!ep || *ep || ep == pname) break; - error = kernfs_allocvp(dvp->v_mount, vpp, Pipsecsa, NULL, id); + error = kernfs_allocvp(dvp->v_mount, vpp, KFSipsecsa, NULL, id); if ((error == 0) && wantpunlock) { VOP_UNLOCK(dvp, 0); cnp->cn_flags |= PDIRUNLOCK; } return (error); - case Pipsecspdir: - for (i = 0; i < nipsecsp_targets; i++) { + case KFSipsecspdir: + if (cnp->cn_flags & ISDOTDOT) { + kt = &kern_targets[0]; + goto found; + } + + for (i = 2; i < nipsecsp_targets; i++) { kt = &ipsecsp_targets[i]; if (cnp->cn_namelen == kt->kt_namlen && - memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) { - error = kernfs_allocvp(dvp->v_mount, vpp, - kt->kt_tag, kt, 0); - if ((error == 0) && wantpunlock) { - VOP_UNLOCK(dvp, 0); - cnp->cn_flags |= PDIRUNLOCK; - } - return (error); - } + memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) + goto found; } ep = NULL; @@ -523,7 +519,7 @@ kernfs_lookup(v) if (!ep || *ep || ep == pname) break; - error = kernfs_allocvp(dvp->v_mount, vpp, Pipsecsp, NULL, id); + error = kernfs_allocvp(dvp->v_mount, vpp, KFSipsecsp, NULL, id); if ((error == 0) && wantpunlock) { VOP_UNLOCK(dvp, 0); cnp->cn_flags |= PDIRUNLOCK; @@ -556,7 +552,7 @@ kernfs_open(v) switch (kfs->kfs_type) { #ifdef IPSEC - case Pipsecsa: + case KFSipsecsa: m = key_setdumpsa_spi(htonl(kfs->kfs_value)); if (m) { m_freem(m); @@ -564,7 +560,7 @@ kernfs_open(v) } else return (ENOENT); - case Pipsecsp: + case KFSipsecsp: sp = key_getspbyid(kfs->kfs_value); if (sp) { kfs->kfs_v = sp; @@ -592,7 +588,7 @@ kernfs_close(v) switch (kfs->kfs_type) { #ifdef IPSEC - case Pipsecsp: + case KFSipsecsp: key_freesp((struct secpolicy *)kfs->kfs_v); break; #endif @@ -655,7 +651,7 @@ kernfs_getattr(v) * We don't guard the read from time(9) with splclock(9) since we * don't actually need to be THAT sure the access is atomic. */ - if (kfs->kfs_kt->kt_namlen == 8 && + if (kfs->kfs_kt && kfs->kfs_kt->kt_namlen == 8 && !memcmp(kfs->kfs_kt->kt_name, "boottime", 8)) { TIMEVAL_TO_TIMESPEC(&boottime, &vap->va_ctime); } else { @@ -668,7 +664,7 @@ kernfs_getattr(v) vap->va_bytes = 0; switch (kfs->kfs_type) { - case Pkern: + case KFSkern: #ifdef IPSEC vap->va_nlink = 4; /* 2 extra subdirs */ #else @@ -677,22 +673,22 @@ kernfs_getattr(v) vap->va_bytes = vap->va_size = DEV_BSIZE; break; - case Proot: + case KFSroot: vap->va_nlink = 1; vap->va_bytes = vap->va_size = DEV_BSIZE; break; - case Pnull: - case Ptime: - case Pint: - case Pstring: - case Phostname: - case Pavenrun: - case Pdevice: - case Pmsgbuf: + case KFSnull: + case KFStime: + case KFSint: + case KFSstring: + case KFShostname: + case KFSavenrun: + case KFSdevice: + case KFSmsgbuf: #ifdef IPSEC - case Pipsecsa: - case Pipsecsp: + case KFSipsecsa: + case KFSipsecsp: #endif vap->va_nlink = 1; total = 0; @@ -706,8 +702,8 @@ kernfs_getattr(v) break; #ifdef IPSEC - case Pipsecsadir: - case Pipsecspdir: + case KFSipsecsadir: + case KFSipsecspdir: vap->va_nlink = 2; vap->va_bytes = vap->va_size = DEV_BSIZE; break; @@ -830,7 +826,7 @@ kernfs_readdir(v) ncookies = uio->uio_resid / UIO_MX; switch (kfs->kfs_type) { - case Pkern: + case KFSkern: if (i >= nkern_targets) return (0); @@ -844,7 +840,7 @@ kernfs_readdir(v) n = 0; for (; i < nkern_targets && uio->uio_resid >= UIO_MX; i++) { kt = &kern_targets[i]; - if (kt->kt_tag == Pdevice) { + if (kt->kt_tag == KFSdevice) { dev_t *dp = kt->kt_data; struct vnode *fvp; @@ -860,7 +856,7 @@ kernfs_readdir(v) d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0); memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); d.d_type = kt->kt_type; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -869,7 +865,7 @@ kernfs_readdir(v) ncookies = n; break; - case Proot: + case KFSroot: if (i >= 2) return 0; @@ -887,7 +883,7 @@ kernfs_readdir(v) d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0); memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); d.d_type = kt->kt_type; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -897,7 +893,7 @@ kernfs_readdir(v) break; #ifdef IPSEC - case Pipsecsadir: + case KFSipsecsadir: /* count SA in the system */ n = 0; TAILQ_FOREACH(sav, &satailq, tailq) { @@ -930,7 +926,7 @@ kernfs_readdir(v) d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0); memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); d.d_type = kt->kt_type; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -959,7 +955,7 @@ kernfs_readdir(v) d.d_namlen = snprintf(d.d_name, sizeof(d.d_name), "%u", ntohl(sav->spi)); d.d_type = DT_REG; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -969,7 +965,7 @@ kernfs_readdir(v) ncookies = n; break; - case Pipsecspdir: + case KFSipsecspdir: /* count SP in the system */ n = 0; TAILQ_FOREACH(sp, &sptailq, tailq) @@ -992,7 +988,7 @@ kernfs_readdir(v) d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0); memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); d.d_type = kt->kt_type; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -1011,7 +1007,7 @@ kernfs_readdir(v) d.d_namlen = snprintf(d.d_name, sizeof(d.d_name), "%u", sp->id); d.d_type = DT_REG; - if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) + if ((error = uiomove(&d, UIO_MX, uio)) != 0) break; if (cookies) *cookies++ = i + 1; @@ -1059,14 +1055,14 @@ kernfs_inactive(v) VOP_UNLOCK(vp, 0); switch (kfs->kfs_type) { #ifdef IPSEC - case Pipsecsa: + case KFSipsecsa: m = key_setdumpsa_spi(htonl(kfs->kfs_value)); if (m) m_freem(m); else vgone(vp); break; - case Pipsecsp: + case KFSipsecsp: sp = key_getspbyid(kfs->kfs_value); if (sp) key_freesp(sp);