mirror of https://gitee.com/openkylin/linux.git
CIFS: Fix DFS handling in cifs_get_file_info
We should call cifs_all_info_to_fattr in rc == 0 case only. Cc: <stable@kernel.org> Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> Reviewed-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <smfrench@gmail.com>
This commit is contained in:
parent
a2d6b6cacb
commit
42274bb22a
|
@ -562,7 +562,16 @@ int cifs_get_file_info(struct file *filp)
|
|||
|
||||
xid = GetXid();
|
||||
rc = CIFSSMBQFileInfo(xid, tcon, cfile->netfid, &find_data);
|
||||
if (rc == -EOPNOTSUPP || rc == -EINVAL) {
|
||||
switch (rc) {
|
||||
case 0:
|
||||
cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false);
|
||||
break;
|
||||
case -EREMOTE:
|
||||
cifs_create_dfs_fattr(&fattr, inode->i_sb);
|
||||
rc = 0;
|
||||
break;
|
||||
case -EOPNOTSUPP:
|
||||
case -EINVAL:
|
||||
/*
|
||||
* FIXME: legacy server -- fall back to path-based call?
|
||||
* for now, just skip revalidating and mark inode for
|
||||
|
@ -570,18 +579,14 @@ int cifs_get_file_info(struct file *filp)
|
|||
*/
|
||||
rc = 0;
|
||||
CIFS_I(inode)->time = 0;
|
||||
default:
|
||||
goto cgfi_exit;
|
||||
} else if (rc == -EREMOTE) {
|
||||
cifs_create_dfs_fattr(&fattr, inode->i_sb);
|
||||
rc = 0;
|
||||
} else if (rc)
|
||||
goto cgfi_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* don't bother with SFU junk here -- just mark inode as needing
|
||||
* revalidation.
|
||||
*/
|
||||
cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false);
|
||||
fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
|
||||
fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
|
||||
cifs_fattr_to_inode(inode, &fattr);
|
||||
|
|
Loading…
Reference in New Issue