Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Oct 2003 04:17:34 +1000 (EST)
From:      Bruce Evans <bde@zeta.org.au>
To:        Harti Brandt <brandt@fokus.fraunhofer.de>
Cc:        sparc64@freebsd.org
Subject:   Re: time_t on sparc64
Message-ID:  <20031014035805.F32262@gamplex.bde.org>
In-Reply-To: <20031013153219.H45269@beagle.fokus.fraunhofer.de>
References:  <20031013153219.H45269@beagle.fokus.fraunhofer.de>

next in thread | previous in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20031014035805.F32262>