On Tue, Aug 20, 2019 at 9:28 AM Matthew Wilcox willy@infradead.org 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