Skip to content

Commit 9b9c5be

Browse files
author
Steve French
committed
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>
1 parent 3d62123 commit 9b9c5be

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

fs/cifs/connect.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ static const match_table_t cifs_mount_option_tokens = {
250250
{ Opt_ignore, "dev" },
251251
{ Opt_ignore, "mand" },
252252
{ Opt_ignore, "nomand" },
253+
{ Opt_ignore, "relatime" },
253254
{ Opt_ignore, "_netdev" },
254255

255256
{ Opt_err, NULL }

fs/cifs/file.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3889,8 +3889,12 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
38893889
else
38903890
cifs_dbg(FYI, "Bytes read %d\n", rc);
38913891

3892-
file_inode(file)->i_atime =
3893-
current_time(file_inode(file));
3892+
/* we do not want atime to be less than mtime, it broke some apps */
3893+
file_inode(file)->i_atime = current_time(file_inode(file));
3894+
if (timespec64_compare(&(file_inode(file)->i_atime), &(file_inode(file)->i_mtime)))
3895+
file_inode(file)->i_atime = file_inode(file)->i_mtime;
3896+
else
3897+
file_inode(file)->i_atime = current_time(file_inode(file));
38943898

38953899
if (PAGE_SIZE > rc)
38963900
memset(read_data + rc, 0, PAGE_SIZE - rc);

fs/cifs/inode.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,11 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
162162
cifs_revalidate_cache(inode, fattr);
163163

164164
spin_lock(&inode->i_lock);
165-
inode->i_atime = fattr->cf_atime;
165+
/* we do not want atime to be less than mtime, it broke some apps */
166+
if (timespec64_compare(&fattr->cf_atime, &fattr->cf_mtime))
167+
inode->i_atime = fattr->cf_mtime;
168+
else
169+
inode->i_atime = fattr->cf_atime;
166170
inode->i_mtime = fattr->cf_mtime;
167171
inode->i_ctime = fattr->cf_ctime;
168172
inode->i_rdev = fattr->cf_rdev;

0 commit comments

Comments
 (0)