| From 42274bb22afc3e877ae5abed787b0b09d7dede52 Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <piastry@etersoft.ru> |
| Date: Sat, 22 Oct 2011 14:37:50 +0400 |
| Subject: CIFS: Fix DFS handling in cifs_get_file_info |
| |
| From: Pavel Shilovsky <piastry@etersoft.ru> |
| |
| commit 42274bb22afc3e877ae5abed787b0b09d7dede52 upstream. |
| |
| We should call cifs_all_info_to_fattr in rc == 0 case only. |
| |
| Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> |
| Reviewed-by: Jeff Layton <jlayton@redhat.com> |
| Signed-off-by: Steve French <smfrench@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/cifs/inode.c | 19 ++++++++++++------- |
| 1 file changed, 12 insertions(+), 7 deletions(-) |
| |
| --- a/fs/cifs/inode.c |
| +++ b/fs/cifs/inode.c |
| @@ -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); |