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 <vvi...@valentin-vidic.from.hr>
---
 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
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to