]> Pileus Git - ~andy/linux/blobdiff - fs/cifs/smb2inode.c
Merge tag 'sunxi-fixes-for-3.14' of https://github.com/mripard/linux into fixes
[~andy/linux] / fs / cifs / smb2inode.c
index 78ff88c467b99b9a17c706032a9ed655f92c58b0..84c012a6aba01fc9a7fcd82ab3548047da63d55b 100644 (file)
@@ -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;