From: "Pali Rohár" <pali@kernel.org>
To: linux-fsdevel@vger.kernel.org,
linux-ntfs-dev@lists.sourceforge.net, linux-cifs@vger.kernel.org,
jfs-discussion@lists.sourceforge.net,
linux-kernel@vger.kernel.org,
"Alexander Viro" <viro@zeniv.linux.org.uk>,
"Jan Kara" <jack@suse.cz>,
"OGAWA Hirofumi" <hirofumi@mail.parknet.co.jp>,
"Theodore Y . Ts'o" <tytso@mit.edu>,
"Luis de Bethencourt" <luisbg@kernel.org>,
"Salah Triki" <salah.triki@gmail.com>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Dave Kleikamp" <shaggy@kernel.org>,
"Anton Altaparmakov" <anton@tuxera.com>,
"Pavel Machek" <pavel@ucw.cz>, "Marek Behún" <marek.behun@nic.cz>,
"Christoph Hellwig" <hch@infradead.org>
Subject: [RFC PATCH 19/20] cifs: Remove usage of load_nls_default() calls
Date: Sun, 8 Aug 2021 18:24:52 +0200 [thread overview]
Message-ID: <20210808162453.1653-20-pali@kernel.org> (raw)
In-Reply-To: <20210808162453.1653-1-pali@kernel.org>
cifs functions will use UTF-8 encoding when nls_table is set to NULL. So
there is no need to load "dummy" NLS table for some operations.
On few places in dfs_cache replace utf8 nls by utf8_to_utf32() function
which converts UTF-8 sequence to unicode code points (stored as type
unicode_t). This should fix handling of (UTF-16) CIFS paths with UTF-16
surrogare pairs, which utf8 nls module cannot handle.
Signed-off-by: Pali Rohár <pali@kernel.org>
---
fs/cifs/cifssmb.c | 8 ++------
fs/cifs/dfs_cache.c | 24 ++++++++----------------
fs/cifs/smb2pdu.c | 17 ++++-------------
3 files changed, 14 insertions(+), 35 deletions(-)
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 65d1a65bfc37..8a2eb380c97d 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -119,7 +119,6 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command)
int rc;
struct cifs_ses *ses;
struct TCP_Server_Info *server;
- struct nls_table *nls_codepage;
int retries;
/*
@@ -186,8 +185,6 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command)
if (!ses->need_reconnect && !tcon->need_reconnect)
return 0;
- nls_codepage = load_nls_default();
-
/*
* need to prevent multiple threads trying to simultaneously
* reconnect the same SMB session
@@ -207,7 +204,7 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command)
rc = cifs_negotiate_protocol(0, ses);
if (rc == 0 && ses->need_reconnect)
- rc = cifs_setup_session(0, ses, nls_codepage);
+ rc = cifs_setup_session(0, ses, NULL);
/* do we need to reconnect tcon? */
if (rc || !tcon->need_reconnect) {
@@ -216,7 +213,7 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command)
}
cifs_mark_open_files_invalid(tcon);
- rc = cifs_tree_connect(0, tcon, nls_codepage);
+ rc = cifs_tree_connect(0, tcon, NULL);
mutex_unlock(&ses->session_mutex);
cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc);
@@ -252,7 +249,6 @@ cifs_reconnect_tcon(struct cifs_tcon *tcon, int smb_command)
rc = -EAGAIN;
}
- unload_nls(nls_codepage);
return rc;
}
diff --git a/fs/cifs/dfs_cache.c b/fs/cifs/dfs_cache.c
index 283745592844..3ba748e59e64 100644
--- a/fs/cifs/dfs_cache.c
+++ b/fs/cifs/dfs_cache.c
@@ -66,8 +66,6 @@ static struct workqueue_struct *dfscache_wq __read_mostly;
static int cache_ttl;
static DEFINE_SPINLOCK(cache_ttl_lock);
-static struct nls_table *cache_cp;
-
/*
* Number of entries in the cache
*/
@@ -194,14 +192,14 @@ char *dfs_cache_canonical_path(const char *path, const struct nls_table *cp, int
if (!path || strlen(path) < 3 || (*path != '\\' && *path != '/'))
return ERR_PTR(-EINVAL);
- if (unlikely(strcmp(cp->charset, cache_cp->charset))) {
+ if (unlikely(cp)) {
tmp = (char *)cifs_strndup_to_utf16(path, strlen(path), &plen, cp, remap);
if (!tmp) {
cifs_dbg(VFS, "%s: failed to convert path to utf16\n", __func__);
return ERR_PTR(-EINVAL);
}
- npath = cifs_strndup_from_utf16(tmp, plen, true, cache_cp);
+ npath = cifs_strndup_from_utf16(tmp, plen, true, NULL);
kfree(tmp);
if (!npath) {
@@ -413,9 +411,6 @@ int dfs_cache_init(void)
INIT_HLIST_HEAD(&cache_htable[i]);
atomic_set(&cache_count, 0);
- cache_cp = load_nls("utf8");
- if (!cache_cp)
- cache_cp = load_nls_default();
cifs_dbg(FYI, "%s: initialized DFS referral cache\n", __func__);
return 0;
@@ -429,11 +424,11 @@ static int cache_entry_hash(const void *data, int size, unsigned int *hash)
{
int i, clen;
const unsigned char *s = data;
- wchar_t c;
+ unicode_t c;
unsigned int h = 0;
for (i = 0; i < size; i += clen) {
- clen = cache_cp->char2uni(&s[i], size - i, &c);
+ clen = utf8_to_utf32(&s[i], size - i, &c);
if (unlikely(clen < 0)) {
cifs_dbg(VFS, "%s: can't convert char\n", __func__);
return clen;
@@ -622,14 +617,14 @@ static int add_cache_entry_locked(struct dfs_info3_param *refs, int numrefs)
static bool dfs_path_equal(const char *s1, int len1, const char *s2, int len2)
{
int i, l1, l2;
- wchar_t c1, c2;
+ unicode_t c1, c2;
if (len1 != len2)
return false;
for (i = 0; i < len1; i += l1) {
- l1 = cache_cp->char2uni(&s1[i], len1 - i, &c1);
- l2 = cache_cp->char2uni(&s2[i], len2 - i, &c2);
+ l1 = utf8_to_utf32(&s1[i], len1 - i, &c1);
+ l2 = utf8_to_utf32(&s2[i], len2 - i, &c2);
if (unlikely(l1 < 0 && l2 < 0)) {
if (s1[i] != s2[i])
return false;
@@ -719,7 +714,6 @@ static struct cache_entry *lookup_cache_entry(const char *path)
void dfs_cache_destroy(void)
{
cancel_delayed_work_sync(&refresh_task);
- unload_nls(cache_cp);
free_mount_group_list();
flush_cache_ents();
kmem_cache_destroy(cache_slab);
@@ -767,10 +761,8 @@ static int get_dfs_referral(const unsigned int xid, struct cifs_ses *ses, const
if (!ses || !ses->server || !ses->server->ops->get_dfs_refer)
return -EOPNOTSUPP;
- if (unlikely(!cache_cp))
- return -EINVAL;
- rc = ses->server->ops->get_dfs_refer(xid, ses, path, refs, numrefs, cache_cp,
+ rc = ses->server->ops->get_dfs_refer(xid, ses, path, refs, numrefs, NULL,
NO_MAP_UNI_RSVD);
if (!rc) {
struct dfs_info3_param *ref = *refs;
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 781d14e5f2af..b44f91dd2782 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -145,7 +145,6 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
struct TCP_Server_Info *server)
{
int rc;
- struct nls_table *nls_codepage;
struct cifs_ses *ses;
int retries;
@@ -233,8 +232,6 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
if (!tcon->ses->need_reconnect && !tcon->need_reconnect)
return 0;
- nls_codepage = load_nls_default();
-
/*
* need to prevent multiple threads trying to simultaneously reconnect
* the same SMB session
@@ -262,7 +259,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
rc = cifs_negotiate_protocol(0, tcon->ses);
if (!rc && tcon->ses->need_reconnect) {
- rc = cifs_setup_session(0, tcon->ses, nls_codepage);
+ rc = cifs_setup_session(0, tcon->ses, NULL);
if ((rc == -EACCES) && !tcon->retry) {
rc = -EHOSTDOWN;
ses->binding = false;
@@ -286,7 +283,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
if (tcon->use_persistent)
tcon->need_reopen_files = true;
- rc = cifs_tree_connect(0, tcon, nls_codepage);
+ rc = cifs_tree_connect(0, tcon, NULL);
mutex_unlock(&tcon->ses->session_mutex);
cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc);
@@ -322,7 +319,6 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
rc = -EAGAIN;
}
failed:
- unload_nls(nls_codepage);
return rc;
}
@@ -481,12 +477,10 @@ build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt)
static unsigned int
build_netname_ctxt(struct smb2_netname_neg_context *pneg_ctxt, char *hostname)
{
- struct nls_table *cp = load_nls_default();
-
pneg_ctxt->ContextType = SMB2_NETNAME_NEGOTIATE_CONTEXT_ID;
/* copy up to max of first 100 bytes of server name to NetName field */
- pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, cp));
+ pneg_ctxt->DataLength = cpu_to_le16(2 * cifs_strtoUTF16(pneg_ctxt->NetName, hostname, 100, NULL));
/* context size is DataLength + minimal smb2_neg_context */
return DIV_ROUND_UP(le16_to_cpu(pneg_ctxt->DataLength) +
sizeof(struct smb2_neg_context), 8) * 8;
@@ -2498,7 +2492,6 @@ alloc_path_with_tree_prefix(__le16 **out_path, int *out_size, int *out_len,
const char *treename, const __le16 *path)
{
int treename_len, path_len;
- struct nls_table *cp;
const __le16 sep[] = {cpu_to_le16('\\'), cpu_to_le16(0x0000)};
/*
@@ -2529,11 +2522,9 @@ alloc_path_with_tree_prefix(__le16 **out_path, int *out_size, int *out_len,
if (!*out_path)
return -ENOMEM;
- cp = load_nls_default();
- cifs_strtoUTF16(*out_path, treename, treename_len, cp);
+ cifs_strtoUTF16(*out_path, treename, treename_len, NULL);
UniStrcat(*out_path, sep);
UniStrcat(*out_path, path);
- unload_nls(cp);
return 0;
}
--
2.20.1
next prev parent reply other threads:[~2021-08-08 16:25 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-08 16:24 [RFC PATCH 00/20] fs: Remove usage of broken nls_utf8 and drop it Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 01/20] fat: Fix iocharset=utf8 mount option Pali Rohár
2021-08-15 3:42 ` OGAWA Hirofumi
2021-08-15 9:42 ` Pali Rohár
2021-08-15 11:23 ` OGAWA Hirofumi
2021-08-23 3:51 ` Kari Argillander
2021-08-08 16:24 ` [RFC PATCH 02/20] hfsplus: Add iocharset= mount option as alias for nls= Pali Rohár
2021-08-09 17:51 ` Viacheslav Dubeyko
2021-08-09 20:49 ` Kari Argillander
2021-08-09 21:25 ` Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 03/20] udf: Fix iocharset=utf8 mount option Pali Rohár
2021-08-12 14:17 ` Jan Kara
2021-08-12 15:51 ` Pali Rohár
2021-08-13 13:48 ` Jan Kara
2021-08-19 8:34 ` Pali Rohár
2021-08-19 10:41 ` Jan Kara
2021-08-08 16:24 ` [RFC PATCH 04/20] isofs: joliet: " Pali Rohár
2021-08-12 14:18 ` Jan Kara
2021-08-08 16:24 ` [RFC PATCH 05/20] ntfs: Undeprecate iocharset= " Pali Rohár
2021-08-09 20:52 ` Kari Argillander
2021-08-19 1:21 ` Kari Argillander
2021-08-19 8:12 ` Pali Rohár
2021-08-19 10:23 ` Kari Argillander
2021-08-19 22:04 ` Pali Rohár
2021-08-19 23:18 ` Kari Argillander
2021-08-08 16:24 ` [RFC PATCH 06/20] ntfs: Fix error processing when load_nls() fails Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 07/20] befs: Fix printing iocharset= mount option Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 08/20] befs: Rename enum value Opt_charset to Opt_iocharset to match " Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 09/20] befs: Fix error processing when load_nls() fails Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 10/20] befs: Allow to use native UTF-8 mode Pali Rohár
2021-08-08 19:20 ` kernel test robot
2021-08-08 16:24 ` [RFC PATCH 11/20] hfs: Explicitly set hsb->nls_disk when hsb->nls_io is set Pali Rohár
2021-08-09 17:31 ` Viacheslav Dubeyko
2021-08-09 17:37 ` Matthew Wilcox
2021-08-09 17:47 ` Pali Rohár
2021-08-09 20:43 ` Steve French
2021-08-09 18:00 ` Viacheslav Dubeyko
2021-08-08 16:24 ` [RFC PATCH 12/20] hfs: Do not use broken utf8 NLS table for iocharset=utf8 mount option Pali Rohár
2021-08-09 17:49 ` Viacheslav Dubeyko
2022-09-25 12:06 ` Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 13/20] hfsplus: " Pali Rohár
2021-08-09 17:42 ` Viacheslav Dubeyko
2022-09-25 12:12 ` Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 14/20] jfs: Remove custom iso8859-1 implementation Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 15/20] jfs: Fix buffer overflow in jfs_strfromUCS_le() function Pali Rohár
2021-08-08 16:24 ` [RFC PATCH 16/20] jfs: Do not use broken utf8 NLS table for iocharset=utf8 mount option Pali Rohár
2021-08-09 22:51 ` kernel test robot
2021-08-08 16:24 ` [RFC PATCH 17/20] ntfs: " Pali Rohár
2021-08-08 17:53 ` kernel test robot
2021-08-10 0:34 ` kernel test robot
2021-08-08 16:24 ` [RFC PATCH 18/20] cifs: " Pali Rohár
2021-08-08 16:24 ` Pali Rohár [this message]
2021-08-08 16:24 ` [RFC PATCH 20/20] nls: Drop broken nls_utf8 module Pali Rohár
2021-09-03 21:26 ` [RFC PATCH 00/20] fs: Remove usage of broken nls_utf8 and drop it Kari Argillander
2021-09-03 21:37 ` Pali Rohár
2021-09-03 22:06 ` Kari Argillander
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210808162453.1653-20-pali@kernel.org \
--to=pali@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=anton@tuxera.com \
--cc=hch@infradead.org \
--cc=hirofumi@mail.parknet.co.jp \
--cc=jack@suse.cz \
--cc=jfs-discussion@lists.sourceforge.net \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-ntfs-dev@lists.sourceforge.net \
--cc=luisbg@kernel.org \
--cc=marek.behun@nic.cz \
--cc=pavel@ucw.cz \
--cc=salah.triki@gmail.com \
--cc=shaggy@kernel.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.