Commit 421ef3d5 authored by Enzo Matsumiya's avatar Enzo Matsumiya Committed by Steve French
Browse files

cifs: don't call cifs_dfs_query_info_nonascii_quirk() if nodfs was set



Also return EOPNOTSUPP if path is remote but nodfs was set.

Fixes: a2809d0e ("cifs: quirk for STATUS_OBJECT_NAME_INVALID returned for non-ASCII dfs refs")
Cc: stable@vger.kernel.org
Reviewed-by: default avatarPaulo Alcantara (SUSE) <pc@cjr.nz>
Signed-off-by: default avatarEnzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent d80c6984
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -3432,6 +3432,7 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
	struct cifs_tcon *tcon = mnt_ctx->tcon;
	struct smb3_fs_context *ctx = mnt_ctx->fs_ctx;
	char *full_path;
	bool nodfs = cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_DFS;

	if (!server->ops->is_path_accessible)
		return -EOPNOTSUPP;
@@ -3449,14 +3450,20 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
	rc = server->ops->is_path_accessible(xid, tcon, cifs_sb,
					     full_path);
#ifdef CONFIG_CIFS_DFS_UPCALL
	if (nodfs) {
		if (rc == -EREMOTE)
			rc = -EOPNOTSUPP;
		goto out;
	}

	/* path *might* exist with non-ASCII characters in DFS root
	 * try again with full path (only if nodfs is not set) */
	if (rc == -ENOENT && is_tcon_dfs(tcon))
		rc = cifs_dfs_query_info_nonascii_quirk(xid, tcon, cifs_sb,
							full_path);
#endif
	if (rc != 0 && rc != -EREMOTE) {
		kfree(full_path);
		return rc;
	}
	if (rc != 0 && rc != -EREMOTE)
		goto out;

	if (rc != -EREMOTE) {
		rc = cifs_are_all_path_components_accessible(server, xid, tcon,
@@ -3468,6 +3475,7 @@ static int is_path_remote(struct mount_ctx *mnt_ctx)
		}
	}

out:
	kfree(full_path);
	return rc;
}