|
|
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.