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:
committed by
Steve French
parent
a2d6b6cacb
commit
42274bb22a
@@ -562,7 +562,16 @@ int cifs_get_file_info(struct file *filp)
|
|||||||
|
|
||||||
xid = GetXid();
|
xid = GetXid();
|
||||||
rc = CIFSSMBQFileInfo(xid, tcon, cfile->netfid, &find_data);
|
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?
|
* FIXME: legacy server -- fall back to path-based call?
|
||||||
* for now, just skip revalidating and mark inode for
|
* for now, just skip revalidating and mark inode for
|
||||||
@@ -570,18 +579,14 @@ int cifs_get_file_info(struct file *filp)
|
|||||||
*/
|
*/
|
||||||
rc = 0;
|
rc = 0;
|
||||||
CIFS_I(inode)->time = 0;
|
CIFS_I(inode)->time = 0;
|
||||||
|
default:
|
||||||
goto cgfi_exit;
|
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
|
* don't bother with SFU junk here -- just mark inode as needing
|
||||||
* revalidation.
|
* revalidation.
|
||||||
*/
|
*/
|
||||||
cifs_all_info_to_fattr(&fattr, &find_data, cifs_sb, false);
|
|
||||||
fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
|
fattr.cf_uniqueid = CIFS_I(inode)->uniqueid;
|
||||||
fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
|
fattr.cf_flags |= CIFS_FATTR_NEED_REVAL;
|
||||||
cifs_fattr_to_inode(inode, &fattr);
|
cifs_fattr_to_inode(inode, &fattr);
|
||||||
|
Reference in New Issue
Block a user