mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 07:51:31 -04:00
driver core: simplify __device_set_driver_override() clearing logic
Currently, __device_set_driver_override() handles clearing the override
via empty string ("") and newline ("\n") in two separate paths. The "\n"
case also performs an unnecessary memory allocation and immediate free.
Simplify the logic by initializing 'new' to NULL and only allocating
memory if the string length remains non-zero after stripping the
trailing newline.
Reduce code size, improve readability, and avoid unnecessary memory
operations.
No functional change intended.
Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org>
Link: https://lore.kernel.org/driver-core/DGS82WWLXPJ0.2EH4VJSF30UR5@kernel.org/
Signed-off-by: Gui-Dong Han <hanguidong02@gmail.com>
Link: https://patch.msgid.link/20260325090905.169000-1-hanguidong02@gmail.com
[ Narrow cp's scope to the newline handling block; use scoped_guard().
- Danilo ]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
committed by
Danilo Krummrich
parent
a1fa010b3c
commit
3210dabba4
@@ -383,8 +383,7 @@ __exitcall(deferred_probe_exit);
|
||||
|
||||
int __device_set_driver_override(struct device *dev, const char *s, size_t len)
|
||||
{
|
||||
const char *new, *old;
|
||||
char *cp;
|
||||
const char *new = NULL, *old;
|
||||
|
||||
if (!s)
|
||||
return -EINVAL;
|
||||
@@ -404,37 +403,30 @@ int __device_set_driver_override(struct device *dev, const char *s, size_t len)
|
||||
*/
|
||||
len = strlen(s);
|
||||
|
||||
if (!len) {
|
||||
/* Empty string passed - clear override */
|
||||
spin_lock(&dev->driver_override.lock);
|
||||
/* Handle trailing newline */
|
||||
if (len) {
|
||||
char *cp;
|
||||
|
||||
cp = strnchr(s, len, '\n');
|
||||
if (cp)
|
||||
len = cp - s;
|
||||
}
|
||||
|
||||
/*
|
||||
* If empty string or "\n" passed, new remains NULL, clearing
|
||||
* the driver_override.name.
|
||||
*/
|
||||
if (len) {
|
||||
new = kstrndup(s, len, GFP_KERNEL);
|
||||
if (!new)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
scoped_guard(spinlock, &dev->driver_override.lock) {
|
||||
old = dev->driver_override.name;
|
||||
dev->driver_override.name = NULL;
|
||||
spin_unlock(&dev->driver_override.lock);
|
||||
kfree(old);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = strnchr(s, len, '\n');
|
||||
if (cp)
|
||||
len = cp - s;
|
||||
|
||||
new = kstrndup(s, len, GFP_KERNEL);
|
||||
if (!new)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock(&dev->driver_override.lock);
|
||||
old = dev->driver_override.name;
|
||||
if (cp != s) {
|
||||
dev->driver_override.name = new;
|
||||
spin_unlock(&dev->driver_override.lock);
|
||||
} else {
|
||||
/* "\n" passed - clear override */
|
||||
dev->driver_override.name = NULL;
|
||||
spin_unlock(&dev->driver_override.lock);
|
||||
|
||||
kfree(new);
|
||||
}
|
||||
|
||||
kfree(old);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user