|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989, 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution is only permitted until one year after the first shipment ! 6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and ! 7: * binary forms are permitted provided that: (1) source distributions retain ! 8: * this entire copyright notice and comment, and (2) distributions including ! 9: * binaries display the following acknowledgement: This product includes ! 10: * software developed by the University of California, Berkeley and its ! 11: * contributors'' in the documentation or other materials provided with the ! 12: * distribution and in all advertising materials mentioning features or use ! 13: * of this software. Neither the name of the University nor the names of ! 14: * its contributors may be used to endorse or promote products derived from ! 15: * this software without specific prior written permission. ! 16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 19: * ! 20: * @(#)mfs_vfsops.c 7.17 (Berkeley) 6/28/90 ! 21: */ ! 22: ! 23: #include "param.h" ! 24: #include "time.h" ! 25: #include "kernel.h" ! 26: #include "user.h" ! 27: #include "proc.h" ! 28: #include "buf.h" ! 29: #include "mount.h" ! 30: #include "vnode.h" ! 31: #include "../ufs/quota.h" ! 32: #include "../ufs/inode.h" ! 33: #include "../ufs/ufsmount.h" ! 34: #include "../ufs/mfsnode.h" ! 35: #include "../ufs/fs.h" ! 36: ! 37: extern struct vnodeops mfs_vnodeops; ! 38: ! 39: /* ! 40: * mfs vfs operations. ! 41: */ ! 42: int mfs_mount(); ! 43: int mfs_start(); ! 44: int ufs_unmount(); ! 45: int ufs_root(); ! 46: int ufs_quotactl(); ! 47: int mfs_statfs(); ! 48: int ufs_sync(); ! 49: int ufs_fhtovp(); ! 50: int ufs_vptofh(); ! 51: int mfs_init(); ! 52: ! 53: struct vfsops mfs_vfsops = { ! 54: mfs_mount, ! 55: mfs_start, ! 56: ufs_unmount, ! 57: ufs_root, ! 58: ufs_quotactl, ! 59: mfs_statfs, ! 60: ufs_sync, ! 61: ufs_fhtovp, ! 62: ufs_vptofh, ! 63: mfs_init, ! 64: }; ! 65: ! 66: /* ! 67: * VFS Operations. ! 68: * ! 69: * mount system call ! 70: */ ! 71: /* ARGSUSED */ ! 72: mfs_mount(mp, path, data, ndp) ! 73: register struct mount *mp; ! 74: char *path; ! 75: caddr_t data; ! 76: struct nameidata *ndp; ! 77: { ! 78: struct vnode *devvp; ! 79: struct mfs_args args; ! 80: struct ufsmount *ump; ! 81: register struct fs *fs; ! 82: register struct mfsnode *mfsp; ! 83: static int mfs_minor; ! 84: u_int size; ! 85: int error; ! 86: ! 87: if (mp->mnt_flag & MNT_UPDATE) { ! 88: ump = VFSTOUFS(mp); ! 89: fs = ump->um_fs; ! 90: if (fs->fs_ronly && (mp->mnt_flag & MNT_RDONLY) == 0) ! 91: fs->fs_ronly = 0; ! 92: return (0); ! 93: } ! 94: if (error = copyin(data, (caddr_t)&args, sizeof (struct mfs_args))) ! 95: return (error); ! 96: error = getnewvnode(VT_MFS, (struct mount *)0, &mfs_vnodeops, &devvp); ! 97: if (error) ! 98: return (error); ! 99: devvp->v_type = VBLK; ! 100: if (checkalias(devvp, makedev(255, mfs_minor++), (struct mount *)0)) ! 101: panic("mfs_mount: dup dev"); ! 102: mfsp = VTOMFS(devvp); ! 103: mfsp->mfs_baseoff = args.base; ! 104: mfsp->mfs_size = args.size; ! 105: mfsp->mfs_vnode = devvp; ! 106: mfsp->mfs_pid = u.u_procp->p_pid; ! 107: mfsp->mfs_buflist = (struct buf *)0; ! 108: if (error = mountfs(devvp, mp)) { ! 109: mfsp->mfs_buflist = (struct buf *)-1; ! 110: vrele(devvp); ! 111: return (error); ! 112: } ! 113: ump = VFSTOUFS(mp); ! 114: fs = ump->um_fs; ! 115: (void) copyinstr(path, fs->fs_fsmnt, sizeof(fs->fs_fsmnt) - 1, &size); ! 116: bzero(fs->fs_fsmnt + size, sizeof(fs->fs_fsmnt) - size); ! 117: bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)mp->mnt_stat.f_mntonname, ! 118: MNAMELEN); ! 119: (void) copyinstr(args.name, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, ! 120: &size); ! 121: bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size); ! 122: (void) mfs_statfs(mp, &mp->mnt_stat); ! 123: return (0); ! 124: } ! 125: ! 126: int mfs_pri = PWAIT | PCATCH; /* XXX prob. temp */ ! 127: ! 128: /* ! 129: * Used to grab the process and keep it in the kernel to service ! 130: * memory filesystem I/O requests. ! 131: * ! 132: * Loop servicing I/O requests. ! 133: * Copy the requested data into or out of the memory filesystem ! 134: * address space. ! 135: */ ! 136: /* ARGSUSED */ ! 137: mfs_start(mp, flags) ! 138: struct mount *mp; ! 139: int flags; ! 140: { ! 141: register struct vnode *vp = VFSTOUFS(mp)->um_devvp; ! 142: register struct mfsnode *mfsp = VTOMFS(vp); ! 143: register struct buf *bp; ! 144: register caddr_t base; ! 145: struct proc *p = u.u_procp; ! 146: int error = 0; ! 147: ! 148: base = mfsp->mfs_baseoff; ! 149: while (mfsp->mfs_buflist != (struct buf *)(-1)) { ! 150: while (bp = mfsp->mfs_buflist) { ! 151: mfsp->mfs_buflist = bp->av_forw; ! 152: mfs_doio(bp, base); ! 153: wakeup((caddr_t)bp); ! 154: } ! 155: /* ! 156: * If a non-ignored signal is received, try to unmount. ! 157: * If that fails, clear the signal (it has been "processed"), ! 158: * otherwise we will loop here, as tsleep will always return ! 159: * EINTR/ERESTART. ! 160: */ ! 161: if (error = tsleep((caddr_t)vp, mfs_pri, "mfsidl", 0)) ! 162: if (dounmount(mp, MNT_NOFORCE) != 0) ! 163: CLRSIG(p, CURSIG(p)); ! 164: } ! 165: return (error); ! 166: } ! 167: ! 168: /* ! 169: * Get file system statistics. ! 170: */ ! 171: mfs_statfs(mp, sbp) ! 172: struct mount *mp; ! 173: struct statfs *sbp; ! 174: { ! 175: int error; ! 176: ! 177: error = ufs_statfs(mp, sbp); ! 178: sbp->f_type = MOUNT_MFS; ! 179: return (error); ! 180: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.