char/misc.c: misc_register: Do not loop on misc_list unconditionally
PATCH 1/1 char/misc.c: misc_register: Do not loop on misc_list unconditionally
If the minor number is assigned dynamically, there is no need to search for misc->minor in misc_list, since misc->minor == MISC_DYNAMIC_MINOR.
Signed-off-by Dae S. Kim <[email protected]>
--- drivers/char/misc.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/char/misc.c +7 -6
@@ -190,12 +190,6 @@ int misc_register(struct miscdevice * misc)INIT_LIST_HEAD (&misc->list);mutex_lock (&misc_mtx); -list_for_each_entry (c, &misc_list, list) { -if (c->minor == misc->minor) { -mutex_unlock (&misc_mtx); -return -EBUSY ; - } - }if (misc->minor ==MISC_DYNAMIC_MINOR ) {int i =find_first_zero_bit (misc_minors,DYNAMIC_MINORS );
@@ -205,6 +199,13 @@ int misc_register(struct miscdevice * misc) } misc->minor =DYNAMIC_MINORS - i -1 ;set_bit (i, misc_minors); + }else { +list_for_each_entry (c, &misc_list, list) { +if (c->minor == misc->minor) { +mutex_unlock (&misc_mtx); +return -EBUSY ; + } + } } dev =MKDEV (MISC_MAJOR , misc->minor);
Signature · 1 line
1.7.9.5
Quoted 24 lines · On Mon, 17 Dec 2012 23:26:38 +0100 "Dae S. Kim" <[email protected]> wrote:
If the minor number is assigned dynamically, there is no need to search for
misc->minorinmisc_list, sincemisc->minor==MISC_DYNAMIC_MINOR....
drivers/char/misc.c +0
-6@@ -190,12 +190,6 @@ int misc_register(struct miscdevice * misc)INIT_LIST_HEAD (&misc->list);mutex_lock (&misc_mtx); -list_for_each_entry (c, &misc_list, list) { -if (c->minor == misc->minor) { -mutex_unlock (&misc_mtx); -return -EBUSY ; - } - }if (misc->minor ==MISC_DYNAMIC_MINOR ) {int i =find_first_zero_bit (misc_minors,DYNAMIC_MINORS );@@ -205,6 +199,13 @@ int misc_register(struct miscdevice * misc) } misc->minor =DYNAMIC_MINORS - i -1 ;
drivers/char/misc.c int misc_register(struct miscdevice * misc) · line 210
Quoted 10 lines
drivers/char/misc.c +7
-0set_bit (i, misc_minors); + }else { +list_for_each_entry (c, &misc_list, list) { +if (c->minor == misc->minor) { +mutex_unlock (&misc_mtx); +return -EBUSY ; + } + } }
Looks OK. It permits this:
From: Andrew Morton <[email protected]>
Subject: drivers-char-miscc-misc_register-do-not-loop-on-misc_list-unconditionally-fix
reduce scope of local `c'
Cc "Dae S. Kim" <[email protected]>
Cc Arnd Bergmann <[email protected]>
Cc Dae S. Kim <[email protected]>
Cc Greg KH <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
drivers/char/misc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/char/misc.c renamed from drivers/char/misc.c~drivers-char-miscc-misc_register-do-not-loop-on-misc_list-unconditionally-fix +2 -1
@@ -183,7 +183,6 @@ static const struct file_operations miscint misc_register (struct miscdevice * misc) { -struct miscdevice *c;dev_t dev;int err =0 ;
@@ -200,6 +199,8 @@ int misc_register(struct miscdevice * mi misc->minor =DYNAMIC_MINORS - i -1 ;set_bit (i, misc_minors); }else { +struct miscdevice *c; +list_for_each_entry (c, &misc_list, list) {if (c->minor == misc->minor) {mutex_unlock (&misc_mtx);
_