Rework time updates, more close to like windows does. Still do not update for / because of sync problems.

edge.strict_endians
cha0smaster 2005-11-17 18:00:58 +00:00
parent e4cb2b5a4e
commit 2367a06b6e
3 changed files with 55 additions and 20 deletions

View File

@ -171,6 +171,9 @@ static __inline__ void ntfs_inode_mark_dirty(ntfs_inode *ni)
NInoSetDirty(ni->base_ni);
}
extern void ntfs_inode_update_atime(ntfs_inode *ni);
extern void ntfs_inode_update_time(ntfs_inode *ni);
extern int ntfs_inode_sync(ntfs_inode *ni);
extern int ntfs_inode_add_attrlist(ntfs_inode *ni);

View File

@ -55,7 +55,6 @@
#include "compress.h"
#include "bitmap.h"
#include "logging.h"
#include "ntfstime.h"
ntfschar AT_UNNAMED[] = { const_cpu_to_le16('\0') };
@ -771,14 +770,10 @@ s64 ntfs_attr_pread(ntfs_attr *na, const s64 pos, s64 count, void *b)
return -1;
}
vol = na->ni->vol;
/* Update access time if accessing unnamed data attribute. */
if (!NVolReadOnly(vol) && !NVolNoATime(vol) && na->ni->mft_no >=
FILE_first_user && na->type == AT_DATA &&
na->name == AT_UNNAMED) {
na->ni->last_access_time = time(NULL);
NInoFileNameSetDirty(na->ni);
NInoSetDirty(na->ni);
}
/* Update access time if needed. */
if (na->type == AT_DATA || na->type == AT_INDEX_ROOT ||
na->type == AT_INDEX_ALLOCATION)
ntfs_inode_update_atime(na->ni);
if (!count)
return 0;
/* Truncate reads beyond end of attribute. */
@ -960,14 +955,10 @@ s64 ntfs_attr_pwrite(ntfs_attr *na, const s64 pos, s64 count, const void *b)
errno = EOPNOTSUPP;
return -1;
}
/* Update time if writing to unnamed data attribute. */
if (na->ni->mft_no >= FILE_first_user && na->type == AT_DATA &&
na->name == AT_UNNAMED) {
na->ni->last_data_change_time = time(NULL);
na->ni->last_mft_change_time = time(NULL);
NInoFileNameSetDirty(na->ni);
NInoSetDirty(na->ni);
}
/* Update access and change times if needed. */
if (na->type == AT_DATA || na->type == AT_INDEX_ROOT ||
na->type == AT_INDEX_ALLOCATION)
ntfs_inode_update_time(na->ni);
if (!count)
return 0;
/* If the write reaches beyond the end, extend the attribute. */
@ -4932,10 +4923,8 @@ int ntfs_attr_truncate(ntfs_attr *na, const s64 newsize)
ret = ntfs_non_resident_attr_shrink(na, newsize);
} else
ret = ntfs_resident_attr_resize(na, newsize);
/* Set FILE_NAME dirty flag, to update length and time in the index. */
/* Set FILE_NAME dirty flag, to update file length in the index. */
if (na->type == AT_DATA && na->name == AT_UNNAMED) {
na->ni->last_data_change_time = time(NULL);
na->ni->last_mft_change_time = time(NULL);
na->ni->data_size = na->data_size;
/*
* If attribute sparse or compressed then allocated size in
@ -4948,5 +4937,9 @@ int ntfs_attr_truncate(ntfs_attr *na, const s64 newsize)
na->ni->allocated_size = na->allocated_size;
NInoFileNameSetDirty(na->ni);
}
/* Update access and change times if needed. */
if (na->type == AT_DATA || na->type == AT_INDEX_ROOT ||
na->type == AT_INDEX_ALLOCATION)
ntfs_inode_update_time(na->ni);
return ret;
}

View File

@ -1058,6 +1058,45 @@ put_err_out:
return -1;
}
/**
* ntfs_inode_update_atime - update access time for ntfs inode
* @ni: ntfs inode for which update access time
*
* This function usually get called when user read not metadata from inode.
* Do not update time for system files.
*/
void ntfs_inode_update_atime(ntfs_inode *ni)
{
if (!NVolReadOnly(ni->vol) && !NVolNoATime(ni->vol) && (ni->mft_no >=
FILE_first_user /*|| ni->mft_no == FILE_root*/)) {
ni->last_access_time = time(NULL);
NInoFileNameSetDirty(ni);
NInoSetDirty(ni);
}
}
/**
* ntfs_inode_update_time - update all times for ntfs inode
* @ni: ntfs inode for which udpate times
*
* This function updates last access, mft and data change times. Usually
* get called when user write not metadata to inode. Do not update time for
* system files.
*/
void ntfs_inode_update_time(ntfs_inode *ni)
{
if (!NVolReadOnly(ni->vol) && !NVolNoATime(ni->vol) && (ni->mft_no >=
FILE_first_user /*|| ni->mft_no == FILE_root*/)) {
time_t now;
now = time(NULL);
ni->last_access_time = now;
ni->last_data_change_time = now;
ni->last_mft_change_time = now;
NInoFileNameSetDirty(ni);
NInoSetDirty(ni);
}
}
#ifdef NTFS_RICH