| From 5ff95cdca4f06a8e7d8f06db2607ca655123c801 Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <piastryyy@gmail.com> |
| Date: Mon, 30 Sep 2019 10:06:20 -0700 |
| Subject: [PATCH] CIFS: Force reval dentry if LOOKUP_REVAL flag is set |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c |
| index f26a48dd2e39..53b5bdf465e0 100644 |
| --- a/fs/cifs/dir.c |
| +++ b/fs/cifs/dir.c |
| @@ -739,10 +739,16 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, |
| 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 { |
| @@ -753,7 +759,7 @@ cifs_d_revalidate(struct dentry *direntry, unsigned int flags) |
| * 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; |
| -- |
| 2.7.4 |
| |