CIFS: Force revalidate inode when dentry is stale
Currently the client indicates that a dentry is stale when inode numbers or type types between a local inode and a remote file don't match. If this is the case attributes is not being copied from remote to local, so, it is already known that the local copy has stale metadata. That's why the inode needs to be marked for revalidation in order to tell the VFS to lookup the dentry again before openning a file. This prevents unexpected stale errors to be returned to the user space when openning a file. Cc: <stable@vger.kernel.org> Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
d4cfbf04b2
commit
c82e5ac7fe
|
@ -414,6 +414,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
||||||
/* if uniqueid is different, return error */
|
/* if uniqueid is different, return error */
|
||||||
if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
|
if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
|
||||||
CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
|
CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
|
||||||
|
CIFS_I(*pinode)->time = 0; /* force reval */
|
||||||
rc = -ESTALE;
|
rc = -ESTALE;
|
||||||
goto cgiiu_exit;
|
goto cgiiu_exit;
|
||||||
}
|
}
|
||||||
|
@ -421,6 +422,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
||||||
/* if filetype is different, return error */
|
/* if filetype is different, return error */
|
||||||
if (unlikely(((*pinode)->i_mode & S_IFMT) !=
|
if (unlikely(((*pinode)->i_mode & S_IFMT) !=
|
||||||
(fattr.cf_mode & S_IFMT))) {
|
(fattr.cf_mode & S_IFMT))) {
|
||||||
|
CIFS_I(*pinode)->time = 0; /* force reval */
|
||||||
rc = -ESTALE;
|
rc = -ESTALE;
|
||||||
goto cgiiu_exit;
|
goto cgiiu_exit;
|
||||||
}
|
}
|
||||||
|
@ -933,6 +935,7 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
|
||||||
/* if uniqueid is different, return error */
|
/* if uniqueid is different, return error */
|
||||||
if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
|
if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
|
||||||
CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
|
CIFS_I(*inode)->uniqueid != fattr.cf_uniqueid)) {
|
||||||
|
CIFS_I(*inode)->time = 0; /* force reval */
|
||||||
rc = -ESTALE;
|
rc = -ESTALE;
|
||||||
goto cgii_exit;
|
goto cgii_exit;
|
||||||
}
|
}
|
||||||
|
@ -940,6 +943,7 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
|
||||||
/* if filetype is different, return error */
|
/* if filetype is different, return error */
|
||||||
if (unlikely(((*inode)->i_mode & S_IFMT) !=
|
if (unlikely(((*inode)->i_mode & S_IFMT) !=
|
||||||
(fattr.cf_mode & S_IFMT))) {
|
(fattr.cf_mode & S_IFMT))) {
|
||||||
|
CIFS_I(*inode)->time = 0; /* force reval */
|
||||||
rc = -ESTALE;
|
rc = -ESTALE;
|
||||||
goto cgii_exit;
|
goto cgii_exit;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue