Date: Fri, 27 Dec 1996 12:54:20 +0300 (MSK) From: =?KOI8-R?Q?=E1=CE=C4=D2=C5=CA_=FE=C5=D2=CE=CF=D7=2C_Andrey_Chernov?= <ache@nagual.ru> To: FreeBSD-current <current@freebsd.org>, Bruce Evans <bde@zeta.org.au> Cc: jdp@freebsd.org Subject: Activate nanoseconds in struct stat: please review! Message-ID: <Pine.BSF.3.95.961227124938.1292A-100000@nagual.ru>
next in thread | raw e-mail | index | archive | help
The problem is that st->st_*timespec.tv_nsec is always zero, this patch
fix it.
*** ufs/ufs/inode.h.orig Fri Sep 20 01:39:32 1996
--- ufs/ufs/inode.h Fri Dec 27 12:31:54 1996
***************
*** 147,169 ****
/*
* 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.tv_sec \
! = ((t1) == &time ? tv_sec : (t1)->tv_sec); \
if ((ip)->i_flag & IN_UPDATE) { \
! (ip)->i_mtime.tv_sec \
! = ((t2) == &time ? tv_sec : (t2)->tv_sec); \
(ip)->i_modrev++; \
} \
if ((ip)->i_flag & IN_CHANGE) \
! (ip)->i_ctime.tv_sec = tv_sec; \
(ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
} \
}
--- 147,172 ----
/*
* XXX this is too long to be a macro, and isn't used in any time-critical
! * place.
*/
#define ITIMES(ip, t1, t2) { \
if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) { \
+ struct timeval *tv, now; \
+ int s = splclock(); \
+ now = time; \
+ splx(s); \
(ip)->i_flag |= IN_MODIFIED; \
! if ((ip)->i_flag & IN_ACCESS) { \
! tv = ((t1) == &time) ? &now : (t1); \
! TIMEVAL_TO_TIMESPEC(tv, &((ip)->i_atime)); \
! } \
if ((ip)->i_flag & IN_UPDATE) { \
! tv = ((t2) == &time) ? &now : (t2); \
! TIMEVAL_TO_TIMESPEC(tv, &((ip)->i_mtime)); \
(ip)->i_modrev++; \
} \
if ((ip)->i_flag & IN_CHANGE) \
! TIMEVAL_TO_TIMESPEC(&now, &((ip)->i_ctime)); \
(ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE); \
} \
}
*** ufs/ffs/ffs_inode.c.orig Thu Nov 7 02:55:57 1996
--- ufs/ffs/ffs_inode.c Fri Dec 27 12:38:30 1996
***************
*** 90,96 ****
struct buf *bp;
struct inode *ip;
int error;
- time_t tv_sec;
ip = VTOI(ap->a_vp);
if (ap->a_vp->v_mount->mnt_flag & MNT_RDONLY) {
--- 90,95 ----
***************
*** 109,130 ****
* same copy of `time'. This is not as good. Some callers forget
* to make a copy; others make a copy too early (before the i/o
* has completed)...
- *
- * XXX there should be a function or macro for reading the time
- * (e.g., some machines may require splclock()).
*/
! tv_sec = time.tv_sec;
! if (ip->i_flag & IN_ACCESS)
! ip->i_atime.tv_sec =
! (ap->a_access == &time ? tv_sec : ap->a_access->tv_sec);
! if (ip->i_flag & IN_UPDATE) {
! ip->i_mtime.tv_sec =
! (ap->a_modify == &time ? tv_sec : ap->a_modify->tv_sec);
! ip->i_modrev++;
! }
! if (ip->i_flag & IN_CHANGE)
! ip->i_ctime.tv_sec = tv_sec;
! ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE);
fs = ip->i_fs;
/*
* Ensure that uid and gid are correct. This is a temporary
--- 108,116 ----
* same copy of `time'. This is not as good. Some callers forget
* to make a copy; others make a copy too early (before the i/o
* has completed)...
*/
! ITIMES(ip, ap->a_access, ap->a_modify);
! ip->i_flag &= ~IN_MODIFIED;
fs = ip->i_fs;
/*
* Ensure that uid and gid are correct. This is a temporary
--
Andrey A. Chernov
<ache@null.net>
http://www.nagual.ru/~ache/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95.961227124938.1292A-100000>
