Skip to contentSkip to conversation

char/misc.c: misc_register: Do not loop on misc_list unconditionally

PATCH In review Dae S. Kim 2 participants 2 messages Dec 17, 2012 – Dec 19, 2012 Char and misc drivers

lore
Share & tools
lore

Dae S. Kim

author
#0 lore raw

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.

---
 drivers/char/misc.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/char/misc.c +7 -6
index 522136d..7b262b6 100644
@@ -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
#1 lore raw
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->minor in misc_list, since misc->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 -0
 		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;
+			}
+		}
 	}
 

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]>

---

 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
diff -puN drivers/char/misc.c~drivers-char-miscc-misc_register-do-not-loop-on-misc_list-unconditionally-fix drivers/char/misc.c
@@ -183,7 +183,6 @@ static const struct file_operations misc
  
 int 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);

_