eliminate longjmp from the kernel (for karels)
[unix-history] / usr / src / sys / kern / vfs_syscalls.c
index 8f70889..810f5f4 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)vfs_syscalls.c      7.40 (Berkeley) %G%
+ *     @(#)vfs_syscalls.c      7.43 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -24,7 +24,6 @@
 #include "file.h"
 #include "stat.h"
 #include "vnode.h"
 #include "file.h"
 #include "stat.h"
 #include "vnode.h"
-#include "../ufs/inode.h"
 #include "mount.h"
 #include "proc.h"
 #include "uio.h"
 #include "mount.h"
 #include "proc.h"
 #include "uio.h"
@@ -260,14 +259,16 @@ sync(scp)
        struct syscontext *scp;
 {
        register struct mount *mp;
        struct syscontext *scp;
 {
        register struct mount *mp;
-       struct mount *nmp;
 
        mp = rootfs;
        do {
 
        mp = rootfs;
        do {
-               nmp = mp->m_next;
+               /*
+                * The lock check below is to avoid races with mount
+                * and unmount.
+                */
                if ((mp->m_flag & (M_MLOCK|M_RDONLY)) == 0)
                        VFS_SYNC(mp, MNT_NOWAIT);
                if ((mp->m_flag & (M_MLOCK|M_RDONLY)) == 0)
                        VFS_SYNC(mp, MNT_NOWAIT);
-               mp = nmp;
+               mp = mp->m_next;
        } while (mp != rootfs);
 }
 
        } while (mp != rootfs);
 }
 
@@ -283,7 +284,7 @@ statfs(scp)
        } *uap = (struct a *)scp->sc_ap;
        register struct mount *mp;
        register struct nameidata *ndp = &scp->sc_nd;
        } *uap = (struct a *)scp->sc_ap;
        register struct mount *mp;
        register struct nameidata *ndp = &scp->sc_nd;
-       struct statfs sb;
+       register struct statfs *sp;
        int error;
 
        ndp->ni_nameiop = LOOKUP | FOLLOW;
        int error;
 
        ndp->ni_nameiop = LOOKUP | FOLLOW;
@@ -292,12 +293,12 @@ statfs(scp)
        if (error = namei(ndp))
                RETURN (error);
        mp = ndp->ni_vp->v_mount;
        if (error = namei(ndp))
                RETURN (error);
        mp = ndp->ni_vp->v_mount;
+       sp = &mp->m_stat;
        vrele(ndp->ni_vp);
        vrele(ndp->ni_vp);
-       if (error = VFS_STATFS(mp, &sb))
+       if (error = VFS_STATFS(mp, sp))
                RETURN (error);
                RETURN (error);
-       sb.f_flags = mp->m_flag & M_VISFLAGMASK;
-       sb.f_fsid = mp->m_fsid;
-       RETURN (copyout((caddr_t)&sb, (caddr_t)uap->buf, sizeof(sb)));
+       sp->f_flags = mp->m_flag & M_VISFLAGMASK;
+       RETURN (copyout((caddr_t)sp, (caddr_t)uap->buf, sizeof(*sp)));
 }
 
 fstatfs(scp)
 }
 
 fstatfs(scp)
@@ -309,17 +310,17 @@ fstatfs(scp)
        } *uap = (struct a *)scp->sc_ap;
        struct file *fp;
        struct mount *mp;
        } *uap = (struct a *)scp->sc_ap;
        struct file *fp;
        struct mount *mp;
-       struct statfs sb;
+       register struct statfs *sp;
        int error;
 
        if (error = getvnode(scp->sc_ofile, uap->fd, &fp))
                RETURN (error);
        mp = ((struct vnode *)fp->f_data)->v_mount;
        int error;
 
        if (error = getvnode(scp->sc_ofile, uap->fd, &fp))
                RETURN (error);
        mp = ((struct vnode *)fp->f_data)->v_mount;
-       if (error = VFS_STATFS(mp, &sb))
+       sp = &mp->m_stat;
+       if (error = VFS_STATFS(mp, sp))
                RETURN (error);
                RETURN (error);
-       sb.f_flags = mp->m_flag & M_VISFLAGMASK;
-       sb.f_fsid = mp->m_fsid;
-       RETURN (copyout((caddr_t)&sb, (caddr_t)uap->buf, sizeof(sb)));
+       sp->f_flags = mp->m_flag & M_VISFLAGMASK;
+       RETURN (copyout((caddr_t)sp, (caddr_t)uap->buf, sizeof(*sp)));
 }
 
 /*
 }
 
 /*
@@ -331,11 +332,12 @@ getfsstat(scp)
        struct a {
                struct statfs *buf;
                long bufsize;
        struct a {
                struct statfs *buf;
                long bufsize;
+               int flags;
        } *uap = (struct a *)scp->sc_ap;
        register struct mount *mp;
        } *uap = (struct a *)scp->sc_ap;
        register struct mount *mp;
+       register struct statfs *sp;
        caddr_t sfsp;
        long count, maxcount, error;
        caddr_t sfsp;
        long count, maxcount, error;
-       struct statfs sb;
 
        maxcount = uap->bufsize / sizeof(struct statfs);
        sfsp = (caddr_t)uap->buf;
 
        maxcount = uap->bufsize / sizeof(struct statfs);
        sfsp = (caddr_t)uap->buf;
@@ -343,15 +345,21 @@ getfsstat(scp)
        count = 0;
        do {
                if (sfsp && count < maxcount && ((mp->m_flag & M_MLOCK) == 0)) {
        count = 0;
        do {
                if (sfsp && count < maxcount && ((mp->m_flag & M_MLOCK) == 0)) {
-                       if (error = VFS_STATFS(mp, &sb)) {
+                       sp = &mp->m_stat;
+                       /*
+                        * If MNT_NOWAIT is specified, do not refresh the
+                        * fsstat cache. MNT_WAIT overrides MNT_NOWAIT.
+                        */
+                       if (((uap->flags & MNT_NOWAIT) == 0 ||
+                           (uap->flags & MNT_WAIT)) &&
+                           (error = VFS_STATFS(mp, sp))) {
                                mp = mp->m_prev;
                                continue;
                        }
                                mp = mp->m_prev;
                                continue;
                        }
-                       sb.f_flags = mp->m_flag & M_VISFLAGMASK;
-                       sb.f_fsid = mp->m_fsid;
-                       if (error = copyout((caddr_t)&sb, sfsp, sizeof(sb)))
+                       sp->f_flags = mp->m_flag & M_VISFLAGMASK;
+                       if (error = copyout((caddr_t)sp, sfsp, sizeof(*sp)))
                                RETURN (error);
                                RETURN (error);
-                       sfsp += sizeof(sb);
+                       sfsp += sizeof(*sp);
                }
                count++;
                mp = mp->m_prev;
                }
                count++;
                mp = mp->m_prev;
@@ -519,11 +527,13 @@ copen(scp, fmode, cmode, ndp, resultfd)
                return (error);
        fp = nfp;
        scp->sc_retval1 = indx; /* XXX for fdopen() */
                return (error);
        fp = nfp;
        scp->sc_retval1 = indx; /* XXX for fdopen() */
-       if (error = vn_open(ndp, fmode, (cmode & 07777) &~ ISVTX)) {
+       if (error = vn_open(ndp, fmode, (cmode & 07777) &~ S_ISVTX)) {
                crfree(fp->f_cred);
                fp->f_count--;
                crfree(fp->f_cred);
                fp->f_count--;
-               if (error == -1)        /* XXX from fdopen */
-                       return (0);     /* XXX from fdopen */
+               if (error == EJUSTRETURN)       /* XXX from fdopen */
+                       return (0);             /* XXX from fdopen */
+               if (error == ERESTART)
+                       error = EINTR;
                scp->sc_ofile[indx] = NULL;
                return (error);
        }
                scp->sc_ofile[indx] = NULL;
                return (error);
        }
@@ -565,15 +575,15 @@ mknod(scp)
                goto out;
        }
        vattr_null(&vattr);
                goto out;
        }
        vattr_null(&vattr);
-       switch (uap->fmode & IFMT) {
+       switch (uap->fmode & S_IFMT) {
 
 
-       case IFMT:      /* used by badsect to flag bad sectors */
+       case S_IFMT:    /* used by badsect to flag bad sectors */
                vattr.va_type = VBAD;
                break;
                vattr.va_type = VBAD;
                break;
-       case IFCHR:
+       case S_IFCHR:
                vattr.va_type = VCHR;
                break;
                vattr.va_type = VCHR;
                break;
-       case IFBLK:
+       case S_IFBLK:
                vattr.va_type = VBLK;
                break;
        default:
                vattr.va_type = VBLK;
                break;
        default: