1

9p: fix slab cache name creation for real

This was attempted by using the dev_name in the slab cache name, but as
Omar Sandoval pointed out, that can be an arbitrary string, eg something
like "/dev/root".  Which in turn trips verify_dirent_name(), which fails
if a filename contains a slash.

So just make it use a sequence counter, and make it an atomic_t to avoid
any possible races or locking issues.

Reported-and-tested-by: Omar Sandoval <osandov@fb.com>
Link: https://lore.kernel.org/all/ZxafcO8KWMlXaeWE@telecaster.dhcp.thefacebook.com/
Fixes: 79efebae4a ("9p: Avoid creating multiple slab caches with the same name")
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Dominique Martinet <asmadeus@codewreck.org>
Cc: Thorsten Leemhuis <regressions@leemhuis.info>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2024-10-21 11:57:38 -07:00
parent d129377639
commit a360f311f5

View File

@ -977,6 +977,7 @@ error:
struct p9_client *p9_client_create(const char *dev_name, char *options) struct p9_client *p9_client_create(const char *dev_name, char *options)
{ {
int err; int err;
static atomic_t seqno = ATOMIC_INIT(0);
struct p9_client *clnt; struct p9_client *clnt;
char *client_id; char *client_id;
char *cache_name; char *cache_name;
@ -1036,7 +1037,8 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
if (err) if (err)
goto close_trans; goto close_trans;
cache_name = kasprintf(GFP_KERNEL, "9p-fcall-cache-%s", dev_name); cache_name = kasprintf(GFP_KERNEL,
"9p-fcall-cache-%u", atomic_inc_return(&seqno));
if (!cache_name) { if (!cache_name) {
err = -ENOMEM; err = -ENOMEM;
goto close_trans; goto close_trans;