summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1998-03-26 20:54:05 +0000
committerphk <phk@FreeBSD.org>1998-03-26 20:54:05 +0000
commit00475b662ad28e7f09931eb67a642ba1ee36db99 (patch)
tree12dd2aed1e3b8ecf5eb4152bf06ffa8c3ede0d7e
parentff4953fbcc9f747429234d5971a802bb653e451a (diff)
downloadFreeBSD-src-00475b662ad28e7f09931eb67a642ba1ee36db99.zip
FreeBSD-src-00475b662ad28e7f09931eb67a642ba1ee36db99.tar.gz
Add two new functions, get{micro|nano}time.
They are atomic, but return in essence what is in the "time" variable. gettime() is now a macro front for getmicrotime(). Various patches to use the two new functions instead of the various hacks used in their absence. Some puntuation and grammer patches from Bruce. A couple of XXX comments.
-rw-r--r--sys/fs/msdosfs/msdosfs_denode.c4
-rw-r--r--sys/fs/msdosfs/msdosfs_vnops.c10
-rw-r--r--sys/fs/portalfs/portal_vnops.c5
-rw-r--r--sys/fs/procfs/procfs_vnops.c8
-rw-r--r--sys/gnu/ext2fs/inode.h25
-rw-r--r--sys/gnu/fs/ext2fs/inode.h25
-rw-r--r--sys/i386/boot/dosboot/inode.h15
-rw-r--r--sys/kern/kern_clock.c42
-rw-r--r--sys/kern/kern_tc.c42
-rw-r--r--sys/kern/kern_time.c3
-rw-r--r--sys/kern/sys_pipe.c14
-rw-r--r--sys/miscfs/devfs/devfs_tree.c6
-rw-r--r--sys/miscfs/devfs/devfs_vnops.c18
-rw-r--r--sys/miscfs/kernfs/kernfs_vnops.c8
-rw-r--r--sys/miscfs/portal/portal_vnops.c5
-rw-r--r--sys/miscfs/procfs/procfs_vnops.c8
-rw-r--r--sys/msdosfs/msdosfs_denode.c4
-rw-r--r--sys/msdosfs/msdosfs_vnops.c10
-rw-r--r--sys/sys/pipe.h8
-rw-r--r--sys/sys/time.h62
-rw-r--r--sys/sys/timetc.h62
-rw-r--r--sys/ufs/ffs/ffs_inode.c3
-rw-r--r--sys/ufs/ufs/inode.h25
-rw-r--r--sys/ufs/ufs/ufs_vnops.c31
24 files changed, 216 insertions, 227 deletions
diff --git a/sys/fs/msdosfs/msdosfs_denode.c b/sys/fs/msdosfs/msdosfs_denode.c
index 5130727..6c4513d 100644
--- a/sys/fs/msdosfs/msdosfs_denode.c
+++ b/sys/fs/msdosfs/msdosfs_denode.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_denode.c,v 1.32 1998/02/18 09:28:33 jkh Exp $ */
+/* $Id: msdosfs_denode.c,v 1.33 1998/03/20 02:33:35 kato Exp $ */
/* $NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $ */
/*-
@@ -364,7 +364,7 @@ deupdat(dep, waitfor)
if (DETOV(dep)->v_mount->mnt_flag & MNT_RDONLY)
return (0);
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
if ((dep->de_flag & DE_MODIFIED) == 0)
return (0);
diff --git a/sys/fs/msdosfs/msdosfs_vnops.c b/sys/fs/msdosfs/msdosfs_vnops.c
index cbfb35d..4185114 100644
--- a/sys/fs/msdosfs/msdosfs_vnops.c
+++ b/sys/fs/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_vnops.c,v 1.65 1998/03/06 09:46:31 msmith Exp $ */
+/* $Id: msdosfs_vnops.c,v 1.66 1998/03/20 02:33:42 kato Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $ */
/*-
@@ -180,7 +180,7 @@ msdosfs_create(ap)
ndirent.de_devvp = pdep->de_devvp;
ndirent.de_pmp = pdep->de_pmp;
ndirent.de_flag = DE_ACCESS | DE_CREATE | DE_UPDATE;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(&ndirent, &ts, &ts, &ts);
error = createde(&ndirent, pdep, &dep, cnp);
if (error)
@@ -239,7 +239,7 @@ msdosfs_close(ap)
simple_lock(&vp->v_interlock);
if (vp->v_usecount > 1) {
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
}
simple_unlock(&vp->v_interlock);
@@ -340,7 +340,7 @@ msdosfs_getattr(ap)
u_long dirsperblk = pmp->pm_BytesPerSec / sizeof(struct direntry);
u_long fileid;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
vap->va_fsid = dep->de_dev;
/*
@@ -1356,7 +1356,7 @@ msdosfs_mkdir(ap)
bzero(&ndirent, sizeof(ndirent));
ndirent.de_pmp = pmp;
ndirent.de_flag = DE_ACCESS | DE_CREATE | DE_UPDATE;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(&ndirent, &ts, &ts, &ts);
/*
diff --git a/sys/fs/portalfs/portal_vnops.c b/sys/fs/portalfs/portal_vnops.c
index e622cff..93a223f 100644
--- a/sys/fs/portalfs/portal_vnops.c
+++ b/sys/fs/portalfs/portal_vnops.c
@@ -35,7 +35,7 @@
*
* @(#)portal_vnops.c 8.14 (Berkeley) 5/21/95
*
- * $Id: portal_vnops.c,v 1.28 1997/10/27 13:33:41 bde Exp $
+ * $Id: portal_vnops.c,v 1.29 1997/11/06 19:29:38 phk Exp $
*/
/*
@@ -453,8 +453,7 @@ portal_getattr(ap)
vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
vap->va_size = DEV_BSIZE;
vap->va_blocksize = DEV_BSIZE;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &vap->va_atime);
+ nanotime(&vap->va_atime);
vap->va_mtime = vap->va_atime;
vap->va_ctime = vap->va_ctime;
vap->va_gen = 0;
diff --git a/sys/fs/procfs/procfs_vnops.c b/sys/fs/procfs/procfs_vnops.c
index a346ae7..78b6d92 100644
--- a/sys/fs/procfs/procfs_vnops.c
+++ b/sys/fs/procfs/procfs_vnops.c
@@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95
*
- * $Id: procfs_vnops.c,v 1.54 1998/02/06 12:13:42 eivind Exp $
+ * $Id: procfs_vnops.c,v 1.55 1998/02/09 06:09:46 eivind Exp $
*/
/*
@@ -475,11 +475,7 @@ procfs_getattr(ap)
* p_stat structure is not addressible if u. gets
* swapped out for that process.
*/
- {
- struct timeval tv;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &vap->va_ctime);
- }
+ nanotime(&vap->va_ctime);
vap->va_atime = vap->va_mtime = vap->va_ctime;
/*
diff --git a/sys/gnu/ext2fs/inode.h b/sys/gnu/ext2fs/inode.h
index 4bd1cf5..c787e1e 100644
--- a/sys/gnu/ext2fs/inode.h
+++ b/sys/gnu/ext2fs/inode.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)inode.h 8.9 (Berkeley) 5/14/95
- * $Id: inode.h,v 1.20 1998/01/30 11:34:02 phk Exp $
+ * $Id: inode.h,v 1.21 1998/03/08 09:59:21 julian Exp $
*/
#ifndef _UFS_UFS_INODE_H_
@@ -143,29 +143,6 @@ struct indir {
#define VTOI(vp) ((struct inode *)(vp)->v_data)
#define ITOV(ip) ((ip)->i_vnode)
-/*
- * XXX this is too long to be a macro, and isn't used in any time-critical
- * place; in fact it is only used in ufs_vnops.c so it shouldn't be in a
- * header file.
- */
-#define ITIMES(ip, t1, t2) { \
- long tv_sec = time.tv_sec; \
- if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
- (ip)->i_flag |= IN_MODIFIED; \
- if ((ip)->i_flag & IN_ACCESS) \
- (ip)->i_atime \
- = ((t1) == &time ? tv_sec : (t1)->tv_sec); \
- if ((ip)->i_flag & IN_UPDATE) { \
- (ip)->i_mtime \
- = ((t2) == &time ? tv_sec : (t2)->tv_sec); \
- (ip)->i_modrev++; \
- } \
- if ((ip)->i_flag & IN_CHANGE) \
- (ip)->i_ctime = tv_sec; \
- (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
- } \
-}
-
/* Determine if soft dependencies are being done */
#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP)
diff --git a/sys/gnu/fs/ext2fs/inode.h b/sys/gnu/fs/ext2fs/inode.h
index 4bd1cf5..c787e1e 100644
--- a/sys/gnu/fs/ext2fs/inode.h
+++ b/sys/gnu/fs/ext2fs/inode.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)inode.h 8.9 (Berkeley) 5/14/95
- * $Id: inode.h,v 1.20 1998/01/30 11:34:02 phk Exp $
+ * $Id: inode.h,v 1.21 1998/03/08 09:59:21 julian Exp $
*/
#ifndef _UFS_UFS_INODE_H_
@@ -143,29 +143,6 @@ struct indir {
#define VTOI(vp) ((struct inode *)(vp)->v_data)
#define ITOV(ip) ((ip)->i_vnode)
-/*
- * XXX this is too long to be a macro, and isn't used in any time-critical
- * place; in fact it is only used in ufs_vnops.c so it shouldn't be in a
- * header file.
- */
-#define ITIMES(ip, t1, t2) { \
- long tv_sec = time.tv_sec; \
- if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
- (ip)->i_flag |= IN_MODIFIED; \
- if ((ip)->i_flag & IN_ACCESS) \
- (ip)->i_atime \
- = ((t1) == &time ? tv_sec : (t1)->tv_sec); \
- if ((ip)->i_flag & IN_UPDATE) { \
- (ip)->i_mtime \
- = ((t2) == &time ? tv_sec : (t2)->tv_sec); \
- (ip)->i_modrev++; \
- } \
- if ((ip)->i_flag & IN_CHANGE) \
- (ip)->i_ctime = tv_sec; \
- (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
- } \
-}
-
/* Determine if soft dependencies are being done */
#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP)
diff --git a/sys/i386/boot/dosboot/inode.h b/sys/i386/boot/dosboot/inode.h
index 61cc957..0a692e3 100644
--- a/sys/i386/boot/dosboot/inode.h
+++ b/sys/i386/boot/dosboot/inode.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* from: @(#)inode.h 7.17 (Berkeley) 5/8/91
- * $Id$
+ * $Id: inode.h,v 1.4 1997/02/22 09:30:56 peter Exp $
*/
#ifndef _UFS_INODE_H_
@@ -157,19 +157,6 @@ extern ino_t dirpref();
(void) iupdat(ip, t1, t2, waitfor); \
}
-#define ITIMES(ip, t1, t2) { \
- if ((ip)->i_flag&(IUPD|IACC|ICHG)) { \
- (ip)->i_flag |= IMOD; \
- if ((ip)->i_flag&IACC) \
- (ip)->i_atime = (t1)->tv_sec; \
- if ((ip)->i_flag&IUPD) \
- (ip)->i_mtime = (t2)->tv_sec; \
- if ((ip)->i_flag&ICHG) \
- (ip)->i_ctime = time.tv_sec; \
- (ip)->i_flag &= ~(IACC|IUPD|ICHG); \
- } \
-}
-
/*
* This overlays the fid sturcture (see mount.h)
*/
diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c
index 927e5f6..84b9875 100644
--- a/sys/kern/kern_clock.c
+++ b/sys/kern/kern_clock.c
@@ -39,7 +39,7 @@ static volatile int print_tci = 1;
* SUCH DAMAGE.
*
* @(#)kern_clock.c 8.5 (Berkeley) 1/21/94
- * $Id: kern_clock.c,v 1.57 1998/02/20 16:35:49 phk Exp $
+ * $Id: kern_clock.c,v 1.58 1998/03/16 10:19:12 phk Exp $
*/
#include <sys/param.h>
@@ -222,17 +222,6 @@ hardclock(frame)
++softticks;
}
-void
-gettime(struct timeval *tvp)
-{
- int s;
-
- s = splclock();
- /* XXX should use microtime() iff tv_usec is used. */
- *tvp = time;
- splx(s);
-}
-
/*
* Compute number of hz until specified time. Used to
* compute third argument to timeout() from an absolute time.
@@ -495,6 +484,35 @@ sysctl_kern_clockrate SYSCTL_HANDLER_ARGS
SYSCTL_PROC(_kern, KERN_CLOCKRATE, clockrate, CTLTYPE_STRUCT|CTLFLAG_RD,
0, 0, sysctl_kern_clockrate, "S,clockinfo","");
+
+/*
+ * We have four functions for looking at the clock, two for microseconds
+ * and two for nanoseconds. For each there is fast but less precise
+ * version "get{nano|micro}time" which will return a time which is up
+ * to 1/HZ previous to the call, whereas the raw version "{nano|micro}time"
+ * will return a timestamp which is as precise as possible.
+ */
+
+void
+getmicrotime(struct timeval *tvp)
+{
+ struct timecounter *tc;
+
+ tc = timecounter;
+ tvp->tv_sec = tc->offset_sec;
+ tvp->tv_usec = tc->offset_micro;
+}
+
+void
+getnanotime(struct timespec *tsp)
+{
+ struct timecounter *tc;
+
+ tc = timecounter;
+ tsp->tv_sec = tc->offset_sec;
+ tsp->tv_nsec = tc->offset_nano;
+}
+
void
microtime(struct timeval *tv)
{
diff --git a/sys/kern/kern_tc.c b/sys/kern/kern_tc.c
index 927e5f6..84b9875 100644
--- a/sys/kern/kern_tc.c
+++ b/sys/kern/kern_tc.c
@@ -39,7 +39,7 @@ static volatile int print_tci = 1;
* SUCH DAMAGE.
*
* @(#)kern_clock.c 8.5 (Berkeley) 1/21/94
- * $Id: kern_clock.c,v 1.57 1998/02/20 16:35:49 phk Exp $
+ * $Id: kern_clock.c,v 1.58 1998/03/16 10:19:12 phk Exp $
*/
#include <sys/param.h>
@@ -222,17 +222,6 @@ hardclock(frame)
++softticks;
}
-void
-gettime(struct timeval *tvp)
-{
- int s;
-
- s = splclock();
- /* XXX should use microtime() iff tv_usec is used. */
- *tvp = time;
- splx(s);
-}
-
/*
* Compute number of hz until specified time. Used to
* compute third argument to timeout() from an absolute time.
@@ -495,6 +484,35 @@ sysctl_kern_clockrate SYSCTL_HANDLER_ARGS
SYSCTL_PROC(_kern, KERN_CLOCKRATE, clockrate, CTLTYPE_STRUCT|CTLFLAG_RD,
0, 0, sysctl_kern_clockrate, "S,clockinfo","");
+
+/*
+ * We have four functions for looking at the clock, two for microseconds
+ * and two for nanoseconds. For each there is fast but less precise
+ * version "get{nano|micro}time" which will return a time which is up
+ * to 1/HZ previous to the call, whereas the raw version "{nano|micro}time"
+ * will return a timestamp which is as precise as possible.
+ */
+
+void
+getmicrotime(struct timeval *tvp)
+{
+ struct timecounter *tc;
+
+ tc = timecounter;
+ tvp->tv_sec = tc->offset_sec;
+ tvp->tv_usec = tc->offset_micro;
+}
+
+void
+getnanotime(struct timespec *tsp)
+{
+ struct timecounter *tc;
+
+ tc = timecounter;
+ tsp->tv_sec = tc->offset_sec;
+ tsp->tv_nsec = tc->offset_nano;
+}
+
void
microtime(struct timeval *tv)
{
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 295e8fa..a1fb4e3 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)kern_time.c 8.1 (Berkeley) 6/10/93
- * $Id: kern_time.c,v 1.41 1998/02/20 16:35:53 phk Exp $
+ * $Id: kern_time.c,v 1.42 1998/02/25 04:10:32 bde Exp $
*/
#include <sys/param.h>
@@ -163,6 +163,7 @@ clock_settime(p, uap)
return (error);
if (ats.tv_nsec < 0 || ats.tv_nsec >= 1000000000)
return (EINVAL);
+ /* XXX Don't convert nsec->usec and back */
TIMESPEC_TO_TIMEVAL(&atv, &ats);
if ((error = settime(&atv)))
return (error);
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 8c008a2..c237952 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -16,7 +16,7 @@
* 4. Modifications may be freely made to this file if the above conditions
* are met.
*
- * $Id: sys_pipe.c,v 1.38 1998/02/06 12:13:26 eivind Exp $
+ * $Id: sys_pipe.c,v 1.39 1998/02/09 06:09:25 eivind Exp $
*/
/*
@@ -251,7 +251,7 @@ pipeinit(cpipe)
cpipe->pipe_state = 0;
cpipe->pipe_peer = NULL;
cpipe->pipe_busy = 0;
- gettime(&cpipe->pipe_ctime);
+ getnanotime(&cpipe->pipe_ctime);
cpipe->pipe_atime = cpipe->pipe_ctime;
cpipe->pipe_mtime = cpipe->pipe_ctime;
bzero(&cpipe->pipe_sel, sizeof cpipe->pipe_sel);
@@ -436,7 +436,7 @@ pipe_read(fp, uio, cred)
}
if (error == 0)
- gettime(&rpipe->pipe_atime);
+ getnanotime(&rpipe->pipe_atime);
--rpipe->pipe_busy;
if ((rpipe->pipe_busy == 0) && (rpipe->pipe_state & PIPE_WANT)) {
@@ -908,7 +908,7 @@ pipe_write(fp, uio, cred)
error = 0;
if (error == 0)
- gettime(&wpipe->pipe_mtime);
+ getnanotime(&wpipe->pipe_mtime);
/*
* We have something to offer,
@@ -1018,9 +1018,9 @@ pipe_stat(pipe, ub)
ub->st_blksize = pipe->pipe_buffer.size;
ub->st_size = pipe->pipe_buffer.cnt;
ub->st_blocks = (ub->st_size + ub->st_blksize - 1) / ub->st_blksize;
- TIMEVAL_TO_TIMESPEC(&pipe->pipe_atime, &ub->st_atimespec);
- TIMEVAL_TO_TIMESPEC(&pipe->pipe_mtime, &ub->st_mtimespec);
- TIMEVAL_TO_TIMESPEC(&pipe->pipe_ctime, &ub->st_ctimespec);
+ ub->st_atimespec = pipe->pipe_atime;
+ ub->st_mtimespec = pipe->pipe_mtime;
+ ub->st_ctimespec = pipe->pipe_ctime;
/*
* Left as 0: st_dev, st_ino, st_nlink, st_uid, st_gid, st_rdev,
* st_flags, st_gen.
diff --git a/sys/miscfs/devfs/devfs_tree.c b/sys/miscfs/devfs/devfs_tree.c
index c2ef85b..20d46f1 100644
--- a/sys/miscfs/devfs/devfs_tree.c
+++ b/sys/miscfs/devfs/devfs_tree.c
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: devfs_tree.c,v 1.48 1997/11/08 19:02:26 julian Exp $
+ * $Id: devfs_tree.c,v 1.49 1998/01/02 07:31:06 julian Exp $
*/
#include "opt_devfs.h"
@@ -435,7 +435,7 @@ dev_add_node(int entrytype, union typeinfo *by, dn_p proto,
*/
bzero(dnp,sizeof(devnode_t));
dnp->type = entrytype;
- TIMEVAL_TO_TIMESPEC(&time,&(dnp->ctime))
+ getnanotime(&(dnp->ctime));
dnp->mtime = dnp->ctime;
dnp->atime = dnp->ctime;
dnp->nextsibling = dnp;
@@ -527,7 +527,7 @@ int
dev_touch(devnm_p key) /* update the node for this dev */
{
DBPRINT(("dev_touch\n"));
- TIMEVAL_TO_TIMESPEC(&time,&(key->dnp->mtime))
+ getnanotime(&(key->dnp->mtime));
return 0; /*XXX*/
}
diff --git a/sys/miscfs/devfs/devfs_vnops.c b/sys/miscfs/devfs/devfs_vnops.c
index fde502b..773d903 100644
--- a/sys/miscfs/devfs/devfs_vnops.c
+++ b/sys/miscfs/devfs/devfs_vnops.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: devfs_vnops.c,v 1.51 1998/01/02 07:31:06 julian Exp $
+ * $Id: devfs_vnops.c,v 1.52 1998/03/10 09:12:19 julian Exp $
*/
#include <sys/param.h>
@@ -531,7 +531,6 @@ devfs_setattr(struct vop_setattr_args *ap)
gid_t *gp;
int i;
dn_p file_node;
- struct timeval tv;
if (error = devfs_vntodn(vp,&file_node))
{
@@ -578,8 +577,7 @@ DBPRINT(("setattr\n"));
return (EACCES);
file_node->atime = vap->va_atime;
file_node->mtime = vap->va_mtime;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &file_node->ctime);
+ nanotime(&file_node->ctime);
return (0);
}
@@ -675,7 +673,7 @@ DBPRINT(("read\n"));
case VCHR:
case VBLK:
error = VOCALL(spec_vnodeop_p, VOFFSET(vop_read), ap);
- TIMEVAL_TO_TIMESPEC(&time,&(file_node->atime))
+ getnanotime(&(file_node->atime));
return(error);
default:
@@ -715,7 +713,7 @@ DBPRINT(("write\n"));
case VCHR:
case VBLK:
error = VOCALL(spec_vnodeop_p, VOFFSET(vop_write), ap);
- TIMEVAL_TO_TIMESPEC(&time,&(file_node->mtime))
+ getnanotime(&(file_node->mtime));
return(error);
default:
@@ -828,7 +826,7 @@ abortit:
/***********************************
* Start actually doing things.... *
***********************************/
- TIMEVAL_TO_TIMESPEC(&time,&(tdp->mtime));
+ getnanotime(&(tdp->mtime));
/*
@@ -918,7 +916,7 @@ abortit:
/***********************************
* Start actually doing things.... *
***********************************/
- TIMEVAL_TO_TIMESPEC(&time,&(tdp->atime));
+ getnanotime(&(tdp->atime));
error = dev_add_name(cnp->cn_nameptr,
tdp,
NULL,
@@ -1084,7 +1082,7 @@ abortit:
/***********************************
* Start actually doing things.... *
***********************************/
- TIMEVAL_TO_TIMESPEC(&time,&(fp->atime));
+ getnanotime(&(fp->atime));
/*
* Check if just deleting a link name.
*/
@@ -1276,7 +1274,7 @@ DBPRINT(("readdir\n"));
startpos = uio->uio_offset;
name_node = dir_node->by.Dir.dirlist;
nodenumber = 0;
- TIMEVAL_TO_TIMESPEC(&time,&(dir_node->atime))
+ getnanotime(&(dir_node->atime));
while ((name_node || (nodenumber < 2)) && (uio->uio_resid > 0))
{
diff --git a/sys/miscfs/kernfs/kernfs_vnops.c b/sys/miscfs/kernfs/kernfs_vnops.c
index 8ec320e..41d5430 100644
--- a/sys/miscfs/kernfs/kernfs_vnops.c
+++ b/sys/miscfs/kernfs/kernfs_vnops.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95
- * $Id: kernfs_vnops.c,v 1.27 1997/10/26 20:55:18 phk Exp $
+ * $Id: kernfs_vnops.c,v 1.28 1997/10/27 13:33:40 bde Exp $
*/
/*
@@ -383,11 +383,7 @@ kernfs_getattr(ap)
vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
vap->va_size = 0;
vap->va_blocksize = DEV_BSIZE;
- {
- struct timeval tv;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &vap->va_atime);
- }
+ nanotime(&vap->va_atime);
vap->va_mtime = vap->va_atime;
vap->va_ctime = vap->va_ctime;
vap->va_gen = 0;
diff --git a/sys/miscfs/portal/portal_vnops.c b/sys/miscfs/portal/portal_vnops.c
index e622cff..93a223f 100644
--- a/sys/miscfs/portal/portal_vnops.c
+++ b/sys/miscfs/portal/portal_vnops.c
@@ -35,7 +35,7 @@
*
* @(#)portal_vnops.c 8.14 (Berkeley) 5/21/95
*
- * $Id: portal_vnops.c,v 1.28 1997/10/27 13:33:41 bde Exp $
+ * $Id: portal_vnops.c,v 1.29 1997/11/06 19:29:38 phk Exp $
*/
/*
@@ -453,8 +453,7 @@ portal_getattr(ap)
vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
vap->va_size = DEV_BSIZE;
vap->va_blocksize = DEV_BSIZE;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &vap->va_atime);
+ nanotime(&vap->va_atime);
vap->va_mtime = vap->va_atime;
vap->va_ctime = vap->va_ctime;
vap->va_gen = 0;
diff --git a/sys/miscfs/procfs/procfs_vnops.c b/sys/miscfs/procfs/procfs_vnops.c
index a346ae7..78b6d92 100644
--- a/sys/miscfs/procfs/procfs_vnops.c
+++ b/sys/miscfs/procfs/procfs_vnops.c
@@ -36,7 +36,7 @@
*
* @(#)procfs_vnops.c 8.18 (Berkeley) 5/21/95
*
- * $Id: procfs_vnops.c,v 1.54 1998/02/06 12:13:42 eivind Exp $
+ * $Id: procfs_vnops.c,v 1.55 1998/02/09 06:09:46 eivind Exp $
*/
/*
@@ -475,11 +475,7 @@ procfs_getattr(ap)
* p_stat structure is not addressible if u. gets
* swapped out for that process.
*/
- {
- struct timeval tv;
- microtime(&tv);
- TIMEVAL_TO_TIMESPEC(&tv, &vap->va_ctime);
- }
+ nanotime(&vap->va_ctime);
vap->va_atime = vap->va_mtime = vap->va_ctime;
/*
diff --git a/sys/msdosfs/msdosfs_denode.c b/sys/msdosfs/msdosfs_denode.c
index 5130727..6c4513d 100644
--- a/sys/msdosfs/msdosfs_denode.c
+++ b/sys/msdosfs/msdosfs_denode.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_denode.c,v 1.32 1998/02/18 09:28:33 jkh Exp $ */
+/* $Id: msdosfs_denode.c,v 1.33 1998/03/20 02:33:35 kato Exp $ */
/* $NetBSD: msdosfs_denode.c,v 1.28 1998/02/10 14:10:00 mrg Exp $ */
/*-
@@ -364,7 +364,7 @@ deupdat(dep, waitfor)
if (DETOV(dep)->v_mount->mnt_flag & MNT_RDONLY)
return (0);
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
if ((dep->de_flag & DE_MODIFIED) == 0)
return (0);
diff --git a/sys/msdosfs/msdosfs_vnops.c b/sys/msdosfs/msdosfs_vnops.c
index cbfb35d..4185114 100644
--- a/sys/msdosfs/msdosfs_vnops.c
+++ b/sys/msdosfs/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $Id: msdosfs_vnops.c,v 1.65 1998/03/06 09:46:31 msmith Exp $ */
+/* $Id: msdosfs_vnops.c,v 1.66 1998/03/20 02:33:42 kato Exp $ */
/* $NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $ */
/*-
@@ -180,7 +180,7 @@ msdosfs_create(ap)
ndirent.de_devvp = pdep->de_devvp;
ndirent.de_pmp = pdep->de_pmp;
ndirent.de_flag = DE_ACCESS | DE_CREATE | DE_UPDATE;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(&ndirent, &ts, &ts, &ts);
error = createde(&ndirent, pdep, &dep, cnp);
if (error)
@@ -239,7 +239,7 @@ msdosfs_close(ap)
simple_lock(&vp->v_interlock);
if (vp->v_usecount > 1) {
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
}
simple_unlock(&vp->v_interlock);
@@ -340,7 +340,7 @@ msdosfs_getattr(ap)
u_long dirsperblk = pmp->pm_BytesPerSec / sizeof(struct direntry);
u_long fileid;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(dep, &ts, &ts, &ts);
vap->va_fsid = dep->de_dev;
/*
@@ -1356,7 +1356,7 @@ msdosfs_mkdir(ap)
bzero(&ndirent, sizeof(ndirent));
ndirent.de_pmp = pmp;
ndirent.de_flag = DE_ACCESS | DE_CREATE | DE_UPDATE;
- TIMEVAL_TO_TIMESPEC(&time, &ts);
+ getnanotime(&ts);
DETIMES(&ndirent, &ts, &ts, &ts);
/*
diff --git a/sys/sys/pipe.h b/sys/sys/pipe.h
index 82e7b5c..7454cdf 100644
--- a/sys/sys/pipe.h
+++ b/sys/sys/pipe.h
@@ -18,7 +18,7 @@
* 5. Modifications may be freely made to this file if the above conditions
* are met.
*
- * $Id: pipe.h,v 1.8 1997/02/22 09:45:40 peter Exp $
+ * $Id: pipe.h,v 1.9 1997/04/09 16:53:45 bde Exp $
*/
#ifndef _SYS_PIPE_H_
@@ -99,9 +99,9 @@ struct pipe {
struct pipebuf pipe_buffer; /* data storage */
struct pipemapping pipe_map; /* pipe mapping for direct I/O */
struct selinfo pipe_sel; /* for compat with select */
- struct timeval pipe_atime; /* time of last access */
- struct timeval pipe_mtime; /* time of last modify */
- struct timeval pipe_ctime; /* time of status change */
+ struct timespec pipe_atime; /* time of last access */
+ struct timespec pipe_mtime; /* time of last modify */
+ struct timespec pipe_ctime; /* time of status change */
int pipe_pgid; /* process/group for async I/O */
struct pipe *pipe_peer; /* link with other direction */
u_int pipe_state; /* pipe status info */
diff --git a/sys/sys/time.h b/sys/sys/time.h
index b3ec8b7..e06ea26 100644
--- a/sys/sys/time.h
+++ b/sys/sys/time.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)time.h 8.5 (Berkeley) 5/4/95
- * $Id: time.h,v 1.19 1998/02/25 02:14:14 bde Exp $
+ * $Id: time.h,v 1.20 1998/03/04 10:26:44 dufault Exp $
*/
#ifndef _SYS_TIME_H_
@@ -78,20 +78,22 @@ struct timezone {
#define DST_CAN 6 /* Canada */
/*
- * Structure used to interface to the machine dependent hardware
- * support for timekeeping.
+ * Structure used to interface to the machine dependent hardware support
+ * for timekeeping.
*
- * A timecounter is a binary counter which has two simple properties:
- * * it runs at a fixed frequency.
- * * must not roll over in less than (1+epsilon)/HZ
+ * A timecounter is a (hard or soft) binary counter which has two properties:
+ * * it runs at a fixed, known frequency.
+ * * it must not roll over in less than (1 + delta)/HZ seconds. "delta"
+ * is expected to be less than 20 msec, but no hard data has been
+ * collected on this. 16 bit at 5 MHz (31 msec) is known to work.
*
- * get_timecount reads the counter.
+ * get_timedelta() returns difference between the counter now and offset_count.
*
- * get_timedelta returns difference between the counter now and offset_count
+ * get_timecount() reads the counter.
*
- * counter_mask removes unimplemented bits from the count value
+ * counter_mask removes unimplemented bits from the count value.
*
- * frequency should be obvious
+ * frequency is the counter frequency in hz.
*
* name is a short mnemonic name for this counter.
*
@@ -100,34 +102,44 @@ struct timezone {
* adjustment [PPM << 16] which means that the smallest unit of correction
* you can apply amounts to 481.5 usec/year.
*
- * scale_micro [2^32 * usec/tick]
- *
- * scale_nano_i [ns/tick]
- *
- * scale_nano_f [(ns/2^32)/tick]
+ * scale_micro [2^32 * usec/tick].
+ * scale_nano_i [ns/tick].
+ * scale_nano_f [(ns/2^32)/tick].
*
* offset_count is the contents of the counter which corresponds to the
- * rest of the offset_* values
+ * rest of the offset_* values.
*
- * offset_sec [s]
- * offset_micro [usec]
+ * offset_sec [s].
+ * offset_micro [usec].
* offset_nano [ns/2^32] is misnamed, the real unit is .23283064365...
* attoseconds (10E-18) and before you ask: yes, they are in fact
* called attoseconds, it comes from "atten" for 18 in Danish/Swedish.
+ *
+ * Each timecounter must supply an array of three timecounters, this is needed
+ * to guarantee atomicity in the code. Index zero is used to transport
+ * modifications, for instance done with sysctl, into the timecounter being
+ * used in a safe way. Such changes may be adopted with a delay of up to 1/HZ,
+ * index one & two are used alternately for the actual timekeeping.
+ *
+ * `other' points to the opposite "work" timecounter, ie, in index one it
+ * points to index two and vice versa
+ *
+ * `tweak' points to index zero.
+ *
*/
struct timecounter;
-typedef u_int timecounter_get_t __P((struct timecounter *));
+typedef unsigned timecounter_get_t __P((struct timecounter *));
typedef u_int64_t timecounter_delta_t __P((void));
struct timecounter {
- /* These fields must be initialized by the driver */
+ /* These fields must be initialized by the driver. */
timecounter_get_t *get_timedelta;
timecounter_delta_t *get_timecount;
u_int64_t counter_mask;
u_int32_t frequency;
char *name;
- /* These fields will be managed by the generic code */
+ /* These fields will be managed by the generic code. */
int cost;
int32_t adjustment;
u_int32_t scale_micro;
@@ -211,14 +223,16 @@ struct clockinfo {
extern struct timecounter *timecounter;
void forward_timecounter __P((void));
-void gettime __P((struct timeval *tv));
-void init_timecounter __P((struct timecounter *));
+void getmicrotime __P((struct timeval *tv));
+void getnanotime __P((struct timespec *tv));
+#define gettime(xxx) getmicrotime(xxx) /* XXX be compatible */
+void init_timecounter __P((struct timecounter *tc));
int itimerfix __P((struct timeval *tv));
int itimerdecr __P((struct itimerval *itp, int usec));
void microtime __P((struct timeval *tv));
void nanotime __P((struct timespec *ts));
void second_overflow __P((u_int32_t *psec));
-void set_timecounter __P((struct timespec *));
+void set_timecounter __P((struct timespec *ts));
void timevaladd __P((struct timeval *, struct timeval *));
void timevalsub __P((struct timeval *, struct timeval *));
#else /* !KERNEL */
diff --git a/sys/sys/timetc.h b/sys/sys/timetc.h
index b3ec8b7..e06ea26 100644
--- a/sys/sys/timetc.h
+++ b/sys/sys/timetc.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)time.h 8.5 (Berkeley) 5/4/95
- * $Id: time.h,v 1.19 1998/02/25 02:14:14 bde Exp $
+ * $Id: time.h,v 1.20 1998/03/04 10:26:44 dufault Exp $
*/
#ifndef _SYS_TIME_H_
@@ -78,20 +78,22 @@ struct timezone {
#define DST_CAN 6 /* Canada */
/*
- * Structure used to interface to the machine dependent hardware
- * support for timekeeping.
+ * Structure used to interface to the machine dependent hardware support
+ * for timekeeping.
*
- * A timecounter is a binary counter which has two simple properties:
- * * it runs at a fixed frequency.
- * * must not roll over in less than (1+epsilon)/HZ
+ * A timecounter is a (hard or soft) binary counter which has two properties:
+ * * it runs at a fixed, known frequency.
+ * * it must not roll over in less than (1 + delta)/HZ seconds. "delta"
+ * is expected to be less than 20 msec, but no hard data has been
+ * collected on this. 16 bit at 5 MHz (31 msec) is known to work.
*
- * get_timecount reads the counter.
+ * get_timedelta() returns difference between the counter now and offset_count.
*
- * get_timedelta returns difference between the counter now and offset_count
+ * get_timecount() reads the counter.
*
- * counter_mask removes unimplemented bits from the count value
+ * counter_mask removes unimplemented bits from the count value.
*
- * frequency should be obvious
+ * frequency is the counter frequency in hz.
*
* name is a short mnemonic name for this counter.
*
@@ -100,34 +102,44 @@ struct timezone {
* adjustment [PPM << 16] which means that the smallest unit of correction
* you can apply amounts to 481.5 usec/year.
*
- * scale_micro [2^32 * usec/tick]
- *
- * scale_nano_i [ns/tick]
- *
- * scale_nano_f [(ns/2^32)/tick]
+ * scale_micro [2^32 * usec/tick].
+ * scale_nano_i [ns/tick].
+ * scale_nano_f [(ns/2^32)/tick].
*
* offset_count is the contents of the counter which corresponds to the
- * rest of the offset_* values
+ * rest of the offset_* values.
*
- * offset_sec [s]
- * offset_micro [usec]
+ * offset_sec [s].
+ * offset_micro [usec].
* offset_nano [ns/2^32] is misnamed, the real unit is .23283064365...
* attoseconds (10E-18) and before you ask: yes, they are in fact
* called attoseconds, it comes from "atten" for 18 in Danish/Swedish.
+ *
+ * Each timecounter must supply an array of three timecounters, this is needed
+ * to guarantee atomicity in the code. Index zero is used to transport
+ * modifications, for instance done with sysctl, into the timecounter being
+ * used in a safe way. Such changes may be adopted with a delay of up to 1/HZ,
+ * index one & two are used alternately for the actual timekeeping.
+ *
+ * `other' points to the opposite "work" timecounter, ie, in index one it
+ * points to index two and vice versa
+ *
+ * `tweak' points to index zero.
+ *
*/
struct timecounter;
-typedef u_int timecounter_get_t __P((struct timecounter *));
+typedef unsigned timecounter_get_t __P((struct timecounter *));
typedef u_int64_t timecounter_delta_t __P((void));
struct timecounter {
- /* These fields must be initialized by the driver */
+ /* These fields must be initialized by the driver. */
timecounter_get_t *get_timedelta;
timecounter_delta_t *get_timecount;
u_int64_t counter_mask;
u_int32_t frequency;
char *name;
- /* These fields will be managed by the generic code */
+ /* These fields will be managed by the generic code. */
int cost;
int32_t adjustment;
u_int32_t scale_micro;
@@ -211,14 +223,16 @@ struct clockinfo {
extern struct timecounter *timecounter;
void forward_timecounter __P((void));
-void gettime __P((struct timeval *tv));
-void init_timecounter __P((struct timecounter *));
+void getmicrotime __P((struct timeval *tv));
+void getnanotime __P((struct timespec *tv));
+#define gettime(xxx) getmicrotime(xxx) /* XXX be compatible */
+void init_timecounter __P((struct timecounter *tc));
int itimerfix __P((struct timeval *tv));
int itimerdecr __P((struct itimerval *itp, int usec));
void microtime __P((struct timeval *tv));
void nanotime __P((struct timespec *ts));
void second_overflow __P((u_int32_t *psec));
-void set_timecounter __P((struct timespec *));
+void set_timecounter __P((struct timespec *ts));
void timevaladd __P((struct timeval *, struct timeval *));
void timevalsub __P((struct timeval *, struct timeval *));
#else /* !KERNEL */
diff --git a/sys/ufs/ffs/ffs_inode.c b/sys/ufs/ffs/ffs_inode.c
index 02ce546..3fd93dd 100644
--- a/sys/ufs/ffs/ffs_inode.c
+++ b/sys/ufs/ffs/ffs_inode.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_inode.c 8.13 (Berkeley) 4/21/95
- * $Id: ffs_inode.c,v 1.37 1998/03/16 01:55:43 dyson Exp $
+ * $Id: ffs_inode.c,v 1.38 1998/03/19 22:49:42 dyson Exp $
*/
#include "opt_quota.h"
@@ -102,6 +102,7 @@ ffs_update(vp, access, modify, waitfor)
*
* XXX there should be a function or macro for reading the time
* (e.g., some machines may require splclock()).
+ * XXX there are: they're called get{micro|nano}time
*/
tv_sec = time.tv_sec;
if (ip->i_flag & IN_ACCESS)
diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h
index 4bd1cf5..c787e1e 100644
--- a/sys/ufs/ufs/inode.h
+++ b/sys/ufs/ufs/inode.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)inode.h 8.9 (Berkeley) 5/14/95
- * $Id: inode.h,v 1.20 1998/01/30 11:34:02 phk Exp $
+ * $Id: inode.h,v 1.21 1998/03/08 09:59:21 julian Exp $
*/
#ifndef _UFS_UFS_INODE_H_
@@ -143,29 +143,6 @@ struct indir {
#define VTOI(vp) ((struct inode *)(vp)->v_data)
#define ITOV(ip) ((ip)->i_vnode)
-/*
- * XXX this is too long to be a macro, and isn't used in any time-critical
- * place; in fact it is only used in ufs_vnops.c so it shouldn't be in a
- * header file.
- */
-#define ITIMES(ip, t1, t2) { \
- long tv_sec = time.tv_sec; \
- if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
- (ip)->i_flag |= IN_MODIFIED; \
- if ((ip)->i_flag & IN_ACCESS) \
- (ip)->i_atime \
- = ((t1) == &time ? tv_sec : (t1)->tv_sec); \
- if ((ip)->i_flag & IN_UPDATE) { \
- (ip)->i_mtime \
- = ((t2) == &time ? tv_sec : (t2)->tv_sec); \
- (ip)->i_modrev++; \
- } \
- if ((ip)->i_flag & IN_CHANGE) \
- (ip)->i_ctime = tv_sec; \
- (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
- } \
-}
-
/* Determine if soft dependencies are being done */
#define DOINGSOFTDEP(vp) ((vp)->v_mount->mnt_flag & MNT_SOFTDEP)
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 82a7cc3..b922ba7 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
- * $Id: ufs_vnops.c,v 1.78 1998/02/09 06:11:14 eivind Exp $
+ * $Id: ufs_vnops.c,v 1.79 1998/03/08 09:59:44 julian Exp $
*/
#include "opt_quota.h"
@@ -123,6 +123,27 @@ union _qcvt {
}
/*
+ * XXX this is too long to be a macro, and isn't used in any time-critical
+ * place;
+ */
+#define ITIMES(ip) { \
+ struct timeval tv; \
+ getmicrotime(&tv); \
+ if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
+ (ip)->i_flag |= IN_MODIFIED; \
+ if ((ip)->i_flag & IN_ACCESS) \
+ (ip)->i_atime = tv.tv_sec; \
+ if ((ip)->i_flag & IN_UPDATE) { \
+ (ip)->i_mtime = tv.tv_sec; \
+ (ip)->i_modrev++; \
+ } \
+ if ((ip)->i_flag & IN_CHANGE) \
+ (ip)->i_ctime = tv.tv_sec; \
+ (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
+ } \
+}
+
+/*
* A virgin directory (no blushing please).
*/
static struct dirtemplate mastertemplate = {
@@ -246,7 +267,7 @@ ufs_close(ap)
simple_lock(&vp->v_interlock);
if (vp->v_usecount > 1)
- ITIMES(ip, &time, &time);
+ ITIMES(ip);
simple_unlock(&vp->v_interlock);
return (0);
}
@@ -349,7 +370,7 @@ ufs_getattr(ap)
register struct inode *ip = VTOI(vp);
register struct vattr *vap = ap->a_vap;
- ITIMES(ip, &time, &time);
+ ITIMES(ip);
/*
* Copy from inode table
*/
@@ -1807,7 +1828,7 @@ ufsspec_close(ap)
simple_lock(&vp->v_interlock);
if (ap->a_vp->v_usecount > 1)
- ITIMES(ip, &time, &time);
+ ITIMES(ip);
simple_unlock(&vp->v_interlock);
return (VOCALL (spec_vnodeop_p, VOFFSET(vop_close), ap));
}
@@ -1871,7 +1892,7 @@ ufsfifo_close(ap)
simple_lock(&vp->v_interlock);
if (ap->a_vp->v_usecount > 1)
- ITIMES(ip, &time, &time);
+ ITIMES(ip);
simple_unlock(&vp->v_interlock);
return (VOCALL (fifo_vnodeop_p, VOFFSET(vop_close), ap));
}
OpenPOWER on IntegriCloud