On Tue, Aug 20, 2019 at 9:28 AM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Sun, Aug 18, 2019 at 09:58:05AM -0700, Deepa Dinamani wrote: > > Note that the min timestamp is assumed to be > > 01 Jan 1970 00:00:00 (Unix epoch). This is consistent > > with the way we convert timestamps in adfs_adfs2unix_time(). > > That's not actually correct. RISC OS timestamps are centiseconds since > 1900 stored in 5 bytes. The timestamp can hold earlier values but the fs implementation explicitly rejects those in adfs_adfs2unix_time() too_early check. We could fix the implementation to not throw away times before 1970. Are you suggesting we want to do this? I could post a separate patch to fix this or we could do it as part of the series. static void adfs_adfs2unix_time(struct timespec64 *tv, struct inode *inode) { unsigned int high, low; static const s64 nsec_unix_epoch_diff_risc_os_epoch = RISC_OS_EPOCH_DELTA * NSEC_PER_SEC; s64 nsec; if (!adfs_inode_is_stamped(inode)) goto cur_time; high = ADFS_I(inode)->loadaddr & 0xFF; /* top 8 bits of timestamp */ low = ADFS_I(inode)->execaddr; /* bottom 32 bits of timestamp */ /* convert 40-bit centi-seconds to 32-bit seconds * going via nanoseconds to retain precision */ nsec = (((s64) high << 32) | (s64) low) * 10000000; /* cs to ns */ /* Files dated pre 01 Jan 1970 00:00:00. */ if (nsec < nsec_unix_epoch_diff_risc_os_epoch) goto too_early; /* convert from RISC OS to Unix epoch */ nsec -= nsec_unix_epoch_diff_risc_os_epoch; *tv = ns_to_timespec64(nsec); return; cur_time: *tv = current_time(inode); return; too_early: tv->tv_sec = tv->tv_nsec = 0; return; } -Deepa