|
@@ -814,8 +814,21 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
|
|
|
}
|
|
|
} else
|
|
|
fattr.cf_uniqueid = iunique(sb, ROOT_I);
|
|
|
- } else
|
|
|
- fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
|
|
|
+ } else {
|
|
|
+ if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) &&
|
|
|
+ validinum == false && server->ops->get_srv_inum) {
|
|
|
+ /*
|
|
|
+ * Pass a NULL tcon to ensure we don't make a round
|
|
|
+ * trip to the server. This only works for SMB2+.
|
|
|
+ */
|
|
|
+ tmprc = server->ops->get_srv_inum(xid,
|
|
|
+ NULL, cifs_sb, full_path,
|
|
|
+ &fattr.cf_uniqueid, data);
|
|
|
+ if (tmprc)
|
|
|
+ fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
|
|
|
+ } else
|
|
|
+ fattr.cf_uniqueid = CIFS_I(*inode)->uniqueid;
|
|
|
+ }
|
|
|
|
|
|
/* query for SFU type info if supported and needed */
|
|
|
if (fattr.cf_cifsattrs & ATTR_SYSTEM &&
|
|
@@ -856,6 +869,13 @@ cifs_get_inode_info(struct inode **inode, const char *full_path,
|
|
|
} 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(*inode)->uniqueid != fattr.cf_uniqueid)) {
|
|
|
+ rc = -ESTALE;
|
|
|
+ goto cgii_exit;
|
|
|
+ }
|
|
|
+
|
|
|
/* if filetype is different, return error */
|
|
|
if (unlikely(((*inode)->i_mode & S_IFMT) !=
|
|
|
(fattr.cf_mode & S_IFMT))) {
|