| From | Sent On | Attachments |
|---|---|---|
| Harti Brandt | Oct 13, 2003 6:42 am | |
| Bruce Evans | Oct 13, 2003 11:20 am | |
| Harti Brandt | Oct 14, 2003 1:40 am | |
| Garance A Drosihn | Oct 14, 2003 10:52 am | |
| Bruce Evans | Oct 14, 2003 12:30 pm | |
| Marcel Moolenaar | Oct 14, 2003 3:51 pm | |
| Marcel Moolenaar | Oct 15, 2003 12:46 am | |
| Kris Kennaway | Oct 15, 2003 12:53 am | |
| John-Mark Gurney | Oct 15, 2003 1:57 am | |
| Harti Brandt | Oct 15, 2003 2:02 am | |
| Garance A Drosihn | Oct 15, 2003 11:57 am | |
| Marcel Moolenaar | Oct 15, 2003 12:10 pm | |
| Garance A Drosihn | Oct 15, 2003 1:14 pm | |
| Harti Brandt | Oct 15, 2003 11:26 pm | |
| Harti Brandt | Oct 16, 2003 3:48 am | |
| Garance A Drosihn | Oct 17, 2003 12:28 pm | |
| Harti Brandt | Oct 20, 2003 1:01 am |
| Subject: | time_t on sparc64 | |
|---|---|---|
| From: | Bruce Evans (bd...@zeta.org.au) | |
| Date: | Oct 13, 2003 11:20:05 am | |
| List: | org.freebsd.freebsd-standards | |
On Mon, 13 Oct 2003, Harti Brandt wrote:
I just discovered that time_t is 32-bit on sparc64. One of the problems is that struct timeval is defined by Posix as
struct timeval { time_t tv_secs; suseconds_t tv_usecs; };
This is a bug in POSIX. In BSD, tv_secs has type long which may be, and is different from time_t.
but _timeval.h has
struct timeval { long tv_secs; suseconds_t tv_usecs; }
This means, that our timeval is not Posix compatible. What is the reason for time_t not beeing a long on sparc64?
time_t was used in some data structures whose layout shouldn't be changed even for new arches. Mainly in ufs in Lite2:
%%% ffs/fs.h: time_t fs_time; /* last time written */ ffs/fs.h: time_t cg_time; /* time last written */ ffs/fs.h: time_t cg_time; /* time last written */ lfs/lfs.h: time_t bi_segcreate; /* origin segment create time */ ufs/quota.h: time_t dqb_btime; /* time limit for excessive disk use */ ufs/quota.h: time_t dqb_itime; /* time limit for excessive files */ %%%
These are now:
%%% ffs/fs.h: int32_t fs_old_time; /* last time written */ ffs/fs.h: ufs_time_t fs_time; /* last time written */ ffs/fs.h: int32_t cg_old_time; /* time last written */ ffs/fs.h: ufs_time_t cg_time; /* time last written */ /dev/null: time_t bi_segcreate; /* origin segment create time */ ufs/quota.h: int32_t dqb_btime; /* time limit for excessive disk use */ ufs/quota.h: int32_t dqb_itime; /* time limit for excessive files */ %%%
I.e., int32_t is now not mispelled time_t in f^Hufs1 and Y2.038K bugs are fixed in ffs2 except for quotas.
ffs2 also parametrizes timestamps in inodes better:
%%% ufs/dinode.h:typedef int64_t ufs_time_t; ufs/dinode.h: ufs_time_t di_atime; /* 32: Last access time. */ ufs/dinode.h: ufs_time_t di_mtime; /* 40: Last modified time. */ ufs/dinode.h: ufs_time_t di_ctime; /* 48: Last inode change time. */ ufs/dinode.h: ufs_time_t di_birthtime; /* 56: Inode creation time. */ ufs/dinode.h: int32_t di_mtimensec; /* 64: Last modified time. */ ufs/dinode.h: int32_t di_atimensec; /* 68: Last access time. */ ufs/dinode.h: int32_t di_ctimensec; /* 72: Last inode change time. */ ufs/dinode.h: int32_t di_birthnsec; /* 76: Inode creation time. */
[Note that these aren't in a timespec struct, POSIX or otherwise, since the struct would give MD packing which happens to be inefficient in most cases.]
ufs/dinode.h: int32_t di_atime; /* 16: Last access time. */ ufs/dinode.h: int32_t di_atimensec; /* 20: Last access time. */ ufs/dinode.h: int32_t di_mtime; /* 24: Last modified time. */ ufs/dinode.h: int32_t di_mtimensec; /* 28: Last modified time. */ ufs/dinode.h: int32_t di_ctime; /* 32: Last inode change time. */ ufs/dinode.h: int32_t di_ctimensec; /* 36: Last inode change time. */
[Y2.038K bugs are still in ffs1.] %%%
To change time_t to 64 bits, all in-use non-transient data structures need to be changed similarly.
Bruce





