|
|
1.1 root 1: /*
2: * code related to mounting and unmounting filesystems
3: */
4: #include "sys/param.h"
5: #include "sys/user.h"
6: #include "sys/inode.h"
7: #include "sys/file.h"
8: #include "sys/conf.h"
9:
10: /*
11: * sys fmount
12: * call the filesystem-specific mount routine with
13: * the inode of the device to be mounted
14: * the inode of the mount point, still locked
15: * the flag argument
16: */
17:
18: fmount()
19: {
20: register struct a {
21: int fstype;
22: int fd;
23: char *name;
24: int flag;
25: } *uap = (struct a *)u.u_ap;
26: struct file *fp;
27: struct inode *ip;
28:
29: if (uap->fstype < 0 || uap->fstype >= nfstyp
30: || fstypsw[uap->fstype] == NULL) {
31: u.u_error = EINVAL;
32: return;
33: }
34: if ((fp = getf(uap->fd)) == NULL) {
35: u.u_error = EBADF;
36: return;
37: }
38: if ((ip = namei(uap->name, SEGUDATA, &nilargnamei, 1)) == NULL)
39: return;
40: (*fstypsw[uap->fstype]->t_mount)(fp->f_inode, ip, uap->flag, 1, uap->fstype);
41: iput(ip);
42: }
43:
44: /*
45: * sys funmount
46: * call the fs-particular unmount routine with
47: * the inode of the mount point
48: */
49:
50: funmount()
51: {
52: struct a {
53: char *name;
54: } *uap = (struct a *)u.u_ap;
55: struct inode *ip, *mip;
56:
57: if ((ip = namei(uap->name, SEGUDATA, &nilargnamei, 1)) == NULL)
58: return;
59: if ((mip = ip->i_mpoint) == NULL
60: || mip->i_mroot != ip) { /* sanity, also catches root */
61: iput(ip);
62: u.u_error = EINVAL;
63: return;
64: }
65: iput(ip); /* bag this? */
66: (*fstypsw[ip->i_fstyp]->t_mount)((struct inode *)NULL, mip, 0, 0, ip->i_fstyp);
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.