[CIFS] readdir (ffirst) enablement of accurate timestamps from legacy servers
Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
1a70d6529a
commit
268f3be177
@ -918,45 +918,42 @@ __le64 cnvrtDosCifsTm(__u16 date, __u16 time)
|
|||||||
{
|
{
|
||||||
return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
|
return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
|
struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
|
||||||
{
|
{
|
||||||
__u8 dt[2];
|
|
||||||
__u8 tm[2];
|
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int sec,min, days, month, year;
|
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));
|
cFYI(1,("date %d time %d",date, time));
|
||||||
|
|
||||||
dt[0] = date & 0xFF;
|
sec = 2 * st->TwoSeconds;
|
||||||
dt[1] = (date & 0xFF00) >> 8;
|
min = st->Minutes;
|
||||||
tm[0] = time & 0xFF;
|
if((sec > 59) || (min > 59))
|
||||||
tm[1] = (time & 0xFF00) >> 8;
|
cERROR(1,("illegal time min %d sec %d", min, sec));
|
||||||
|
|
||||||
sec = tm[0] & 0x1F;
|
|
||||||
sec = 2 * sec;
|
|
||||||
min = ((tm[0] >>5)&0xFF) + ((tm[1] & 0x7)<<3);
|
|
||||||
|
|
||||||
sec += (min * 60);
|
sec += (min * 60);
|
||||||
sec += 60 * 60 * ((tm[1] >> 3) &0xFF) /* hours */;
|
sec += 60 * 60 * st->Hours;
|
||||||
days = (dt[0] & 0x1F) - 1;
|
if(st->Hours > 24)
|
||||||
month = ((dt[0] >> 5) & 0xFF) + ((dt[1] & 0x1) <<3);
|
cERROR(1,("illegal hours %d",st->Hours));
|
||||||
if(month > 12)
|
days = sd->Day;
|
||||||
cERROR(1,("illegal month %d in date", month));
|
month = sd->Month;
|
||||||
|
if((days > 31) || (month > 12))
|
||||||
|
cERROR(1,("illegal date, month %d day: %d", month, days));
|
||||||
month -= 1;
|
month -= 1;
|
||||||
days += total_days_of_prev_months[month];
|
days += total_days_of_prev_months[month];
|
||||||
days += 3653; /* account for difference in days between 1980 and 1970 */
|
days += 3653; /* account for difference in days between 1980 and 1970 */
|
||||||
year = (dt[1]>>1) & 0xFF;
|
year = sd->Year;
|
||||||
days += year * 365;
|
days += year * 365;
|
||||||
days += (year/4); /* leap year */
|
days += (year/4); /* leap year */
|
||||||
/* adjust for leap year where we are still before leap day */
|
/* adjust for leap year where we are still before leap day */
|
||||||
days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
|
days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
|
||||||
sec += 24 * 60 * 60 * days;
|
sec += 24 * 60 * 60 * days;
|
||||||
|
|
||||||
removeme = CURRENT_TIME; /* BB removeme BB */
|
|
||||||
ts.tv_sec = sec;
|
ts.tv_sec = sec;
|
||||||
|
|
||||||
|
/* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
|
||||||
|
|
||||||
ts.tv_nsec = 0;
|
ts.tv_nsec = 0;
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
|
@ -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 * pfindData =
|
||||||
(FIND_FILE_STANDARD_INFO *)buf;
|
(FIND_FILE_STANDARD_INFO *)buf;
|
||||||
|
|
||||||
/* ts = cnvrtDosUnixTm(
|
tmp_inode->i_mtime = cnvrtDosUnixTm(
|
||||||
le16_to_cpu(pfindData->LastWriteDate),
|
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);
|
attr = le16_to_cpu(pfindData->Attributes);
|
||||||
allocation_size = le32_to_cpu(pfindData->AllocationSize);
|
allocation_size = le32_to_cpu(pfindData->AllocationSize);
|
||||||
end_of_file = le32_to_cpu(pfindData->DataSize);
|
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 */
|
/* Linux can not store file creation time unfortunately so ignore it */
|
||||||
|
Loading…
Reference in New Issue
Block a user