| From 0b3d0ef9840f7be202393ca9116b857f6f793715 Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| Date: Mon, 30 Sep 2019 10:06:20 -0700 |
| Subject: CIFS: Force reval dentry if LOOKUP_REVAL flag is set |
| |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| |
| commit 0b3d0ef9840f7be202393ca9116b857f6f793715 upstream. |
| |
| Mark inode for force revalidation if LOOKUP_REVAL flag is set. |
| This tells the client to actually send a QueryInfo request to |
| the server to obtain the latest metadata in case a directory |
| or a file were changed remotely. Only do that if the client |
| doesn't have a lease for the file to avoid unneeded round |
| trips to the server. |
| |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/dir.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| --- a/fs/cifs/dir.c |
| +++ b/fs/cifs/dir.c |
| @@ -830,10 +830,16 @@ lookup_out: |
| static int |
| cifs_d_revalidate(struct dentry *direntry, unsigned int flags) |
| { |
| + struct inode *inode; |
| + |
| if (flags & LOOKUP_RCU) |
| return -ECHILD; |
| |
| if (d_really_is_positive(direntry)) { |
| + inode = d_inode(direntry); |
| + if ((flags & LOOKUP_REVAL) && !CIFS_CACHE_READ(CIFS_I(inode))) |
| + CIFS_I(inode)->time = 0; /* force reval */ |
| + |
| if (cifs_revalidate_dentry(direntry)) |
| return 0; |
| else { |
| @@ -844,7 +850,7 @@ cifs_d_revalidate(struct dentry *direntr |
| * attributes will have been updated by |
| * cifs_revalidate_dentry(). |
| */ |
| - if (IS_AUTOMOUNT(d_inode(direntry)) && |
| + if (IS_AUTOMOUNT(inode) && |
| !(direntry->d_flags & DCACHE_NEED_AUTOMOUNT)) { |
| spin_lock(&direntry->d_lock); |
| direntry->d_flags |= DCACHE_NEED_AUTOMOUNT; |