Use create_time_ms and modify_time_ms fields to store the millisecond part of the file timestamp with the precision of 10 ms. Signed-off-by: Valentin Vidic <vvidic@xxxxxxxxxxxxxxxxxxxxxx> --- drivers/staging/exfat/exfat_core.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/staging/exfat/exfat_core.c b/drivers/staging/exfat/exfat_core.c index d21f68d786b8..d6e33a485d5f 100644 --- a/drivers/staging/exfat/exfat_core.c +++ b/drivers/staging/exfat/exfat_core.c @@ -1139,6 +1139,7 @@ void exfat_set_entry_size(struct dentry_t *p_entry, u64 size) void fat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, u8 mode) { + u8 ms = 0; u16 t = 0x00, d = 0x21; struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry; @@ -1146,6 +1147,7 @@ void fat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, case TM_CREATE: t = GET16_A(ep->create_time); d = GET16_A(ep->create_date); + ms = ep->create_time_ms * 10; break; case TM_MODIFY: t = GET16_A(ep->modify_time); @@ -1159,11 +1161,17 @@ void fat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, tp->day = (d & 0x001F); tp->mon = (d >> 5) & 0x000F; tp->year = (d >> 9); + + if (ms >= 1000) { + ms -= 1000; + tp->sec++; + } } void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, u8 mode) { + u8 ms = 0; u16 t = 0x00, d = 0x21; struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; @@ -1171,10 +1179,12 @@ void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, case TM_CREATE: t = GET16_A(ep->create_time); d = GET16_A(ep->create_date); + ms = ep->create_time_ms * 10; break; case TM_MODIFY: t = GET16_A(ep->modify_time); d = GET16_A(ep->modify_date); + ms = ep->modify_time_ms * 10; break; case TM_ACCESS: t = GET16_A(ep->access_time); @@ -1188,21 +1198,32 @@ void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, tp->day = (d & 0x001F); tp->mon = (d >> 5) & 0x000F; tp->year = (d >> 9); + + if (ms >= 1000) { + ms -= 1000; + tp->sec++; + } } void fat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, u8 mode) { + u8 ms; u16 t, d; struct dos_dentry_t *ep = (struct dos_dentry_t *)p_entry; t = (tp->hour << 11) | (tp->min << 5) | (tp->sec >> 1); d = (tp->year << 9) | (tp->mon << 5) | tp->day; + ms = tp->millisec; + if (tp->sec & 1) + ms += 1000; + switch (mode) { case TM_CREATE: SET16_A(ep->create_time, t); SET16_A(ep->create_date, d); + ep->create_time_ms = ms / 10; break; case TM_MODIFY: SET16_A(ep->modify_time, t); @@ -1214,20 +1235,27 @@ void fat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, u8 mode) { + u8 ms; u16 t, d; struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; t = (tp->hour << 11) | (tp->min << 5) | (tp->sec >> 1); d = (tp->year << 9) | (tp->mon << 5) | tp->day; + ms = tp->millisec; + if (tp->sec & 1) + ms += 1000; + switch (mode) { case TM_CREATE: SET16_A(ep->create_time, t); SET16_A(ep->create_date, d); + ep->create_time_ms = ms / 10; break; case TM_MODIFY: SET16_A(ep->modify_time, t); SET16_A(ep->modify_date, d); + ep->modify_time_ms = ms / 10; break; case TM_ACCESS: SET16_A(ep->access_time, t); -- 2.20.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel