Workaround Mac server problem
authorSteve French <smfrench@gmail.com>
Mon, 6 Oct 2014 06:01:03 +0000 (01:01 -0500)
committerSteve French <smfrench@gmail.com>
Thu, 16 Oct 2014 20:20:20 +0000 (15:20 -0500)
Mac server returns that they support CIFS Unix Extensions but
doesn't actually support QUERY_FILE_UNIX_BASIC so mount fails.

Workaround this problem by disabling use of Unix CIFS protocol
extensions if server returns an EOPNOTSUPP error on
QUERY_FILE_UNIX_BASIC during mount.

Signed-off-by: Steve French <smfrench@gmail.com>
fs/cifs/inode.c

index c23bdec805c557748d3f205704638bd889c2afa7..197cb503d5280b4a3f4425d531f444ef9b7f1baf 100644 (file)
@@ -960,11 +960,18 @@ struct inode *cifs_root_iget(struct super_block *sb)
        struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
 
        xid = get_xid();
-       if (tcon->unix_ext)
+       if (tcon->unix_ext) {
                rc = cifs_get_inode_info_unix(&inode, "", sb, xid);
-       else
-               rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
+               /* some servers mistakenly claim POSIX support */
+               if (rc != -EOPNOTSUPP)
+                       goto iget_no_retry;
+               cifs_dbg(VFS, "server does not support POSIX extensions");
+               tcon->unix_ext = false;
+       }
+
+       rc = cifs_get_inode_info(&inode, "", NULL, sb, xid, NULL);
 
+iget_no_retry:
        if (!inode) {
                inode = ERR_PTR(rc);
                goto out;