projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
eliminate longjmp from the kernel (for karels)
[unix-history]
/
usr
/
src
/
sys
/
kern
/
vfs_syscalls.c
diff --git
a/usr/src/sys/kern/vfs_syscalls.c
b/usr/src/sys/kern/vfs_syscalls.c
index
8f70889
..
810f5f4
100644
(file)
--- a/
usr/src/sys/kern/vfs_syscalls.c
+++ b/
usr/src/sys/kern/vfs_syscalls.c
@@
-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.4
0
(Berkeley) %G%
+ * @(#)vfs_syscalls.c 7.4
3
(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: