[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20191113035304.GA8753@eaf>
Date: Wed, 13 Nov 2019 00:53:04 -0300
From: Ernesto A. Fernández
<ernesto.mnd.fernandez@...il.com>
To: Arnd Bergmann <arnd@...db.de>
Cc: y2038@...ts.linaro.org, linux-kernel@...r.kernel.org,
Viacheslav Dubeyko <slava@...eyko.com>,
Andrew Morton <akpm@...ux-foundation.org>,
linux-fsdevel@...r.kernel.org
Subject: Re: [PATCH 13/16] hfs/hfsplus: use 64-bit inode timestamps
On Fri, Nov 08, 2019 at 10:32:51PM +0100, Arnd Bergmann wrote:
> The interpretation of on-disk timestamps in HFS and HFS+ differs
> between 32-bit and 64-bit kernels at the moment. Use 64-bit timestamps
> consistently so apply the current 64-bit behavior everyhere.
>
> According to the official documentation for HFS+ [1], inode timestamps
> are supposed to cover the time range from 1904 to 2040 as originally
> used in classic MacOS.
>
> The traditional Linux usage is to convert the timestamps into an unsigned
> 32-bit number based on the Unix epoch and from there to a time_t. On
> 32-bit systems, that wraps the time from 2038 to 1902, so the last
> two years of the valid time range become garbled. On 64-bit systems,
> all times before 1970 get turned into timestamps between 2038 and 2106,
> which is more convenient but also different from the documented behavior.
>
> Looking at the Darwin sources [2], it seems that MacOS is inconsistent in
> yet another way: all timestamps are wrapped around to a 32-bit unsigned
> number when written to the disk, but when read back, all numeric values
> lower than 2082844800U are assumed to be invalid, so we cannot represent
> the times before 1970 or the times after 2040.
>
> While all implementations seem to agree on the interpretation of values
> between 1970 and 2038, they often differ on the exact range they support
> when reading back values outside of the common range:
>
> MacOS (traditional): 1904-2040
> Apple Documentation: 1904-2040
> MacOS X source comments: 1970-2040
> MacOS X source code: 1970-2038
> 32-bit Linux: 1902-2038
> 64-bit Linux: 1970-2106
> hfsfuse: 1970-2040
> hfsutils (32 bit, old libc) 1902-2038
> hfsutils (32 bit, new libc) 1970-2106
> hfsutils (64 bit) 1904-2040
> hfsplus-utils 1904-2040
> hfsexplorer 1904-2040
> 7-zip 1904-2040
>
> Out of the above, the range from 1970 to 2106 seems to be the most useful,
> as it allows using HFS and HFS+ beyond year 2038, and this matches the
> behavior that most users would see today on Linux, as few people run
> 32-bit kernels any more.
>
> Link: [1] https://developer.apple.com/library/archive/technotes/tn/tn1150.html
> Link: [2] https://opensource.apple.com/source/hfs/hfs-407.30.1/core/MacOSStubs.c.auto.html
> Link: https://lore.kernel.org/lkml/20180711224625.airwna6gzyatoowe@eaf/
> Cc: Viacheslav Dubeyko <slava@...eyko.com>
> Suggested-by: "Ernesto A. Fernández" <ernesto.mnd.fernandez@...il.com>
> Signed-off-by: Arnd Bergmann <arnd@...db.de>
> ---
Reviewed-by: Ernesto A. Fernández <ernesto.mnd.fernandez@...il.com>
Powered by blists - more mailing lists