Skip to content
  • Arnd Bergmann's avatar
    hfs/hfsplus: use 64-bit inode timestamps · 4ddfc3dc
    Arnd Bergmann authored
    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/
    
    
    Suggested-by: default avatar"Ernesto A. Fernández" <ernesto.mnd.fernandez@gmail.com>
    Reviewed-by: default avatarVyacheslav Dubeyko <slava@dubeyko.com>
    Reviewed-by: default avatarErnesto A. Fernández <ernesto.mnd.fernandez@gmail.com>
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    ---
    v3: revert back to 1970-2106 time range
        fix bugs found in review
        merge both patches into one
        drop cc:stable tag
    v2: treat pre-1970 dates as invalid following MacOS X behavior,
        reword and expand changelog text
    4ddfc3dc