[CIFS] readdir (ffirst) enablement of accurate timestamps from legacy servers
authorSteve French <sfrench@us.ibm.com>
Fri, 6 Oct 2006 21:47:09 +0000 (21:47 +0000)
committerSteve French <sfrench@us.ibm.com>
Fri, 6 Oct 2006 21:47:09 +0000 (21:47 +0000)
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/netmisc.c
fs/cifs/readdir.c

index fa5124d9af197b5c2f2ea82ae3556869e660be06..3d86b31cf2e4240fe5d52c9ae7fec94fdb2927ca 100644 (file)
@@ -918,45 +918,42 @@ __le64 cnvrtDosCifsTm(__u16 date, __u16 time)
 {
        return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
 }
+
 struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
 {
-       __u8  dt[2];
-       __u8  tm[2];
        struct timespec ts;
-       int sec,min, days, month, year;
-       struct timespec removeme; /* BB removeme BB */
-/*     SMB_TIME * st = (SMB_TIME *)&time;*/
+       int sec, min, days, month, year;
+       SMB_TIME * st = (SMB_TIME *)&time;
+       SMB_DATE * sd = (SMB_DATE *)&date;
 
        cFYI(1,("date %d time %d",date, time));
 
-       dt[0] = date & 0xFF;
-       dt[1] = (date & 0xFF00) >> 8;
-       tm[0] = time & 0xFF;
-       tm[1] = (time & 0xFF00) >> 8;
-
-       sec = tm[0] & 0x1F;
-       sec = 2 * sec;
-       min = ((tm[0] >>5)&0xFF) + ((tm[1] & 0x7)<<3);
-
+       sec = 2 * st->TwoSeconds;
+       min = st->Minutes;
+       if((sec > 59) || (min > 59))
+               cERROR(1,("illegal time min %d sec %d", min, sec));
        sec += (min * 60);
-       sec += 60 * 60 * ((tm[1] >> 3) &0xFF) /* hours */;
-       days = (dt[0] & 0x1F) - 1;
-       month = ((dt[0] >> 5) & 0xFF) + ((dt[1] & 0x1) <<3);
-       if(month > 12)
-               cERROR(1,("illegal month %d in date", month));
+       sec += 60 * 60 * st->Hours;
+       if(st->Hours > 24)
+               cERROR(1,("illegal hours %d",st->Hours));
+       days = sd->Day;
+       month = sd->Month;
+       if((days > 31) || (month > 12))
+               cERROR(1,("illegal date, month %d day: %d", month, days));
        month -= 1;
        days += total_days_of_prev_months[month];
        days += 3653; /* account for difference in days between 1980 and 1970 */
-       year = (dt[1]>>1) & 0xFF;
+       year = sd->Year;
        days += year * 365;
        days += (year/4); /* leap year */
        /* adjust for leap year where we are still before leap day */
        days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
        sec += 24 * 60 * 60 * days; 
 
-       removeme = CURRENT_TIME; /* BB removeme BB */
        ts.tv_sec = sec;
 
+       /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
+
        ts.tv_nsec = 0;
        return ts;
 } 
index b0e5db10664ce1299560290ee903ba21429742da..81e7b2e5fb4dc8e9a281649ec83a7a09e6b5a938 100644 (file)
@@ -139,19 +139,19 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
                FIND_FILE_STANDARD_INFO * pfindData = 
                        (FIND_FILE_STANDARD_INFO *)buf;
 
-/*             ts = cnvrtDosUnixTm(
+               tmp_inode->i_mtime = cnvrtDosUnixTm(
                                le16_to_cpu(pfindData->LastWriteDate),
-                               le16_to_cpu(pfindData->LastWriteTime));*/
+                               le16_to_cpu(pfindData->LastWriteTime));
+               tmp_inode->i_atime = cnvrtDosUnixTm(
+                               le16_to_cpu(pfindData->LastAccessDate),
+                               le16_to_cpu(pfindData->LastAccessTime));
+                tmp_inode->i_ctime = cnvrtDosUnixTm(
+                                le16_to_cpu(pfindData->LastWriteDate),
+                                le16_to_cpu(pfindData->LastWriteTime));
+
                attr = le16_to_cpu(pfindData->Attributes);
                allocation_size = le32_to_cpu(pfindData->AllocationSize);
                end_of_file = le32_to_cpu(pfindData->DataSize);
-               /* do not need to use current_fs_time helper function since
-                time not stored for this case so atime can not "go backwards"
-                by pulling newer older from disk when inode refrenshed */
-               tmp_inode->i_atime = CURRENT_TIME;
-               /* tmp_inode->i_mtime =  BB FIXME - add dos time handling
-               tmp_inode->i_ctime = 0;   BB FIXME */
-
        }
 
        /* Linux can not store file creation time unfortunately so ignore it */