Commit | Line | Data |
---|---|---|
d37d3579 | 1 | /* |
96f07863 | 2 | * Copyright (c) 1989, 1990 The Regents of the University of California. |
d37d3579 KM |
3 | * All rights reserved. |
4 | * | |
b702c21d | 5 | * %sccs.include.redist.c% |
d37d3579 | 6 | * |
893442f5 | 7 | * @(#)mfs_vfsops.c 7.20 (Berkeley) %G% |
d37d3579 KM |
8 | */ |
9 | ||
893442f5 KB |
10 | #include <sys/param.h> |
11 | #include <sys/time.h> | |
12 | #include <sys/kernel.h> | |
13 | #include <sys/proc.h> | |
14 | #include <sys/buf.h> | |
15 | #include <sys/mount.h> | |
16 | #include <sys/signalvar.h> | |
17 | #include <sys/vnode.h> | |
c6f5111d | 18 | |
893442f5 KB |
19 | #include <ufs/ufs/quota.h> |
20 | #include <ufs/ufs/inode.h> | |
21 | #include <ufs/ufs/ufsmount.h> | |
22 | #include <ufs/ufs/ufs_extern.h> | |
23 | ||
24 | #include <ufs/ffs/fs.h> | |
25 | #include <ufs/ffs/ffs_extern.h> | |
26 | ||
27 | #include <ufs/mfs/mfsnode.h> | |
28 | #include <ufs/mfs/mfs_extern.h> | |
d37d3579 | 29 | |
d37d3579 KM |
30 | extern struct vnodeops mfs_vnodeops; |
31 | ||
32 | /* | |
33 | * mfs vfs operations. | |
34 | */ | |
d37d3579 KM |
35 | struct vfsops mfs_vfsops = { |
36 | mfs_mount, | |
37 | mfs_start, | |
893442f5 | 38 | ffs_unmount, |
d37d3579 | 39 | ufs_root, |
85eb05b7 | 40 | ufs_quotactl, |
c2e4318a | 41 | mfs_statfs, |
893442f5 | 42 | ffs_sync, |
d37d3579 KM |
43 | ufs_fhtovp, |
44 | ufs_vptofh, | |
13b2a169 | 45 | mfs_init, |
d37d3579 KM |
46 | }; |
47 | ||
48 | /* | |
49 | * VFS Operations. | |
50 | * | |
51 | * mount system call | |
52 | */ | |
a3e73aa4 | 53 | /* ARGSUSED */ |
893442f5 | 54 | int |
5ec911fb | 55 | mfs_mount(mp, path, data, ndp, p) |
bd9b3f52 | 56 | register struct mount *mp; |
d37d3579 KM |
57 | char *path; |
58 | caddr_t data; | |
59 | struct nameidata *ndp; | |
5ec911fb | 60 | struct proc *p; |
d37d3579 KM |
61 | { |
62 | struct vnode *devvp; | |
63 | struct mfs_args args; | |
64 | struct ufsmount *ump; | |
65 | register struct fs *fs; | |
a3e73aa4 | 66 | register struct mfsnode *mfsp; |
d37d3579 KM |
67 | static int mfs_minor; |
68 | u_int size; | |
69 | int error; | |
70 | ||
82161bc8 | 71 | if (mp->mnt_flag & MNT_UPDATE) { |
413e9235 KM |
72 | ump = VFSTOUFS(mp); |
73 | fs = ump->um_fs; | |
82161bc8 | 74 | if (fs->fs_ronly && (mp->mnt_flag & MNT_RDONLY) == 0) |
413e9235 KM |
75 | fs->fs_ronly = 0; |
76 | return (0); | |
77 | } | |
d37d3579 KM |
78 | if (error = copyin(data, (caddr_t)&args, sizeof (struct mfs_args))) |
79 | return (error); | |
a3e73aa4 KM |
80 | error = getnewvnode(VT_MFS, (struct mount *)0, &mfs_vnodeops, &devvp); |
81 | if (error) | |
d37d3579 | 82 | return (error); |
a3e73aa4 | 83 | devvp->v_type = VBLK; |
43fc727e | 84 | if (checkalias(devvp, makedev(255, mfs_minor++), (struct mount *)0)) |
13b2a169 | 85 | panic("mfs_mount: dup dev"); |
a3e73aa4 KM |
86 | mfsp = VTOMFS(devvp); |
87 | mfsp->mfs_baseoff = args.base; | |
88 | mfsp->mfs_size = args.size; | |
89 | mfsp->mfs_vnode = devvp; | |
5ec911fb | 90 | mfsp->mfs_pid = p->p_pid; |
a3e73aa4 | 91 | mfsp->mfs_buflist = (struct buf *)0; |
893442f5 | 92 | if (error = ffs_mountfs(devvp, mp, p)) { |
edb9fbd0 | 93 | mfsp->mfs_buflist = (struct buf *)-1; |
d37d3579 KM |
94 | vrele(devvp); |
95 | return (error); | |
96 | } | |
97 | ump = VFSTOUFS(mp); | |
98 | fs = ump->um_fs; | |
99 | (void) copyinstr(path, fs->fs_fsmnt, sizeof(fs->fs_fsmnt) - 1, &size); | |
100 | bzero(fs->fs_fsmnt + size, sizeof(fs->fs_fsmnt) - size); | |
82161bc8 KM |
101 | bcopy((caddr_t)fs->fs_fsmnt, (caddr_t)mp->mnt_stat.f_mntonname, |
102 | MNAMELEN); | |
103 | (void) copyinstr(args.name, mp->mnt_stat.f_mntfromname, MNAMELEN - 1, | |
bd9b3f52 | 104 | &size); |
82161bc8 | 105 | bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size); |
893442f5 | 106 | (void) mfs_statfs(mp, &mp->mnt_stat, p); |
d37d3579 KM |
107 | return (0); |
108 | } | |
109 | ||
96f07863 MK |
110 | int mfs_pri = PWAIT | PCATCH; /* XXX prob. temp */ |
111 | ||
d37d3579 KM |
112 | /* |
113 | * Used to grab the process and keep it in the kernel to service | |
114 | * memory filesystem I/O requests. | |
115 | * | |
116 | * Loop servicing I/O requests. | |
117 | * Copy the requested data into or out of the memory filesystem | |
118 | * address space. | |
119 | */ | |
120 | /* ARGSUSED */ | |
893442f5 | 121 | int |
5ec911fb | 122 | mfs_start(mp, flags, p) |
d37d3579 KM |
123 | struct mount *mp; |
124 | int flags; | |
5ec911fb | 125 | struct proc *p; |
d37d3579 KM |
126 | { |
127 | register struct vnode *vp = VFSTOUFS(mp)->um_devvp; | |
a3e73aa4 | 128 | register struct mfsnode *mfsp = VTOMFS(vp); |
d37d3579 KM |
129 | register struct buf *bp; |
130 | register caddr_t base; | |
96f07863 | 131 | int error = 0; |
d37d3579 | 132 | |
a3e73aa4 | 133 | base = mfsp->mfs_baseoff; |
a3e73aa4 KM |
134 | while (mfsp->mfs_buflist != (struct buf *)(-1)) { |
135 | while (bp = mfsp->mfs_buflist) { | |
136 | mfsp->mfs_buflist = bp->av_forw; | |
ba72b75d KM |
137 | mfs_doio(bp, base); |
138 | wakeup((caddr_t)bp); | |
139 | } | |
17a10355 MK |
140 | /* |
141 | * If a non-ignored signal is received, try to unmount. | |
142 | * If that fails, clear the signal (it has been "processed"), | |
143 | * otherwise we will loop here, as tsleep will always return | |
144 | * EINTR/ERESTART. | |
145 | */ | |
146 | if (error = tsleep((caddr_t)vp, mfs_pri, "mfsidl", 0)) | |
5ec911fb | 147 | if (dounmount(mp, MNT_NOFORCE, p) != 0) |
17a10355 | 148 | CLRSIG(p, CURSIG(p)); |
d37d3579 | 149 | } |
96f07863 | 150 | return (error); |
d37d3579 | 151 | } |
c2e4318a KM |
152 | |
153 | /* | |
154 | * Get file system statistics. | |
155 | */ | |
5ec911fb | 156 | mfs_statfs(mp, sbp, p) |
c2e4318a KM |
157 | struct mount *mp; |
158 | struct statfs *sbp; | |
5ec911fb | 159 | struct proc *p; |
c2e4318a KM |
160 | { |
161 | int error; | |
162 | ||
893442f5 | 163 | error = ffs_statfs(mp, sbp, p); |
c2e4318a KM |
164 | sbp->f_type = MOUNT_MFS; |
165 | return (error); | |
166 | } |