summary refs log tree commit diff
path: root/fs/cifs/netmisc.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2006-10-06 21:47:09 +0000
committerSteve French <sfrench@us.ibm.com>2006-10-06 21:47:09 +0000
commit268f3be177ce93791da38facc34126b5038cd851 (patch)
tree93603e3ac7209dd390125d8c71cfaee3ceff7547 /fs/cifs/netmisc.c
parent1a70d6529ad9f5978af846440f8a809784d6e813 (diff)
downloadlinux-268f3be177ce93791da38facc34126b5038cd851.tar.gz
[CIFS] readdir (ffirst) enablement of accurate timestamps from legacy servers
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/netmisc.c')
-rw-r--r--fs/cifs/netmisc.c39
1 files changed, 18 insertions, 21 deletions
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c
index fa5124d9af19..3d86b31cf2e4 100644
--- a/fs/cifs/netmisc.c
+++ b/fs/cifs/netmisc.c
@@ -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;
 }