|
@@ -401,9 +401,25 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|
|
rc = -ENOMEM;
|
|
|
} else {
|
|
|
/* we already have inode, update it */
|
|
|
+
|
|
|
+ /* if uniqueid is different, return error */
|
|
|
+ if (unlikely(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM &&
|
|
|
+ CIFS_I(*pinode)->uniqueid != fattr.cf_uniqueid)) {
|
|
|
+ rc = -ESTALE;
|
|
|
+ goto cgiiu_exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* if filetype is different, return error */
|
|
|
+ if (unlikely(((*pinode)->i_mode & S_IFMT) !=
|
|
|
+ (fattr.cf_mode & S_IFMT))) {
|
|
|
+ rc = -ESTALE;
|
|
|
+ goto cgiiu_exit;
|
|
|
+ }
|
|
|
+
|
|
|
cifs_fattr_to_inode(*pinode, &fattr);
|
|
|
}
|
|
|
|
|
|
+cgiiu_exit:
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -838,6 +854,15 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
|
|
|
if (!*inode)
|
|
|
rc = -ENOMEM;
|
|
|
} else {
|
|
|
+ /* we already have inode, update it */
|
|
|
+
|
|
|
+ /* if filetype is different, return error */
|
|
|
+ if (unlikely(((*inode)->i_mode & S_IFMT) !=
|
|
|
+ (fattr.cf_mode & S_IFMT))) {
|
|
|
+ rc = -ESTALE;
|
|
|
+ goto cgii_exit;
|
|
|
+ }
|
|
|
+
|
|
|
cifs_fattr_to_inode(*inode, &fattr);
|
|
|
}
|
|
|
|