- mp->m_op = vfssw[uap->type];
- mp->m_flag = 0;
- mp->m_exroot = 0;
- error = vfs_add(vp, mp, uap->flags);
- if (!error)
- error = VFS_MOUNT(mp, uap->dir, uap->data, ndp);
+ mp->mnt_op = vfssw[uap->type];
+ mp->mnt_flag = 0;
+ mp->mnt_exroot = 0;
+ mp->mnt_mounth = NULLVP;
+ if (error = vfs_lock(mp)) {
+ free((caddr_t)mp, M_MOUNT);
+ vput(vp);
+ RETURN (error);
+ }
+ if (vp->v_mountedhere != (struct mount *)0) {
+ vfs_unlock(mp);
+ free((caddr_t)mp, M_MOUNT);
+ vput(vp);
+ RETURN (EBUSY);
+ }
+ vp->v_mountedhere = mp;
+ mp->mnt_vnodecovered = vp;
+update:
+ /*
+ * Set the mount level flags.
+ */
+ if (uap->flags & MNT_RDONLY)
+ mp->mnt_flag |= MNT_RDONLY;
+ else
+ mp->mnt_flag &= ~MNT_RDONLY;
+ if (uap->flags & MNT_NOSUID)
+ mp->mnt_flag |= MNT_NOSUID;
+ else
+ mp->mnt_flag &= ~MNT_NOSUID;
+ if (uap->flags & MNT_NOEXEC)
+ mp->mnt_flag |= MNT_NOEXEC;
+ else
+ mp->mnt_flag &= ~MNT_NOEXEC;
+ if (uap->flags & MNT_NODEV)
+ mp->mnt_flag |= MNT_NODEV;
+ else
+ mp->mnt_flag &= ~MNT_NODEV;
+ if (uap->flags & MNT_SYNCHRONOUS)
+ mp->mnt_flag |= MNT_SYNCHRONOUS;
+ else
+ mp->mnt_flag &= ~MNT_SYNCHRONOUS;
+ /*
+ * Mount the filesystem.
+ */
+ error = VFS_MOUNT(mp, uap->dir, uap->data, ndp);
+ if (mp->mnt_flag & MNT_UPDATE) {
+ mp->mnt_flag &= ~MNT_UPDATE;
+ vrele(vp);
+ if (error)
+ mp->mnt_flag = flag;
+ RETURN (error);
+ }
+ /*
+ * Put the new filesystem on the mount list after root.
+ */
+ mp->mnt_next = rootfs->mnt_next;
+ mp->mnt_prev = rootfs;
+ rootfs->mnt_next = mp;
+ mp->mnt_next->mnt_prev = mp;