diff options
Diffstat (limited to 'sys/ufs/mfs')
-rw-r--r-- | sys/ufs/mfs/mfs_extern.h | 8 | ||||
-rw-r--r-- | sys/ufs/mfs/mfs_vfsops.c | 67 | ||||
-rw-r--r-- | sys/ufs/mfs/mfs_vnops.c | 112 | ||||
-rw-r--r-- | sys/ufs/mfs/mfsnode.h | 8 |
4 files changed, 49 insertions, 146 deletions
diff --git a/sys/ufs/mfs/mfs_extern.h b/sys/ufs/mfs/mfs_extern.h index e357faf6..51cf8da 100644 --- a/sys/ufs/mfs/mfs_extern.h +++ b/sys/ufs/mfs/mfs_extern.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mfs_extern.h 8.1 (Berkeley) 6/11/93 + * @(#)mfs_extern.h 8.4 (Berkeley) 3/30/95 */ struct buf; @@ -40,6 +40,7 @@ struct proc; struct statfs; struct ucred; struct vnode; +struct vfsconf; __BEGIN_DECLS int mfs_badop __P((void)); @@ -47,13 +48,14 @@ int mfs_bmap __P((struct vop_bmap_args *)); int mfs_close __P((struct vop_close_args *)); void mfs_doio __P((struct buf *bp, caddr_t base)); int mfs_inactive __P((struct vop_inactive_args *)); /* XXX */ -int mfs_reclaim __P((struct vop_reclaim_args *)); /* XXX */ -int mfs_init __P((void)); +int mfs_reclaim __P((struct vop_reclaim_args *)); +int mfs_init __P((struct vfsconf *)); int mfs_ioctl __P((struct vop_ioctl_args *)); int mfs_mount __P((struct mount *mp, char *path, caddr_t data, struct nameidata *ndp, struct proc *p)); int mfs_open __P((struct vop_open_args *)); int mfs_print __P((struct vop_print_args *)); /* XXX */ +#define mfs_revoke vop_revoke int mfs_start __P((struct mount *mp, int flags, struct proc *p)); int mfs_statfs __P((struct mount *mp, struct statfs *sbp, struct proc *p)); int mfs_strategy __P((struct vop_strategy_args *)); /* XXX */ diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c index 3fcbdf3..15a4be2 100644 --- a/sys/ufs/mfs/mfs_vfsops.c +++ b/sys/ufs/mfs/mfs_vfsops.c @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mfs_vfsops.c 8.4 (Berkeley) 4/16/94 + * @(#)mfs_vfsops.c 8.11 (Berkeley) 6/19/95 */ #include <sys/param.h> @@ -77,36 +77,32 @@ struct vfsops mfs_vfsops = { ffs_fhtovp, ffs_vptofh, mfs_init, + ffs_sysctl, }; /* * Called by main() when mfs is going to be mounted as root. - * - * Name is updated by mount(8) after booting. */ -#define ROOTNAME "mfs_root" - mfs_mountroot() { extern struct vnode *rootvp; - register struct fs *fs; - register struct mount *mp; + struct fs *fs; + struct mount *mp; struct proc *p = curproc; /* XXX */ struct ufsmount *ump; struct mfsnode *mfsp; - u_int size; int error; /* * Get vnodes for swapdev and rootdev. */ - if (bdevvp(swapdev, &swapdev_vp) || bdevvp(rootdev, &rootvp)) - panic("mfs_mountroot: can't setup bdevvp's"); - - mp = malloc((u_long)sizeof(struct mount), M_MOUNT, M_WAITOK); - bzero((char *)mp, (u_long)sizeof(struct mount)); - mp->mnt_op = &mfs_vfsops; - mp->mnt_flag = MNT_RDONLY; + if ((error = bdevvp(swapdev, &swapdev_vp)) || + (error = bdevvp(rootdev, &rootvp))) { + printf("mfs_mountroot: can't setup bdevvp's"); + return (error); + } + if (error = vfs_rootmountalloc("mfs", "mfs_root", &mp)) + return (error); mfsp = malloc(sizeof *mfsp, M_MFSNODE, M_WAITOK); rootvp->v_data = mfsp; rootvp->v_op = mfs_vnodeop_p; @@ -117,30 +113,20 @@ mfs_mountroot() mfsp->mfs_pid = p->p_pid; mfsp->mfs_buflist = (struct buf *)0; if (error = ffs_mountfs(rootvp, mp, p)) { + mp->mnt_vfc->vfc_refcount--; + vfs_unbusy(mp, p); free(mp, M_MOUNT); free(mfsp, M_MFSNODE); return (error); } - if (error = vfs_lock(mp)) { - (void)ffs_unmount(mp, 0, p); - free(mp, M_MOUNT); - free(mfsp, M_MFSNODE); - return (error); - } - TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list); - mp->mnt_flag |= MNT_ROOTFS; - mp->mnt_vnodecovered = NULLVP; + simple_lock(&mountlist_slock); + CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list); + simple_unlock(&mountlist_slock); ump = VFSTOUFS(mp); fs = ump->um_fs; - bzero(fs->fs_fsmnt, sizeof(fs->fs_fsmnt)); - fs->fs_fsmnt[0] = '/'; - bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)mp->mnt_stat.f_mntonname, - MNAMELEN); - (void) copystr(ROOTNAME, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, - &size); - bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size); + (void) copystr(mp->mnt_stat.f_mntonname, fs->fs_fsmnt, MNAMELEN - 1, 0); (void)ffs_statfs(mp, &mp->mnt_stat, p); - vfs_unlock(mp); + vfs_unbusy(mp, p); inittodr((time_t)0); return (0); } @@ -202,11 +188,7 @@ mfs_mount(mp, path, data, ndp, p) flags = WRITECLOSE; if (mp->mnt_flag & MNT_FORCE) flags |= FORCECLOSE; - if (vfs_busy(mp)) - return (EBUSY); - error = ffs_flushfiles(mp, flags, p); - vfs_unbusy(mp); - if (error) + if (error = ffs_flushfiles(mp, flags, p)) return (error); } if (fs->fs_ronly && (mp->mnt_flag & MNT_WANTRDWR)) @@ -269,7 +251,6 @@ mfs_start(mp, flags, p) register struct mfsnode *mfsp = VTOMFS(vp); register struct buf *bp; register caddr_t base; - int error = 0; base = mfsp->mfs_baseoff; while (mfsp->mfs_buflist != (struct buf *)(-1)) { @@ -284,11 +265,11 @@ mfs_start(mp, flags, p) * otherwise we will loop here, as tsleep will always return * EINTR/ERESTART. */ - if (error = tsleep((caddr_t)vp, mfs_pri, "mfsidl", 0)) - if (dounmount(mp, 0, p) != 0) - CLRSIG(p, CURSIG(p)); + if (tsleep((caddr_t)vp, mfs_pri, "mfsidl", 0) && + dounmount(mp, 0, p) != 0) + CLRSIG(p, CURSIG(p)); } - return (error); + return (0); } /* @@ -302,6 +283,6 @@ mfs_statfs(mp, sbp, p) int error; error = ffs_statfs(mp, sbp, p); - sbp->f_type = MOUNT_MFS; + sbp->f_type = mp->mnt_vfc->vfc_typenum; return (error); } diff --git a/sys/ufs/mfs/mfs_vnops.c b/sys/ufs/mfs/mfs_vnops.c index 71adf06..4a0a28b 100644 --- a/sys/ufs/mfs/mfs_vnops.c +++ b/sys/ufs/mfs/mfs_vnops.c @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mfs_vnops.c 8.3 (Berkeley) 9/21/93 + * @(#)mfs_vnops.c 8.11 (Berkeley) 5/22/95 */ #include <sys/param.h> @@ -51,12 +51,6 @@ #include <ufs/mfs/mfsiom.h> #include <ufs/mfs/mfs_extern.h> -#if !defined(hp300) && !defined(i386) && !defined(mips) && !defined(sparc) && !defined(luna68k) -static int mfsmap_want; /* 1 => need kernel I/O resources */ -struct map mfsmap[MFS_MAPSIZE]; -extern char mfsiobuf[]; -#endif - /* * mfs vnode operations. */ @@ -75,6 +69,7 @@ struct vnodeopv_entry_desc mfs_vnodeop_entries[] = { { &vop_write_desc, mfs_write }, /* write */ { &vop_ioctl_desc, mfs_ioctl }, /* ioctl */ { &vop_select_desc, mfs_select }, /* select */ + { &vop_revoke_desc, mfs_revoke }, /* revoke */ { &vop_mmap_desc, mfs_mmap }, /* mmap */ { &vop_fsync_desc, spec_fsync }, /* fsync */ { &vop_seek_desc, mfs_seek }, /* seek */ @@ -189,85 +184,6 @@ mfs_strategy(ap) return (0); } -#if defined(vax) || defined(tahoe) -/* - * Memory file system I/O. - * - * Essentially play ubasetup() and disk interrupt service routine by - * doing the copies to or from the memfs process. If doing physio - * (i.e. pagein), we must map the I/O through the kernel virtual - * address space. - */ -void -mfs_doio(bp, base) - register struct buf *bp; - caddr_t base; -{ - register struct pte *pte, *ppte; - register caddr_t vaddr; - int off, npf, npf2, reg; - caddr_t kernaddr, offset; - - /* - * For phys I/O, map the b_data into kernel virtual space using - * the Mfsiomap pte's. - */ - if ((bp->b_flags & B_PHYS) == 0) { - kernaddr = bp->b_data; - } else { - if (bp->b_flags & (B_PAGET | B_UAREA | B_DIRTY)) - panic("swap on memfs?"); - off = (int)bp->b_data & PGOFSET; - npf = btoc(bp->b_bcount + off); - /* - * Get some mapping page table entries - */ - while ((reg = rmalloc(mfsmap, (long)npf)) == 0) { - mfsmap_want++; - sleep((caddr_t)&mfsmap_want, PZERO-1); - } - reg--; - pte = vtopte(bp->b_proc, btop(bp->b_data)); - /* - * Do vmaccess() but with the Mfsiomap page table. - */ - ppte = &Mfsiomap[reg]; - vaddr = &mfsiobuf[reg * NBPG]; - kernaddr = vaddr + off; - for (npf2 = npf; npf2; npf2--) { - mapin(ppte, (u_int)vaddr, pte->pg_pfnum, - (int)(PG_V|PG_KW)); -#if defined(tahoe) - if ((bp->b_flags & B_READ) == 0) - mtpr(P1DC, vaddr); -#endif - ppte++; - pte++; - vaddr += NBPG; - } - } - offset = base + (bp->b_blkno << DEV_BSHIFT); - if (bp->b_flags & B_READ) - bp->b_error = copyin(offset, kernaddr, bp->b_bcount); - else - bp->b_error = copyout(kernaddr, offset, bp->b_bcount); - if (bp->b_error) - bp->b_flags |= B_ERROR; - /* - * Release pte's used by physical I/O. - */ - if (bp->b_flags & B_PHYS) { - rmfree(mfsmap, (long)npf, (long)++reg); - if (mfsmap_want) { - mfsmap_want = 0; - wakeup((caddr_t)&mfsmap_want); - } - } - biodone(bp); -} -#endif /* vax || tahoe */ - -#if defined(hp300) || defined(i386) || defined(mips) || defined(sparc) || defined(luna68k) /* * Memory file system I/O. * @@ -288,7 +204,6 @@ mfs_doio(bp, base) bp->b_flags |= B_ERROR; biodone(bp); } -#endif /* * This is a noop, simply returning what one has been given. @@ -297,9 +212,9 @@ int mfs_bmap(ap) struct vop_bmap_args /* { struct vnode *a_vp; - daddr_t a_bn; + ufs_daddr_t a_bn; struct vnode **a_vpp; - daddr_t *a_bnp; + ufs_daddr_t *a_bnp; int *a_runp; } */ *ap; { @@ -308,6 +223,8 @@ mfs_bmap(ap) *ap->a_vpp = ap->a_vp; if (ap->a_bnp != NULL) *ap->a_bnp = ap->a_bn; + if (ap->a_runp != NULL) + *ap->a_runp = 0; return (0); } @@ -368,13 +285,16 @@ int mfs_inactive(ap) struct vop_inactive_args /* { struct vnode *a_vp; + struct proc *a_p; } */ *ap; { - register struct mfsnode *mfsp = VTOMFS(ap->a_vp); + struct vnode *vp = ap->a_vp; + struct mfsnode *mfsp = VTOMFS(vp); if (mfsp->mfs_buflist && mfsp->mfs_buflist != (struct buf *)(-1)) panic("mfs_inactive: not inactive (mfs_buflist %x)", mfsp->mfs_buflist); + VOP_UNLOCK(vp, 0, ap->a_p); return (0); } @@ -387,9 +307,10 @@ mfs_reclaim(ap) struct vnode *a_vp; } */ *ap; { + register struct vnode *vp = ap->a_vp; - FREE(ap->a_vp->v_data, M_MFSNODE); - ap->a_vp->v_data = NULL; + FREE(vp->v_data, M_MFSNODE); + vp->v_data = NULL; return (0); } @@ -423,10 +344,9 @@ mfs_badop() /* * Memory based filesystem initialization. */ -mfs_init() +mfs_init(vfsp) + struct vfsconf *vfsp; { -#if !defined(hp300) && !defined(i386) && !defined(mips) && !defined(sparc) && !defined(luna68k) - rminit(mfsmap, (long)MFS_MAPREG, (long)1, "mfs mapreg", MFS_MAPSIZE); -#endif + return; } diff --git a/sys/ufs/mfs/mfsnode.h b/sys/ufs/mfs/mfsnode.h index 4480ab0..3d8a3b6 100644 --- a/sys/ufs/mfs/mfsnode.h +++ b/sys/ufs/mfs/mfsnode.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)mfsnode.h 8.2 (Berkeley) 8/11/93 + * @(#)mfsnode.h 8.3 (Berkeley) 5/19/95 */ /* @@ -73,9 +73,9 @@ struct mfsnode { #define mfs_readdir ((int (*) __P((struct vop_readdir_args *)))mfs_badop) #define mfs_readlink ((int (*) __P((struct vop_readlink_args *)))mfs_badop) #define mfs_abortop ((int (*) __P((struct vop_abortop_args *)))mfs_badop) -#define mfs_lock ((int (*) __P((struct vop_lock_args *)))nullop) -#define mfs_unlock ((int (*) __P((struct vop_unlock_args *)))nullop) -#define mfs_islocked ((int (*) __P((struct vop_islocked_args *)))nullop) +#define mfs_lock ((int (*) __P((struct vop_lock_args *)))vop_nolock) +#define mfs_unlock ((int (*) __P((struct vop_unlock_args *)))vop_nounlock) +#define mfs_islocked ((int(*) __P((struct vop_islocked_args *)))vop_noislocked) #define mfs_pathconf ((int (*) __P((struct vop_pathconf_args *)))mfs_badop) #define mfs_advlock ((int (*) __P((struct vop_advlock_args *)))mfs_badop) #define mfs_blkatoff ((int (*) __P((struct vop_blkatoff_args *)))mfs_badop) |