summaryrefslogtreecommitdiffstats
path: root/sys/ufs/mfs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ufs/mfs')
-rw-r--r--sys/ufs/mfs/mfs_extern.h8
-rw-r--r--sys/ufs/mfs/mfs_vfsops.c67
-rw-r--r--sys/ufs/mfs/mfs_vnops.c112
-rw-r--r--sys/ufs/mfs/mfsnode.h8
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)
OpenPOWER on IntegriCloud