diff options
Diffstat (limited to 'sys/miscfs/kernfs/kernfs_vfsops.c')
-rw-r--r-- | sys/miscfs/kernfs/kernfs_vfsops.c | 153 |
1 files changed, 29 insertions, 124 deletions
diff --git a/sys/miscfs/kernfs/kernfs_vfsops.c b/sys/miscfs/kernfs/kernfs_vfsops.c index 4c045e7..b774487 100644 --- a/sys/miscfs/kernfs/kernfs_vfsops.c +++ b/sys/miscfs/kernfs/kernfs_vfsops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1992, 1993 + * Copyright (c) 1992, 1993, 1995 * The Regents of the University of California. All rights reserved. * * This code is derived from software donated to Berkeley by @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)kernfs_vfsops.c 8.4 (Berkeley) 1/21/94 + * @(#)kernfs_vfsops.c 8.10 (Berkeley) 5/14/95 * $FreeBSD$ */ @@ -55,88 +55,52 @@ #include <miscfs/specfs/specdev.h> #include <miscfs/kernfs/kernfs.h> -struct vnode *rrootvp; +dev_t rrootdev = NODEV; static int cdevvp __P((dev_t dev, struct vnode **vpp)); -static int kernfs_init __P((void)); +static int kernfs_init __P((struct vfsconf *vfsp)); static int kernfs_mount __P((struct mount *mp, char *path, caddr_t data, struct nameidata *ndp, struct proc *p)); static int kernfs_start __P((struct mount *mp, int flags, struct proc *p)); static int kernfs_unmount __P((struct mount *mp, int mntflags, struct proc *p)); static int kernfs_root __P((struct mount *mp, struct vnode **vpp)); -static int kernfs_quotactl __P((struct mount *mp, int cmd, uid_t uid, - caddr_t arg, struct proc *p)); static int kernfs_statfs __P((struct mount *mp, struct statfs *sbp, struct proc *p)); -static int kernfs_sync __P((struct mount *mp, int waitfor, - struct ucred *cred, struct proc *p)); -static int kernfs_vget __P((struct mount *mp, ino_t ino, - struct vnode **vpp)); -static int kernfs_fhtovp __P((struct mount *mp, struct fid *fhp, - struct mbuf *nam, struct vnode **vpp, - int *exflagsp, struct ucred **credanonp)); -static int kernfs_vptofh __P((struct vnode *vp, struct fid *fhp)); -/* - * Create a vnode for a character device. - */ static int -cdevvp(dev, vpp) - dev_t dev; - struct vnode **vpp; +kernfs_init(vfsp) + struct vfsconf *vfsp; { - register struct vnode *vp; - struct vnode *nvp; - int error; - if (dev == NODEV) - return (0); - error = getnewvnode(VT_NON, (struct mount *)0, spec_vnodeop_p, &nvp); - if (error) { - *vpp = 0; - return (error); - } - vp = nvp; - vp->v_type = VCHR; - nvp = checkalias(vp, dev, (struct mount *)0); - if (nvp) { - vput(vp); - vp = nvp; - } - *vpp = vp; return (0); } -static int -kernfs_init() +void +kernfs_get_rrootdev() { - int cmaj; + static int tried = 0; int bmaj = major(rootdev); - int error = ENXIO; + int cmaj; -#ifdef KERNFS_DIAGNOSTIC - printf("kernfs_init\n"); /* printed during system boot */ -#endif + if (tried) { + /* Already did it once. */ + return; + } + tried = 1; if (!bdevsw[bmaj]) { panic("root dev has no bdevsw"); } + if (rootdev == NODEV) + return; for (cmaj = 0; cmaj < nchrdev; cmaj++) { - if (cdevsw[cmaj] - && (cdevsw[cmaj]->d_open == bdevsw[bmaj]->d_open)) { - dev_t cdev = makedev(cmaj, minor(rootdev)); - error = cdevvp(cdev, &rrootvp); - if (error == 0) - break; - } + rrootdev = makedev(cmaj, minor(rootdev)); + if (chrtoblk(rrootdev) == rootdev) + return; } - - if (error) { - printf("kernfs: no raw boot device\n"); - rrootvp = 0; - } - return (0); + rrootdev = NODEV; + printf("kernfs_get_rrootdev: no raw root device\n"); } /* @@ -182,7 +146,7 @@ kernfs_mount(mp, path, data, ndp, p) fmp->kf_root = rvp; mp->mnt_flag |= MNT_LOCAL; mp->mnt_data = (qaddr_t) fmp; - getnewfsid(mp, MOUNT_KERNFS); + vfs_getnewfsid(mp); (void) copyinstr(path, mp->mnt_stat.f_mntonname, MNAMELEN - 1, &size); bzero(mp->mnt_stat.f_mntonname + size, MNAMELEN - size); @@ -192,6 +156,8 @@ kernfs_mount(mp, path, data, ndp, p) #ifdef KERNFS_DIAGNOSTIC printf("kernfs_mount: at %s\n", mp->mnt_stat.f_mntonname); #endif + + kernfs_get_rrootdev(); return (0); } @@ -218,12 +184,8 @@ kernfs_unmount(mp, mntflags, p) printf("kernfs_unmount(mp = %x)\n", mp); #endif - if (mntflags & MNT_FORCE) { - /* kernfs can never be rootfs so don't check for it */ - if (!doforce) - return (EINVAL); + if (mntflags & MNT_FORCE) flags |= FORCECLOSE; - } /* * Clear out buffer cache. I don't think we @@ -263,6 +225,7 @@ kernfs_root(mp, vpp) struct mount *mp; struct vnode **vpp; { + struct proc *p = curproc; /* XXX */ struct vnode *vp; #ifdef KERNFS_DIAGNOSTIC @@ -274,23 +237,12 @@ kernfs_root(mp, vpp) */ vp = VFSTOKERNFS(mp)->kf_root; VREF(vp); - VOP_LOCK(vp); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); *vpp = vp; return (0); } static int -kernfs_quotactl(mp, cmd, uid, arg, p) - struct mount *mp; - int cmd; - uid_t uid; - caddr_t arg; - struct proc *p; -{ - return (EOPNOTSUPP); -} - -static int kernfs_statfs(mp, sbp, p) struct mount *mp; struct statfs *sbp; @@ -300,7 +252,6 @@ kernfs_statfs(mp, sbp, p) printf("kernfs_statfs(mp = %x)\n", mp); #endif - sbp->f_type = MOUNT_KERNFS; sbp->f_flags = 0; sbp->f_bsize = DEV_BSIZE; sbp->f_iosize = DEV_BSIZE; @@ -310,6 +261,7 @@ kernfs_statfs(mp, sbp, p) sbp->f_files = 0; sbp->f_ffree = 0; if (sbp != &mp->mnt_stat) { + sbp->f_type = mp->mnt_vfc->vfc_typenum; bcopy(&mp->mnt_stat.f_fsid, &sbp->f_fsid, sizeof(sbp->f_fsid)); bcopy(mp->mnt_stat.f_mntonname, sbp->f_mntonname, MNAMELEN); bcopy(mp->mnt_stat.f_mntfromname, sbp->f_mntfromname, MNAMELEN); @@ -317,53 +269,6 @@ kernfs_statfs(mp, sbp, p) return (0); } -static int -kernfs_sync(mp, waitfor, cred, p) - struct mount *mp; - int waitfor; - struct ucred *cred; - struct proc *p; -{ - - return (0); -} - -/* - * Kernfs flat namespace lookup. - * Currently unsupported. - */ -static int -kernfs_vget(mp, ino, vpp) - struct mount *mp; - ino_t ino; - struct vnode **vpp; -{ - - return (EOPNOTSUPP); -} - - -static int -kernfs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp) - struct mount *mp; - struct fid *fhp; - struct mbuf *nam; - struct vnode **vpp; - int *exflagsp; - struct ucred **credanonp; -{ - - return (EOPNOTSUPP); -} - -static int -kernfs_vptofh(vp, fhp) - struct vnode *vp; - struct fid *fhp; -{ - return (EOPNOTSUPP); -} - static struct vfsops kernfs_vfsops = { kernfs_mount, kernfs_start, |