History

modpost: i2c aliases need no trailing wildcard

Not all device types need a wildcard at the end of their module aliases. In particular, for i2c module aliases, the trailing wildcard is not only unneeded, it could also cause the wrong driver to be loaded. As I2C devices have no IDs, i2c module aliases are simple, arbitrary device names. For example: $ /sbin/modinfo lm90 filename: /lib/modules/2.6.25-git18/kernel/drivers/hwmon/lm90.ko author: Jean Delvare <khali@linux-fr.org> description: LM90/ADM1032 driver license: GPL vermagic: 2.6.25-git18 mod_unload depends: hwmon alias: i2c:lm90* alias: i2c:adm1032* alias: i2c:lm99* alias: i2c:lm86* alias: i2c:max6657* alias: i2c:adt7461* alias: i2c:max6680* $ This would cause trouble if one I2C chip name matches the beginning of another I2C chip name and both chips are supported by different drivers. For example, an i2c device named lm9042 would cause the lm90 driver to be loaded, while it doesn't support that device. This case has yet to be seen in practice, but still, I'd like to fix it now. The cleanest fix is to remove the trailing wildcard from i2c module aliases. Here's a patch doing this. Not all device type aliases need a trailing wildcard, in particular the i2c aliases don't. Don't add a wildcard by default in do_table(), instead let each device type handler add it if needed. I have tested types acpi, dmi, eisa, i2c, ide, ieee1394, input, pci, pcmcia, platform, pnp, scsi, serio, ssb and usb. Other types (ccw, of, vio, parisc, sdio and virtio) are untested. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Jochen Friedrich <jochen@scram.de> Signed-off-by: Sam Ravnborg <sam@ravnborg.org>

Jean Delvare committed 18 years ago

Commit ac551821 parent afa26be1 file · +26 −9Browse files

Showing the changes to scripts (1 of 1 file). Show all

Unified · Split

scripts/mod/file2alias.c+26−9
@@ -51,6 +51,15 @@ do { \ · 50 unmodified lines
5151 sprintf(str + strlen(str), "*"); \
5252 } while(0)
5353
54+/* Always end in a wildcard, for future extension */
55+static inline void add_wildcard(char *str)
56+{
57+ int len = strlen(str);
58+
59+ if (str[len - 1] != '*')
60+ strcat(str + len, "*");
61+}
62+
5463 unsigned int cross_build = 0;
5564 /**
5665 * Check that sizeof(device_id type) are consistent with size of section
@@ -133,9 +142,7 @@ static void do_usb_entry(struct usb_device_id *id, · 76 unmodified lines
133142 id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
134143 id->bInterfaceProtocol);
135144
136− /* Always end in a wildcard, for future extension */
137− if (alias[strlen(alias)-1] != '*')
138− strcat(alias, "*");
145+ add_wildcard(alias);
139146 buf_printf(&mod->dev_table_buf,
140147 "MODULE_ALIAS(\"%s\");\n", alias);
141148 }
@@ -219,6 +226,7 @@ static int do_ieee1394_entry(const char *filename, · 77 unmodified lines
219226 ADD(alias, "ver", id->match_flags & IEEE1394_MATCH_VERSION,
220227 id->version);
221228
229+ add_wildcard(alias);
222230 return 1;
223231 }
224232
@@ -261,6 +269,7 @@ static int do_pci_entry(const char *filename, · 36 unmodified lines
261269 ADD(alias, "bc", baseclass_mask == 0xFF, baseclass);
262270 ADD(alias, "sc", subclass_mask == 0xFF, subclass);
263271 ADD(alias, "i", interface_mask == 0xFF, interface);
272+ add_wildcard(alias);
264273 return 1;
265274 }
266275
@@ -283,6 +292,7 @@ static int do_ccw_entry(const char *filename, · 16 unmodified lines
283292 id->dev_type);
284293 ADD(alias, "dm", id->match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL,
285294 id->dev_model);
295+ add_wildcard(alias);
286296 return 1;
287297 }
288298
@@ -290,7 +300,7 @@ static int do_ccw_entry(const char *filename, · 1 unmodified line
290300 static int do_ap_entry(const char *filename,
291301 struct ap_device_id *id, char *alias)
292302 {
293− sprintf(alias, "ap:t%02X", id->dev_type);
303+ sprintf(alias, "ap:t%02X*", id->dev_type);
294304 return 1;
295305 }
296306
@@ -309,6 +319,7 @@ static int do_serio_entry(const char *filename, · 12 unmodified lines
309319 ADD(alias, "id", id->id != SERIO_ANY, id->id);
310320 ADD(alias, "ex", id->extra != SERIO_ANY, id->extra);
311321
322+ add_wildcard(alias);
312323 return 1;
313324 }
314325
@@ -316,7 +327,7 @@ static int do_serio_entry(const char *filename, · 1 unmodified line
316327 static int do_acpi_entry(const char *filename,
317328 struct acpi_device_id *id, char *alias)
318329 {
319− sprintf(alias, "acpi*:%s:", id->id);
330+ sprintf(alias, "acpi*:%s:*", id->id);
320331 return 1;
321332 }
322333
@@ -324,7 +335,7 @@ static int do_acpi_entry(const char *filename, · 1 unmodified line
324335 static int do_pnp_entry(const char *filename,
325336 struct pnp_device_id *id, char *alias)
326337 {
327− sprintf(alias, "pnp:d%s", id->id);
338+ sprintf(alias, "pnp:d%s*", id->id);
328339 return 1;
329340 }
330341
@@ -409,6 +420,7 @@ static int do_pcmcia_entry(const char *filename, · 78 unmodified lines
409420 ADD(alias, "pc", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, id->prod_id_hash[2]);
410421 ADD(alias, "pd", id->match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, id->prod_id_hash[3]);
411422
423+ add_wildcard(alias);
412424 return 1;
413425 }
414426
@@ -432,6 +444,7 @@ static int do_of_entry (const char *filename, struct of_device_id *of, char *ali · 17 unmodified lines
432444 if (isspace (*tmp))
433445 *tmp = '_';
434446
447+ add_wildcard(alias);
435448 return 1;
436449 }
437450
@@ -448,6 +461,7 @@ static int do_vio_entry(const char *filename, struct vio_device_id *vio, · 10 unmodified lines
448461 if (isspace (*tmp))
449462 *tmp = '_';
450463
464+ add_wildcard(alias);
451465 return 1;
452466 }
453467
@@ -511,6 +525,8 @@ static int do_eisa_entry(const char *filename, struct eisa_device_id *eisa, · 57 unmodified lines
511525 {
512526 if (eisa->sig[0])
513527 sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", eisa->sig);
528+ else
529+ strcat(alias, "*");
514530 return 1;
515531 }
516532
@@ -529,6 +545,7 @@ static int do_parisc_entry(const char *filename, struct parisc_device_id *id, · 12 unmodified lines
529545 ADD(alias, "rev", id->hversion_rev != PA_HVERSION_REV_ANY_ID, id->hversion_rev);
530546 ADD(alias, "sv", id->sversion != PA_SVERSION_ANY_ID, id->sversion);
531547
548+ add_wildcard(alias);
532549 return 1;
533550 }
534551
@@ -544,6 +561,7 @@ static int do_sdio_entry(const char *filename, · 9 unmodified lines
544561 ADD(alias, "c", id->class != (__u8)SDIO_ANY_ID, id->class);
545562 ADD(alias, "v", id->vendor != (__u16)SDIO_ANY_ID, id->vendor);
546563 ADD(alias, "d", id->device != (__u16)SDIO_ANY_ID, id->device);
564+ add_wildcard(alias);
547565 return 1;
548566 }
549567
@@ -559,6 +577,7 @@ static int do_ssb_entry(const char *filename, · 9 unmodified lines
559577 ADD(alias, "v", id->vendor != SSB_ANY_VENDOR, id->vendor);
560578 ADD(alias, "id", id->coreid != SSB_ANY_ID, id->coreid);
561579 ADD(alias, "rev", id->revision != SSB_ANY_REV, id->revision);
580+ add_wildcard(alias);
562581 return 1;
563582 }
564583
@@ -573,6 +592,7 @@ static int do_virtio_entry(const char *filename, struct virtio_device_id *id, · 8 unmodified lines
573592 ADD(alias, "d", 1, id->device);
574593 ADD(alias, "v", id->vendor != VIRTIO_DEV_ANY_ID, id->vendor);
575594
595+ add_wildcard(alias);
576596 return 1;
577597 }
578598
@@ -612,9 +632,6 @@ static void do_table(void *symval, unsigned long size, · 33 unmodified lines
612632
613633 for (i = 0; i < size; i += id_size) {
614634 if (do_entry(mod->name, symval+i, alias)) {
615− /* Always end in a wildcard, for future extension */
616− if (alias[strlen(alias)-1] != '*')
617− strcat(alias, "*");
618635 buf_printf(&mod->dev_table_buf,
619636 "MODULE_ALIAS(\"%s\");\n", alias);
620637 }