diff options
Diffstat (limited to 'fs/cifs/smb2inode.c')
| -rw-r--r-- | fs/cifs/smb2inode.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c index 78ff88c467b..84c012a6aba 100644 --- a/fs/cifs/smb2inode.c +++ b/fs/cifs/smb2inode.c @@ -123,12 +123,13 @@ move_smb2_info_to_cifs(FILE_ALL_INFO *dst, struct smb2_file_all_info *src)  int  smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,  		     struct cifs_sb_info *cifs_sb, const char *full_path, -		     FILE_ALL_INFO *data, bool *adjust_tz) +		     FILE_ALL_INFO *data, bool *adjust_tz, bool *symlink)  {  	int rc;  	struct smb2_file_all_info *smb2_data;  	*adjust_tz = false; +	*symlink = false;  	smb2_data = kzalloc(sizeof(struct smb2_file_all_info) + MAX_NAME * 2,  			    GFP_KERNEL); @@ -136,9 +137,16 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,  		return -ENOMEM;  	rc = smb2_open_op_close(xid, tcon, cifs_sb, full_path, -				FILE_READ_ATTRIBUTES, FILE_OPEN, -				OPEN_REPARSE_POINT, smb2_data, -				SMB2_OP_QUERY_INFO); +				FILE_READ_ATTRIBUTES, FILE_OPEN, 0, +				smb2_data, SMB2_OP_QUERY_INFO); +	if (rc == -EOPNOTSUPP) { +		*symlink = true; +		/* Failed on a symbolic link - query a reparse point info */ +		rc = smb2_open_op_close(xid, tcon, cifs_sb, full_path, +					FILE_READ_ATTRIBUTES, FILE_OPEN, +					OPEN_REPARSE_POINT, smb2_data, +					SMB2_OP_QUERY_INFO); +	}  	if (rc)  		goto out;  | 
