* Shuffle some flags to make it easier to visually compare lists

of flags.
* In the new mount case, make sure to clear the mount "action" flags.
* Allow MNT_FORCE to be set by root on new mounts.
This commit is contained in:
thorpej 2003-10-13 18:02:20 +00:00
parent 595fb05c30
commit a58b40631e

View File

@ -1,4 +1,4 @@
/* $NetBSD: vfs_syscalls.c,v 1.194 2003/09/13 08:32:14 jdolecek Exp $ */
/* $NetBSD: vfs_syscalls.c,v 1.195 2003/10/13 18:02:20 thorpej Exp $ */
/*
* Copyright (c) 1989, 1993
@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.194 2003/09/13 08:32:14 jdolecek Exp $");
__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.195 2003/10/13 18:02:20 thorpej Exp $");
#include "opt_compat_netbsd.h"
#include "opt_compat_43.h"
@ -179,7 +179,7 @@ sys_mount(l, v, retval)
SCARG(uap, flags) != MNT_GETARGS &&
SCARG(uap, flags) !=
(mp->mnt_flag | MNT_RDONLY |
MNT_RELOAD | MNT_FORCE | MNT_UPDATE)) {
MNT_RELOAD | MNT_FORCE | MNT_UPDATE)) {
vput(vp);
return (EPERM);
}
@ -298,7 +298,14 @@ sys_mount(l, v, retval)
mp->mnt_vnodecovered = vp;
mp->mnt_stat.f_owner = p->p_ucred->cr_uid;
mp->mnt_unmounter = NULL;
update:
/*
* The underlying file system may refuse the mount for
* various reasons. Allow root to force it to happen.
*/
if (p->p_ucred->cr_uid == 0)
mp->mnt_flag |= SCARG(uap, flags) & MNT_FORCE;
update:
/*
* Set the mount level flags.
*/
@ -306,13 +313,15 @@ update:
mp->mnt_flag |= MNT_RDONLY;
else if (mp->mnt_flag & MNT_RDONLY)
mp->mnt_flag |= MNT_WANTRDWR;
mp->mnt_flag &=~ (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
mp->mnt_flag &=
~(MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOCOREDUMP |
MNT_NOATIME | MNT_NODEVMTIME | MNT_SYMPERM | MNT_SOFTDEP);
mp->mnt_flag |= SCARG(uap, flags) & (MNT_NOSUID | MNT_NOEXEC |
MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC |
MNT_NOCOREDUMP | MNT_IGNORE | MNT_NOATIME | MNT_NODEVMTIME |
MNT_SYMPERM | MNT_SOFTDEP);
mp->mnt_flag |= SCARG(uap, flags) &
(MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | MNT_NOCOREDUMP |
MNT_NOATIME | MNT_NODEVMTIME | MNT_SYMPERM | MNT_SOFTDEP |
MNT_IGNORE);
/*
* Mount the filesystem.
*/
@ -323,8 +332,8 @@ update:
if (error || (mp->mnt_flag & MNT_GETARGS))
mp->mnt_flag = flag;
mp->mnt_flag &=~
(MNT_UPDATE | MNT_RELOAD | MNT_FORCE | MNT_WANTRDWR |
MNT_GETARGS);
(MNT_RELOAD | MNT_FORCE | MNT_UPDATE | MNT_GETARGS |
MNT_WANTRDWR);
if ((mp->mnt_flag & (MNT_RDONLY | MNT_ASYNC)) == 0) {
if (mp->mnt_syncer == NULL)
error = vfs_allocate_syncvnode(mp);
@ -342,6 +351,9 @@ update:
*/
cache_purge(vp);
if (!error) {
mp->mnt_flag &=~
(MNT_RELOAD | MNT_FORCE | MNT_UPDATE | MNT_GETARGS |
MNT_WANTRDWR);
vp->v_mountedhere = mp;
simple_lock(&mountlist_slock);
CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);