mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 21:33:52 +00:00
CIFS: Force reval dentry if LOOKUP_REVAL flag is set
commit 0b3d0ef984
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>
This commit is contained in:
parent
0bc78de461
commit
230b339a7c
1 changed files with 7 additions and 1 deletions
|
@ -840,10 +840,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 {
|
||||
|
@ -854,7 +860,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;
|
||||
|
|
Loading…
Reference in a new issue