summaryrefslogtreecommitdiffstats
path: root/fs/cifs/file.c
diff options
context:
space:
mode:
authorSteve French <stfrench@microsoft.com>2019-12-02 21:46:54 -0600
committerSteve French <stfrench@microsoft.com>2019-12-03 15:48:02 -0600
commit43f8a6a74ee2442b9410ed297f5d4c77e7cb5ace (patch)
tree0eabdc6fb77016e544ea32569722114e67b8a6b9 /fs/cifs/file.c
parent9e8fae2597405ab1deac8909928eb8e99876f639 (diff)
downloadlinux-43f8a6a74ee2442b9410ed297f5d4c77e7cb5ace.tar.gz
linux-43f8a6a74ee2442b9410ed297f5d4c77e7cb5ace.tar.bz2
linux-43f8a6a74ee2442b9410ed297f5d4c77e7cb5ace.zip
smb3: query attributes on file close
Since timestamps on files on most servers can be updated at close, and since timestamps on our dentries default to one second we can have stale timestamps in some common cases (e.g. open, write, close, stat, wait one second, stat - will show different mtime for the first and second stat). The SMB2/SMB3 protocol allows querying timestamps at close so add the code to request timestamp and attr information (which is cheap for the server to provide) to be returned when a file is closed (it is not needed for the many paths that call SMB2_close that are from compounded query infos and close nor is it needed for some of the cases where a directory close immediately follows a directory open. Signed-off-by: Steve French <stfrench@microsoft.com> Acked-by: Ronnie Sahlberg <lsahlber@redhat.com> Reviewed-by: Aurelien Aptel <aaptel@suse.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r--fs/cifs/file.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 9ae41042fa3d..043288b5c728 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -496,7 +496,9 @@ void _cifsFileInfo_put(struct cifsFileInfo *cifs_file,
unsigned int xid;
xid = get_xid();
- if (server->ops->close)
+ if (server->ops->close_getattr)
+ server->ops->close_getattr(xid, tcon, cifs_file);
+ else if (server->ops->close)
server->ops->close(xid, tcon, &cifs_file->fid);
_free_xid(xid);
}