cifs: do not return atime less than mtime
In network file system it is fairly easy for server and client atime vs. mtime to get confused (and atime updated less frequently) which we noticed broke some apps which expect atime >= mtime Also ignore relatime mount option (rather than error on it) since relatime is basically what some network server fs are doing (relatime). Signed-off-by: Steve French <stfrench@microsoft.com> Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
This commit is contained in:
Родитель
3d621230b8
Коммит
9b9c5bea0b
|
@ -250,6 +250,7 @@ static const match_table_t cifs_mount_option_tokens = {
|
|||
{ Opt_ignore, "dev" },
|
||||
{ Opt_ignore, "mand" },
|
||||
{ Opt_ignore, "nomand" },
|
||||
{ Opt_ignore, "relatime" },
|
||||
{ Opt_ignore, "_netdev" },
|
||||
|
||||
{ Opt_err, NULL }
|
||||
|
|
|
@ -3889,8 +3889,12 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
|
|||
else
|
||||
cifs_dbg(FYI, "Bytes read %d\n", rc);
|
||||
|
||||
file_inode(file)->i_atime =
|
||||
current_time(file_inode(file));
|
||||
/* we do not want atime to be less than mtime, it broke some apps */
|
||||
file_inode(file)->i_atime = current_time(file_inode(file));
|
||||
if (timespec64_compare(&(file_inode(file)->i_atime), &(file_inode(file)->i_mtime)))
|
||||
file_inode(file)->i_atime = file_inode(file)->i_mtime;
|
||||
else
|
||||
file_inode(file)->i_atime = current_time(file_inode(file));
|
||||
|
||||
if (PAGE_SIZE > rc)
|
||||
memset(read_data + rc, 0, PAGE_SIZE - rc);
|
||||
|
|
|
@ -162,7 +162,11 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
|
|||
cifs_revalidate_cache(inode, fattr);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
inode->i_atime = fattr->cf_atime;
|
||||
/* we do not want atime to be less than mtime, it broke some apps */
|
||||
if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime))
|
||||
inode->i_atime = fattr->cf_mtime;
|
||||
else
|
||||
inode->i_atime = fattr->cf_atime;
|
||||
inode->i_mtime = fattr->cf_mtime;
|
||||
inode->i_ctime = fattr->cf_ctime;
|
||||
inode->i_rdev = fattr->cf_rdev;
|
||||
|
|
Загрузка…
Ссылка в новой задаче