do not return from sigsuspend prematurely
[unix-history] / usr / src / sys / kern / vfs_syscalls.c
index 5fb335d..de3a53f 100644 (file)
@@ -4,22 +4,23 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)vfs_syscalls.c      7.98 (Berkeley) %G%
+ *     @(#)vfs_syscalls.c      7.102 (Berkeley) %G%
  */
 
  */
 
-#include "param.h"
-#include "systm.h"
-#include "namei.h"
-#include "filedesc.h"
-#include "kernel.h"
-#include "file.h"
-#include "stat.h"
-#include "vnode.h"
-#include "mount.h"
-#include "proc.h"
-#include "uio.h"
-#include "malloc.h"
-#include "dirent.h"
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/vnode.h>
+#include <sys/mount.h>
+#include <sys/proc.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+#include <sys/dirent.h>
+
 #include <vm/vm.h>
 
 #ifdef REF_DIAGNOSTIC
 #include <vm/vm.h>
 
 #ifdef REF_DIAGNOSTIC
@@ -74,17 +75,18 @@ mount(p, uap, retval)
                        return (EINVAL);
                }
                mp = vp->v_mount;
                        return (EINVAL);
                }
                mp = vp->v_mount;
+               flag = mp->mnt_flag;
                /*
                /*
-                * We allow going from read-only to read-write,
-                * but not from read-write to read-only.
+                * We only allow the filesystem to be reloaded if it
+                * is currently mounted read-only.
                 */
                 */
-               if ((mp->mnt_flag & MNT_RDONLY) == 0 &&
-                   (uap->flags & MNT_RDONLY) != 0) {
+               if ((uap->flags & MNT_RELOAD) &&
+                   ((mp->mnt_flag & MNT_RDONLY) == 0)) {
                        vput(vp);
                        return (EOPNOTSUPP);    /* Needs translation */
                }
                        vput(vp);
                        return (EOPNOTSUPP);    /* Needs translation */
                }
-               flag = mp->mnt_flag;
-               mp->mnt_flag |= MNT_UPDATE;
+               mp->mnt_flag |=
+                   uap->flags & (MNT_RELOAD | MNT_FORCE | MNT_UPDATE);
                VOP_UNLOCK(vp);
                goto update;
        }
                VOP_UNLOCK(vp);
                goto update;
        }
@@ -92,7 +94,7 @@ mount(p, uap, retval)
                vput(vp);
                return (EBUSY);
        }
                vput(vp);
                return (EBUSY);
        }
-       if (error = vinvalbuf(vp, 1, p->p_ucred, p))
+       if (error = vinvalbuf(vp, V_SAVE, p->p_ucred, p, 0, 0))
                return (error);
        if (vp->v_type != VDIR) {
                vput(vp);
                return (error);
        if (vp->v_type != VDIR) {
                vput(vp);
@@ -130,35 +132,22 @@ update:
         */
        if (uap->flags & MNT_RDONLY)
                mp->mnt_flag |= MNT_RDONLY;
         */
        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;
-       if (uap->flags & MNT_UNION)
-               mp->mnt_flag |= MNT_UNION;
-       else
-               mp->mnt_flag &= ~MNT_UNION;
+       else if (mp->mnt_flag & MNT_RDONLY)
+               mp->mnt_flag |= MNT_WANTRDWR;
+       mp->mnt_flag &=~
+           (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION);
+       mp->mnt_flag |= uap->flags &
+           (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV | MNT_SYNCHRONOUS | MNT_UNION);
        /*
         * Mount the filesystem.
         */
        error = VFS_MOUNT(mp, uap->dir, uap->data, &nd, p);
        if (mp->mnt_flag & MNT_UPDATE) {
        /*
         * Mount the filesystem.
         */
        error = VFS_MOUNT(mp, uap->dir, uap->data, &nd, p);
        if (mp->mnt_flag & MNT_UPDATE) {
-               mp->mnt_flag &= ~MNT_UPDATE;
                vrele(vp);
                vrele(vp);
+               if (mp->mnt_flag & MNT_WANTRDWR)
+                       mp->mnt_flag &= ~MNT_RDONLY;
+               mp->mnt_flag &=~
+                   (MNT_UPDATE | MNT_RELOAD | MNT_FORCE | MNT_WANTRDWR);
                if (error)
                        mp->mnt_flag = flag;
                return (error);
                if (error)
                        mp->mnt_flag = flag;
                return (error);