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.126 retrieving revision 1.154 diff -u -p -r1.126 -r1.154 --- src/sys/miscfs/kernfs/kernfs_vnops.c 2006/10/12 01:32:27 1.126 +++ src/sys/miscfs/kernfs/kernfs_vnops.c 2014/07/25 08:20:52 1.154 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_vnops.c,v 1.126 2006/10/12 01:32:27 christos Exp $ */ +/* $NetBSD: kernfs_vnops.c,v 1.154 2014/07/25 08:20:52 dholland Exp $ */ /* * Copyright (c) 1992, 1993 @@ -39,11 +39,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.126 2006/10/12 01:32:27 christos Exp $"); - -#ifdef _KERNEL_OPT -#include "opt_ipsec.h" -#endif +__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.154 2014/07/25 08:20:52 dholland Exp $"); #include #include @@ -63,14 +59,7 @@ __KERNEL_RCSID(0, "$NetBSD: kernfs_vnops #include #include - -#ifdef IPSEC -#include -#include -#include -#include -#include -#endif +#include #include @@ -95,10 +84,6 @@ const struct kern_target kern_targets[] 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, KFSipsecsadir, VDIR, UDIR_MODE }, - { DT_DIR, N("ipsecsp"), 0, KFSipsecspdir, VDIR, UDIR_MODE }, -#endif { 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 }, @@ -119,36 +104,12 @@ const struct kern_target subdir_targets[ { DT_DIR, N("."), 0, KFSsubdir, VDIR, DIR_MODE }, { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_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, 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, KFSipsecspdir, VDIR, DIR_MODE }, - { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_MODE }, -}; -const struct kern_target ipsecsa_kt = - { DT_DIR, N(""), 0, KFSipsecsa, VREG, UREAD_MODE }; -const struct kern_target ipsecsp_kt = - { DT_DIR, N(""), 0, KFSipsecsp, VREG, UREAD_MODE }; -#endif #undef N SIMPLEQ_HEAD(,dyn_kern_target) dyn_kern_targets = SIMPLEQ_HEAD_INITIALIZER(dyn_kern_targets); int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); const int static_nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); -#ifdef IPSEC -int nipsecsa_targets = sizeof(ipsecsa_targets) / sizeof(ipsecsa_targets[0]); -int nipsecsp_targets = sizeof(ipsecsp_targets) / sizeof(ipsecsp_targets[0]); -int nkern_dirs = 4; /* 2 extra subdirs */ -#else int nkern_dirs = 2; -#endif int kernfs_try_fileop(kfstype, kfsfileop, void *, int); int kernfs_try_xread(kfstype, const struct kernfs_node *, char **, @@ -230,6 +191,8 @@ const struct vnodeopv_entry_desc kernfs_ { &vop_setattr_desc, kernfs_setattr }, /* setattr */ { &vop_read_desc, kernfs_read }, /* read */ { &vop_write_desc, kernfs_write }, /* write */ + { &vop_fallocate_desc, genfs_eopnotsupp }, /* fallocate */ + { &vop_fdiscard_desc, genfs_eopnotsupp }, /* fdiscard */ { &vop_fcntl_desc, kernfs_fcntl }, /* fcntl */ { &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */ { &vop_poll_desc, kernfs_poll }, /* poll */ @@ -380,17 +343,9 @@ kernfs_addentry(kernfs_parentdir_t *pkt, } static int -kernfs_xread(kfs, off, bufp, len, wrlen) - struct kernfs_node *kfs; - int off; - char **bufp; - size_t len; - size_t *wrlen; +kernfs_xread(struct kernfs_node *kfs, int off, char **bufp, size_t len, size_t *wrlen) { const struct kern_target *kt; -#ifdef IPSEC - struct mbuf *m; -#endif int err; kt = kfs->kfs_kt; @@ -400,7 +355,8 @@ kernfs_xread(kfs, off, bufp, len, wrlen) struct timeval tv; microtime(&tv); - snprintf(*bufp, len, "%ld %ld\n", tv.tv_sec, tv.tv_usec); + snprintf(*bufp, len, "%lld %ld\n", (long long)tv.tv_sec, + (long)tv.tv_usec); break; } @@ -454,7 +410,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) case KFShostname: { char *cp = hostname; - int xlen = hostnamelen; + size_t xlen = hostnamelen; if (xlen >= (len - 2)) return (EINVAL); @@ -462,7 +418,6 @@ kernfs_xread(kfs, off, bufp, len, wrlen) memcpy(*bufp, cp, xlen); (*bufp)[xlen] = '\n'; (*bufp)[xlen+1] = '\0'; - len = strlen(*bufp); break; } @@ -473,58 +428,6 @@ kernfs_xread(kfs, off, bufp, len, wrlen) averunnable.ldavg[2], averunnable.fscale); break; -#ifdef IPSEC - case KFSipsecsa: - /* - * Note that SA configuration could be changed during the - * read operation, resulting in garbled output. - */ - m = key_setdumpsa_spi(htonl(kfs->kfs_value)); - if (!m) - return (ENOBUFS); - if (off >= m->m_pkthdr.len) { - *wrlen = 0; - m_freem(m); - return (0); - } - if (len > m->m_pkthdr.len - off) - len = m->m_pkthdr.len - off; - m_copydata(m, off, len, *bufp); - *wrlen = len; - m_freem(m); - return (0); - - case KFSipsecsp: - /* - * Note that SP configuration could be changed during the - * read operation, resulting in garbled output. - */ - if (!kfs->kfs_v) { - struct secpolicy *sp; - - sp = key_getspbyid(kfs->kfs_value); - if (sp) - kfs->kfs_v = sp; - else - return (ENOENT); - } - m = key_setdumpsp((struct secpolicy *)kfs->kfs_v, - SADB_X_SPDGET, 0, 0); - if (!m) - return (ENOBUFS); - if (off >= m->m_pkthdr.len) { - *wrlen = 0; - m_freem(m); - return (0); - } - if (len > m->m_pkthdr.len - off) - len = m->m_pkthdr.len - off; - m_copydata(m, off, len, *bufp); - *wrlen = len; - m_freem(m); - return (0); -#endif - default: err = kernfs_try_xread(kfs->kfs_type, kfs, bufp, len, EOPNOTSUPP); @@ -543,10 +446,7 @@ kernfs_xread(kfs, off, bufp, len, wrlen) } static int -kernfs_xwrite(kfs, bf, len) - const struct kernfs_node *kfs; - char *bf; - size_t len; +kernfs_xwrite(const struct kernfs_node *kfs, char *bf, size_t len) { switch (kfs->kfs_type) { @@ -569,10 +469,9 @@ kernfs_xwrite(kfs, bf, len) * ndp is the name to locate in that directory... */ int -kernfs_lookup(v) - void *v; +kernfs_lookup(void *v) { - struct vop_lookup_args /* { + struct vop_lookup_v2_args /* { struct vnode * a_dvp; struct vnode ** a_vpp; struct componentname * a_cnp; @@ -585,25 +484,19 @@ kernfs_lookup(v) const struct kern_target *kt; const struct dyn_kern_target *dkt; const struct kernfs_subdir *ks; - int error, i, wantpunlock; -#ifdef IPSEC - char *ep; - u_int32_t id; -#endif + int error, i; *vpp = NULLVP; - cnp->cn_flags &= ~PDIRUNLOCK; if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME) return (EROFS); if (cnp->cn_namelen == 1 && *pname == '.') { *vpp = dvp; - VREF(dvp); + vref(dvp); return (0); } - wantpunlock = (~cnp->cn_flags & (LOCKPARENT | ISLASTCN)); kfs = VTOKERN(dvp); switch (kfs->kfs_type) { case KFSkern: @@ -629,12 +522,8 @@ kernfs_lookup(v) break; found: - 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); + error = vcache_get(dvp->v_mount, &kt, sizeof(kt), vpp); + return error; case KFSsubdir: ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data; @@ -652,58 +541,6 @@ kernfs_lookup(v) } break; -#ifdef IPSEC - 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) - goto found; - } - - ep = NULL; - id = strtoul(pname, &ep, 10); - if (!ep || *ep || ep == pname) - break; - - error = kernfs_allocvp(dvp->v_mount, vpp, KFSipsecsa, &ipsecsa_kt, id); - if ((error == 0) && wantpunlock) { - VOP_UNLOCK(dvp, 0); - cnp->cn_flags |= PDIRUNLOCK; - } - return (error); - - 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) - goto found; - } - - ep = NULL; - id = strtoul(pname, &ep, 10); - if (!ep || *ep || ep == pname) - break; - - error = kernfs_allocvp(dvp->v_mount, vpp, KFSipsecsp, &ipsecsp_kt, id); - if ((error == 0) && wantpunlock) { - VOP_UNLOCK(dvp, 0); - cnp->cn_flags |= PDIRUNLOCK; - } - return (error); -#endif - default: return (ENOTDIR); } @@ -712,102 +549,58 @@ kernfs_lookup(v) } int -kernfs_open(v) - void *v; +kernfs_open(void *v) { struct vop_open_args /* { struct vnode *a_vp; int a_mode; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct kernfs_node *kfs = VTOKERN(ap->a_vp); -#ifdef IPSEC - struct mbuf *m; - struct secpolicy *sp; -#endif - switch (kfs->kfs_type) { -#ifdef IPSEC - case KFSipsecsa: - m = key_setdumpsa_spi(htonl(kfs->kfs_value)); - if (m) { - m_freem(m); - return (0); - } else - return (ENOENT); - - case KFSipsecsp: - sp = key_getspbyid(kfs->kfs_value); - if (sp) { - kfs->kfs_v = sp; - return (0); - } else - return (ENOENT); -#endif - - default: - return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_OPEN, - v, 0); - } + return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_OPEN, v, 0); } int -kernfs_close(v) - void *v; +kernfs_close(void *v) { struct vop_close_args /* { struct vnode *a_vp; int a_fflag; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct kernfs_node *kfs = VTOKERN(ap->a_vp); - switch (kfs->kfs_type) { -#ifdef IPSEC - case KFSipsecsp: - key_freesp((struct secpolicy *)kfs->kfs_v); - break; -#endif - - default: - return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_CLOSE, - v, 0); - } - - return (0); + return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_CLOSE, v, 0); } int -kernfs_access(v) - void *v; +kernfs_access(void *v) { struct vop_access_args /* { struct vnode *a_vp; int a_mode; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct vattr va; int error; - if ((error = VOP_GETATTR(ap->a_vp, &va, ap->a_cred, ap->a_l)) != 0) + if ((error = VOP_GETATTR(ap->a_vp, &va, ap->a_cred)) != 0) return (error); - return (vaccess(va.va_type, va.va_mode, va.va_uid, va.va_gid, - ap->a_mode, ap->a_cred)); + return kauth_authorize_vnode(ap->a_cred, + KAUTH_ACCESS_ACTION(ap->a_mode, ap->a_vp->v_type, va.va_mode), + ap->a_vp, NULL, genfs_can_access(va.va_type, va.va_mode, + va.va_uid, va.va_gid, ap->a_mode, ap->a_cred)); } static int -kernfs_default_fileop_getattr(v) - void *v; +kernfs_default_fileop_getattr(void *v) { struct vop_getattr_args /* { struct vnode *a_vp; struct vattr *a_vap; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct vattr *vap = ap->a_vap; @@ -818,14 +611,12 @@ kernfs_default_fileop_getattr(v) } int -kernfs_getattr(v) - void *v; +kernfs_getattr(void *v) { struct vop_getattr_args /* { struct vnode *a_vp; struct vattr *a_vap; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct kernfs_node *kfs = VTOKERN(ap->a_vp); struct kernfs_subdir *ks; @@ -834,7 +625,7 @@ kernfs_getattr(v) char strbuf[KSTRING], *bf; size_t nread, total; - VATTR_NULL(vap); + vattr_null(vap); vap->va_type = ap->a_vp->v_type; vap->va_uid = 0; vap->va_gid = 0; @@ -844,9 +635,9 @@ kernfs_getattr(v) vap->va_size = 0; vap->va_blocksize = DEV_BSIZE; /* Make all times be current TOD, except for the "boottime" node. */ - if (kfs->kfs_kt && kfs->kfs_kt->kt_namlen == 8 && + if (kfs->kfs_kt->kt_namlen == 8 && !memcmp(kfs->kfs_kt->kt_name, "boottime", 8)) { - TIMEVAL_TO_TIMESPEC(&boottime, &vap->va_ctime); + vap->va_ctime = boottime; } else { getnanotime(&vap->va_ctime); } @@ -862,6 +653,11 @@ kernfs_getattr(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; @@ -879,12 +675,7 @@ kernfs_getattr(v) case KFSstring: case KFShostname: case KFSavenrun: - case KFSdevice: case KFSmsgbuf: -#ifdef IPSEC - case KFSipsecsa: - case KFSipsecsp: -#endif vap->va_nlink = 1; total = 0; do { @@ -896,14 +687,6 @@ kernfs_getattr(v) vap->va_bytes = vap->va_size = total; break; -#ifdef IPSEC - case KFSipsecsadir: - case KFSipsecspdir: - vap->va_nlink = 2; - vap->va_bytes = vap->va_size = DEV_BSIZE; - break; -#endif - default: error = kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_GETATTR, v, EINVAL); @@ -915,7 +698,7 @@ kernfs_getattr(v) /*ARGSUSED*/ int -kernfs_setattr(void *v __unused) +kernfs_setattr(void *v) { /* @@ -928,8 +711,7 @@ kernfs_setattr(void *v __unused) } int -kernfs_default_xread(v) - void *v; +kernfs_default_xread(void *v) { struct vop_read_args /* { struct vnode *a_vp; @@ -945,7 +727,7 @@ kernfs_default_xread(v) int error; if (ap->a_vp->v_type == VDIR) - return (EOPNOTSUPP); + return EISDIR; off = (int)uio->uio_offset; /* Don't allow negative offsets */ @@ -959,8 +741,7 @@ kernfs_default_xread(v) } int -kernfs_read(v) - void *v; +kernfs_read(void *v) { struct vop_read_args /* { struct vnode *a_vp; @@ -979,8 +760,7 @@ kernfs_read(v) } static int -kernfs_default_xwrite(v) - void *v; +kernfs_default_xwrite(void *v) { struct vop_write_args /* { struct vnode *a_vp; @@ -990,7 +770,8 @@ kernfs_default_xwrite(v) } */ *ap = v; struct kernfs_node *kfs = VTOKERN(ap->a_vp); struct uio *uio = ap->a_uio; - int error, xlen; + int error; + size_t xlen; char strbuf[KSTRING]; if (uio->uio_offset != 0) @@ -1009,8 +790,7 @@ kernfs_default_xwrite(v) } int -kernfs_write(v) - void *v; +kernfs_write(void *v) { struct vop_write_args /* { struct vnode *a_vp; @@ -1029,8 +809,7 @@ kernfs_write(v) } int -kernfs_ioctl(v) - void *v; +kernfs_ioctl(void *v) { struct vop_ioctl_args /* { const struct vnodeop_desc *a_desc; @@ -1039,7 +818,6 @@ kernfs_ioctl(v) void *a_data; int a_fflag; kauth_cred_t a_cred; - struct lwp *a_l; } */ *ap = v; struct kernfs_node *kfs = VTOKERN(ap->a_vp); @@ -1049,28 +827,17 @@ kernfs_ioctl(v) static int kernfs_setdirentfileno_kt(struct dirent *d, const struct kern_target *kt, - u_int32_t value, struct vop_readdir_args *ap) + struct vop_readdir_args *ap) { struct kernfs_node *kfs; struct vnode *vp; int error; - if ((error = kernfs_allocvp(ap->a_vp->v_mount, &vp, kt->kt_tag, kt, - value)) != 0) + if ((error = vcache_get(ap->a_vp->v_mount, &kt, sizeof(kt), &vp)) != 0) return error; - if (kt->kt_tag == KFSdevice) { - struct vattr va; - - error = VOP_GETATTR(vp, &va, ap->a_cred, curlwp); - if (error != 0) { - return error; - } - d->d_fileno = va.va_fileid; - } else { - kfs = VTOKERN(vp); - d->d_fileno = kfs->kfs_fileno; - } - vput(vp); + kfs = VTOKERN(vp); + d->d_fileno = kfs->kfs_fileno; + vrele(vp); return 0; } @@ -1094,7 +861,7 @@ kernfs_setdirentfileno(struct dirent *d, break; } if (ikt != thisdir_kfs->kfs_kt) { - if ((error = kernfs_setdirentfileno_kt(d, ikt, 0, ap)) != 0) + if ((error = kernfs_setdirentfileno_kt(d, ikt, ap)) != 0) return error; } else d->d_fileno = thisdir_kfs->kfs_fileno; @@ -1102,8 +869,7 @@ kernfs_setdirentfileno(struct dirent *d, } int -kernfs_readdir(v) - void *v; +kernfs_readdir(void *v) { struct vop_readdir_args /* { struct vnode *a_vp; @@ -1123,10 +889,6 @@ kernfs_readdir(v) int error; off_t *cookies = NULL; int ncookies = 0, n; -#ifdef IPSEC - struct secasvar *sav, *sav2; - struct secpolicy *sp; -#endif if (uio->uio_resid < UIO_MX) return (EINVAL); @@ -1177,6 +939,13 @@ kernfs_readdir(v) if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp)) continue; + vrele(fvp); + } + if (kt->kt_tag == KFSmsgbuf) { + if (!msgbufenabled + || msgbufp->msg_magic != MSG_MAGIC) { + continue; + } } d.d_namlen = kt->kt_namlen; if ((error = kernfs_setdirentfileno(&d, i, kfs, @@ -1253,6 +1022,7 @@ kernfs_readdir(v) if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp)) continue; + vrele(fvp); } d.d_namlen = kt->kt_namlen; if ((error = kernfs_setdirentfileno(&d, i, kfs, @@ -1269,138 +1039,6 @@ kernfs_readdir(v) ncookies = n; break; -#ifdef IPSEC - case KFSipsecsadir: - /* count SA in the system */ - n = 0; - TAILQ_FOREACH(sav, &satailq, tailq) { - for (sav2 = TAILQ_FIRST(&satailq); - sav2 != sav; - sav2 = TAILQ_NEXT(sav2, tailq)) { - if (sav->spi == sav2->spi) { - /* multiple SA with same SPI */ - break; - } - } - if (sav == sav2 || sav->spi != sav2->spi) - n++; - } - - if (i >= nipsecsa_targets + n) - return (0); - - if (ap->a_ncookies) { - ncookies = min(ncookies, (n - i)); - cookies = malloc(ncookies * sizeof(off_t), M_TEMP, - M_WAITOK); - *ap->a_cookies = cookies; - } - - n = 0; - for (; i < nipsecsa_targets && uio->uio_resid >= UIO_MX; i++) { - kt = &ipsecsa_targets[i]; - d.d_namlen = kt->kt_namlen; - if ((error = kernfs_setdirentfileno(&d, i, kfs, - &kern_targets[0], kt, ap)) != 0) - break; - memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); - d.d_type = kt->kt_type; - if ((error = uiomove(&d, UIO_MX, uio)) != 0) - break; - if (cookies) - *cookies++ = i + 1; - n++; - } - if (error) { - ncookies = n; - break; - } - - TAILQ_FOREACH(sav, &satailq, tailq) { - for (sav2 = TAILQ_FIRST(&satailq); - sav2 != sav; - sav2 = TAILQ_NEXT(sav2, tailq)) { - if (sav->spi == sav2->spi) { - /* multiple SA with same SPI */ - break; - } - } - if (sav != sav2 && sav->spi == sav2->spi) - continue; - if (uio->uio_resid < UIO_MX) - break; - if ((error = kernfs_setdirentfileno_kt(&d, &ipsecsa_kt, - sav->spi, ap)) != 0) - break; - d.d_namlen = snprintf(d.d_name, sizeof(d.d_name), - "%u", ntohl(sav->spi)); - d.d_type = DT_REG; - if ((error = uiomove(&d, UIO_MX, uio)) != 0) - break; - if (cookies) - *cookies++ = i + 1; - n++; - i++; - } - ncookies = n; - break; - - case KFSipsecspdir: - /* count SP in the system */ - n = 0; - TAILQ_FOREACH(sp, &sptailq, tailq) - n++; - - if (i >= nipsecsp_targets + n) - return (0); - - if (ap->a_ncookies) { - ncookies = min(ncookies, (n - i)); - cookies = malloc(ncookies * sizeof(off_t), M_TEMP, - M_WAITOK); - *ap->a_cookies = cookies; - } - - n = 0; - for (; i < nipsecsp_targets && uio->uio_resid >= UIO_MX; i++) { - kt = &ipsecsp_targets[i]; - d.d_namlen = kt->kt_namlen; - if ((error = kernfs_setdirentfileno(&d, i, kfs, - &kern_targets[0], kt, ap)) != 0) - break; - memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); - d.d_type = kt->kt_type; - if ((error = uiomove(&d, UIO_MX, uio)) != 0) - break; - if (cookies) - *cookies++ = i + 1; - n++; - } - if (error) { - ncookies = n; - break; - } - - TAILQ_FOREACH(sp, &sptailq, tailq) { - if (uio->uio_resid < UIO_MX) - break; - if ((error = kernfs_setdirentfileno_kt(&d, &ipsecsp_kt, - sp->id, ap)) != 0) - break; - d.d_namlen = snprintf(d.d_name, sizeof(d.d_name), - "%u", sp->id); - d.d_type = DT_REG; - if ((error = uiomove(&d, UIO_MX, uio)) != 0) - break; - if (cookies) - *cookies++ = i + 1; - n++; - i++; - } - ncookies = n; - break; -#endif - default: error = ENOTDIR; break; @@ -1421,63 +1059,43 @@ kernfs_readdir(v) } int -kernfs_inactive(v) - void *v; +kernfs_inactive(void *v) { struct vop_inactive_args /* { struct vnode *a_vp; - struct lwp *a_l; + bool *a_recycle; } */ *ap = v; struct vnode *vp = ap->a_vp; - const struct kernfs_node *kfs = VTOKERN(ap->a_vp); -#ifdef IPSEC - struct mbuf *m; - struct secpolicy *sp; -#endif - VOP_UNLOCK(vp, 0); - switch (kfs->kfs_type) { -#ifdef IPSEC - case KFSipsecsa: - m = key_setdumpsa_spi(htonl(kfs->kfs_value)); - if (m) - m_freem(m); - else - vgone(vp); - break; - case KFSipsecsp: - sp = key_getspbyid(kfs->kfs_value); - if (sp) - key_freesp(sp); - else { - /* should never happen as we hold a refcnt */ - vgone(vp); - } - break; -#endif - default: - break; - } + *ap->a_recycle = false; + VOP_UNLOCK(vp); return (0); } int -kernfs_reclaim(v) - void *v; +kernfs_reclaim(void *v) { struct vop_reclaim_args /* { struct vnode *a_vp; } */ *ap = v; + struct vnode *vp = ap->a_vp; + struct kernfs_node *kfs = VTOKERN(vp); - return (kernfs_freevp(ap->a_vp)); + vp->v_data = NULL; + vcache_remove(vp->v_mount, &kfs->kfs_kt, sizeof(kfs->kfs_kt)); + mutex_enter(&kfs_lock); + TAILQ_REMOVE(&VFSTOKERNFS(vp->v_mount)->nodelist, kfs, kfs_list); + mutex_exit(&kfs_lock); + kmem_free(kfs, sizeof(struct kernfs_node)); + + return 0; } /* * Return POSIX pathconf information applicable to special devices. */ int -kernfs_pathconf(v) - void *v; +kernfs_pathconf(void *v) { struct vop_pathconf_args /* { struct vnode *a_vp; @@ -1518,7 +1136,7 @@ kernfs_pathconf(v) */ /* ARGSUSED */ int -kernfs_print(void *v __unused) +kernfs_print(void *v) { printf("tag VT_KERNFS, kernfs vnode\n"); @@ -1526,8 +1144,7 @@ kernfs_print(void *v __unused) } int -kernfs_link(v) - void *v; +kernfs_link(void *v) { struct vop_link_args /* { struct vnode *a_dvp; @@ -1541,10 +1158,9 @@ kernfs_link(v) } int -kernfs_symlink(v) - void *v; +kernfs_symlink(void *v) { - struct vop_symlink_args /* { + struct vop_symlink_v3_args /* { struct vnode *a_dvp; struct vnode **a_vpp; struct componentname *a_cnp; @@ -1553,6 +1169,5 @@ kernfs_symlink(v) } */ *ap = v; VOP_ABORTOP(ap->a_dvp, ap->a_cnp); - vput(ap->a_dvp); return (EROFS); }