summaryrefslogtreecommitdiffstats
path: root/sys/miscfs/kernfs/kernfs_vfsops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/miscfs/kernfs/kernfs_vfsops.c')
-rw-r--r--sys/miscfs/kernfs/kernfs_vfsops.c153
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,
OpenPOWER on IntegriCloud