version 1.56, 1998/02/12 20:38:45 |
version 1.57, 1998/03/01 02:21:04 |
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
* |
* |
* @(#)kernfs_vnops.c 8.9 (Berkeley) 6/15/94 |
* @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95 |
*/ |
*/ |
|
|
/* |
/* |
Line 119 int kernfs_read __P((void *)); |
|
Line 119 int kernfs_read __P((void *)); |
|
int kernfs_write __P((void *)); |
int kernfs_write __P((void *)); |
#define kernfs_ioctl genfs_eopnotsupp |
#define kernfs_ioctl genfs_eopnotsupp |
#define kernfs_poll genfs_poll |
#define kernfs_poll genfs_poll |
|
#define kernfs_revoke genfs_revoke |
#define kernfs_mmap genfs_eopnotsupp |
#define kernfs_mmap genfs_eopnotsupp |
#define kernfs_fsync genfs_nullop |
#define kernfs_fsync genfs_nullop |
#define kernfs_seek genfs_nullop |
#define kernfs_seek genfs_nullop |
Line 133 int kernfs_readdir __P((void *)); |
|
Line 134 int kernfs_readdir __P((void *)); |
|
#define kernfs_abortop genfs_abortop |
#define kernfs_abortop genfs_abortop |
int kernfs_inactive __P((void *)); |
int kernfs_inactive __P((void *)); |
int kernfs_reclaim __P((void *)); |
int kernfs_reclaim __P((void *)); |
#define kernfs_lock genfs_nullop |
#define kernfs_lock genfs_nolock |
#define kernfs_unlock genfs_nullop |
#define kernfs_unlock genfs_nounlock |
#define kernfs_bmap genfs_badop |
#define kernfs_bmap genfs_badop |
#define kernfs_strategy genfs_badop |
#define kernfs_strategy genfs_badop |
int kernfs_print __P((void *)); |
int kernfs_print __P((void *)); |
#define kernfs_islocked genfs_nullop |
#define kernfs_islocked genfs_noislocked |
int kernfs_pathconf __P((void *)); |
int kernfs_pathconf __P((void *)); |
#define kernfs_advlock genfs_eopnotsupp |
#define kernfs_advlock genfs_eopnotsupp |
#define kernfs_blkatoff genfs_eopnotsupp |
#define kernfs_blkatoff genfs_eopnotsupp |
Line 166 struct vnodeopv_entry_desc kernfs_vnodeo |
|
Line 167 struct vnodeopv_entry_desc kernfs_vnodeo |
|
{ &vop_write_desc, kernfs_write }, /* write */ |
{ &vop_write_desc, kernfs_write }, /* write */ |
{ &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */ |
{ &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */ |
{ &vop_poll_desc, kernfs_poll }, /* poll */ |
{ &vop_poll_desc, kernfs_poll }, /* poll */ |
|
{ &vop_revoke_desc, kernfs_revoke }, /* revoke */ |
{ &vop_mmap_desc, kernfs_mmap }, /* mmap */ |
{ &vop_mmap_desc, kernfs_mmap }, /* mmap */ |
{ &vop_fsync_desc, kernfs_fsync }, /* fsync */ |
{ &vop_fsync_desc, kernfs_fsync }, /* fsync */ |
{ &vop_seek_desc, kernfs_seek }, /* seek */ |
{ &vop_seek_desc, kernfs_seek }, /* seek */ |
Line 346 kernfs_lookup(v) |
|
Line 348 kernfs_lookup(v) |
|
if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME) |
if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME) |
return (EROFS); |
return (EROFS); |
|
|
|
VOP_UNLOCK(dvp, 0); |
if (cnp->cn_namelen == 1 && *pname == '.') { |
if (cnp->cn_namelen == 1 && *pname == '.') { |
*vpp = dvp; |
*vpp = dvp; |
VREF(dvp); |
VREF(dvp); |
/*VOP_LOCK(dvp);*/ |
vn_lock(dvp, LK_SHARED | LK_RETRY); |
return (0); |
return (0); |
} |
} |
|
|
Line 357 kernfs_lookup(v) |
|
Line 360 kernfs_lookup(v) |
|
if (cnp->cn_namelen == 4 && bcmp(pname, "root", 4) == 0) { |
if (cnp->cn_namelen == 4 && bcmp(pname, "root", 4) == 0) { |
*vpp = rootdir; |
*vpp = rootdir; |
VREF(rootdir); |
VREF(rootdir); |
VOP_LOCK(rootdir); |
vn_lock(rootdir, LK_SHARED | LK_RETRY); |
return (0); |
return (0); |
} |
} |
#endif |
#endif |
Line 372 kernfs_lookup(v) |
|
Line 375 kernfs_lookup(v) |
|
printf("kernfs_lookup: i = %d, failed", i); |
printf("kernfs_lookup: i = %d, failed", i); |
#endif |
#endif |
|
|
|
vn_lock(dvp, LK_SHARED | LK_RETRY); |
return (cnp->cn_nameiop == LOOKUP ? ENOENT : EROFS); |
return (cnp->cn_nameiop == LOOKUP ? ENOENT : EROFS); |
|
|
found: |
found: |
if (kt->kt_tag == KTT_DEVICE) { |
if (kt->kt_tag == KTT_DEVICE) { |
dev_t *dp = kt->kt_data; |
dev_t *dp = kt->kt_data; |
loop: |
loop: |
if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp)) |
if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp)) { |
|
vn_lock(dvp, LK_SHARED | LK_RETRY); |
return (ENOENT); |
return (ENOENT); |
|
} |
*vpp = fvp; |
*vpp = fvp; |
if (vget(fvp, 1)) |
if (vget(fvp, LK_EXCLUSIVE)) |
goto loop; |
goto loop; |
return (0); |
return (0); |
} |
} |
|
|
printf("kernfs_lookup: allocate new vnode\n"); |
printf("kernfs_lookup: allocate new vnode\n"); |
#endif |
#endif |
error = getnewvnode(VT_KERNFS, dvp->v_mount, kernfs_vnodeop_p, &fvp); |
error = getnewvnode(VT_KERNFS, dvp->v_mount, kernfs_vnodeop_p, &fvp); |
if (error) |
if (error) { |
|
vn_lock(dvp, LK_SHARED | LK_RETRY); |
return (error); |
return (error); |
|
} |
|
|
MALLOC(fvp->v_data, void *, sizeof(struct kernfs_node), M_TEMP, |
MALLOC(fvp->v_data, void *, sizeof(struct kernfs_node), M_TEMP, |
M_WAITOK); |
M_WAITOK); |
VTOKERN(fvp)->kf_kt = kt; |
VTOKERN(fvp)->kf_kt = kt; |
fvp->v_type = kt->kt_vtype; |
fvp->v_type = kt->kt_vtype; |
|
vn_lock(fvp, LK_SHARED | LK_RETRY); |
*vpp = fvp; |
*vpp = fvp; |
|
|
#ifdef KERNFS_DIAGNOSTIC |
#ifdef KERNFS_DIAGNOSTIC |
Line 479 kernfs_getattr(v) |
|
Line 488 kernfs_getattr(v) |
|
vap->va_type = kt->kt_vtype; |
vap->va_type = kt->kt_vtype; |
vap->va_mode = kt->kt_mode; |
vap->va_mode = kt->kt_mode; |
vap->va_nlink = 1; |
vap->va_nlink = 1; |
vap->va_fileid = 3 + (kt - kern_targets); |
vap->va_fileid = 1 + (kt - kern_targets); |
total = 0; |
total = 0; |
while (buf = strbuf, |
while (buf = strbuf, |
nbytes = kernfs_xread(kt, total, &buf, sizeof(strbuf))) |
nbytes = kernfs_xread(kt, total, &buf, sizeof(strbuf))) |
Line 592 kernfs_readdir(v) |
|
Line 601 kernfs_readdir(v) |
|
struct uio *a_uio; |
struct uio *a_uio; |
struct ucred *a_cred; |
struct ucred *a_cred; |
int *a_eofflag; |
int *a_eofflag; |
off_t *a_cookies; |
off_t **a_cookies; |
int a_ncookies; |
int a_*ncookies; |
} */ *ap = v; |
} */ *ap = v; |
struct uio *uio = ap->a_uio; |
struct uio *uio = ap->a_uio; |
struct dirent d; |
struct dirent d; |
struct kern_target *kt; |
struct kern_target *kt; |
int i; |
int i; |
int error; |
int error; |
off_t *cookies = ap->a_cookies; |
off_t *cookies = NULL; |
int ncookies = ap->a_ncookies; |
int ncookies = 0, nc = 0; |
|
|
if (ap->a_vp->v_type != VDIR) |
if (ap->a_vp->v_type != VDIR) |
return (ENOTDIR); |
return (ENOTDIR); |
Line 616 kernfs_readdir(v) |
|
Line 625 kernfs_readdir(v) |
|
bzero((caddr_t)&d, UIO_MX); |
bzero((caddr_t)&d, UIO_MX); |
d.d_reclen = UIO_MX; |
d.d_reclen = UIO_MX; |
|
|
|
if (ap->a_ncookies) { |
|
nc = uio->uio_resid / UIO_MX; |
|
nc = min(nc, (nkern_targets - i)); |
|
MALLOC(cookies, off_t *, nc * sizeof(off_t), M_TEMP, |
|
M_WAITOK); |
|
*ap->a_cookies = cookies; |
|
} |
|
|
for (kt = &kern_targets[i]; |
for (kt = &kern_targets[i]; |
uio->uio_resid >= UIO_MX && i < nkern_targets; kt++, i++) { |
uio->uio_resid >= UIO_MX && i < nkern_targets; kt++, i++) { |
#ifdef KERNFS_DIAGNOSTIC |
#ifdef KERNFS_DIAGNOSTIC |
Line 637 kernfs_readdir(v) |
|
Line 654 kernfs_readdir(v) |
|
|
|
if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) |
if ((error = uiomove((caddr_t)&d, UIO_MX, uio)) != 0) |
break; |
break; |
if (ncookies-- > 0) |
if (cookies) { |
*cookies++ = i + 1; |
*cookies++ = i + 1; |
|
ncookies++; |
|
} |
|
} |
|
|
|
if (ap->a_ncookies) { |
|
if (error) { |
|
FREE(*ap->a_cookies, M_TEMP); |
|
*ap->a_ncookies = 0; |
|
*ap->a_cookies = NULL; |
|
} else |
|
*ap->a_ncookies = ncookies; |
} |
} |
|
|
uio->uio_offset = i; |
uio->uio_offset = i; |
Line 651 kernfs_inactive(v) |
|
Line 679 kernfs_inactive(v) |
|
{ |
{ |
struct vop_inactive_args /* { |
struct vop_inactive_args /* { |
struct vnode *a_vp; |
struct vnode *a_vp; |
|
struct proc *a_p; |
} */ *ap = v; |
} */ *ap = v; |
struct vnode *vp = ap->a_vp; |
struct vnode *vp = ap->a_vp; |
|
|
Line 661 kernfs_inactive(v) |
|
Line 690 kernfs_inactive(v) |
|
* Clear out the v_type field to avoid |
* Clear out the v_type field to avoid |
* nasty things happening in vgone(). |
* nasty things happening in vgone(). |
*/ |
*/ |
|
VOP_UNLOCK(vp, 0); |
vp->v_type = VNON; |
vp->v_type = VNON; |
return (0); |
return (0); |
} |
} |