Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 268f3be1 authored by Steve French's avatar Steve French
Browse files

[CIFS] readdir (ffirst) enablement of accurate timestamps from legacy servers



Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 1a70d652
Loading
Loading
Loading
Loading
+18 −21
Original line number Diff line number Diff line
@@ -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;*/
	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;
} 
+9 −9
Original line number Diff line number Diff line
@@ -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 */