Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ieee1394: fix host device registering when nodemgr disabled

Since my commit 8252bbb1363b7fe963a3eb6f8a36da619a6f5a65 in 2.6.20-rc1,
host devices have a dummy driver attached. Alas the driver was not
registered before use if ieee1394 was loaded with disable_nodemgr=1.

This resulted in non-functional FireWire drivers or kernel lockup.
http://bugzilla.kernel.org/show_bug.cgi?id=7942

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>

+16 -8
+16 -8
drivers/ieee1394/nodemgr.c
··· 258 258 struct device nodemgr_dev_template_host = { 259 259 .bus = &ieee1394_bus_type, 260 260 .release = nodemgr_release_host, 261 - .driver = &nodemgr_mid_layer_driver, 262 261 }; 263 262 264 263 ··· 1849 1850 1850 1851 error = class_register(&nodemgr_ne_class); 1851 1852 if (error) 1852 - return error; 1853 - 1853 + goto fail_ne; 1854 1854 error = class_register(&nodemgr_ud_class); 1855 - if (error) { 1856 - class_unregister(&nodemgr_ne_class); 1857 - return error; 1858 - } 1855 + if (error) 1856 + goto fail_ud; 1859 1857 error = driver_register(&nodemgr_mid_layer_driver); 1858 + if (error) 1859 + goto fail_ml; 1860 + /* This driver is not used if nodemgr is off (disable_nodemgr=1). */ 1861 + nodemgr_dev_template_host.driver = &nodemgr_mid_layer_driver; 1862 + 1860 1863 hpsb_register_highlevel(&nodemgr_highlevel); 1861 1864 return 0; 1865 + 1866 + fail_ml: 1867 + class_unregister(&nodemgr_ud_class); 1868 + fail_ud: 1869 + class_unregister(&nodemgr_ne_class); 1870 + fail_ne: 1871 + return error; 1862 1872 } 1863 1873 1864 1874 void cleanup_ieee1394_nodemgr(void) 1865 1875 { 1866 1876 hpsb_unregister_highlevel(&nodemgr_highlevel); 1867 - 1877 + driver_unregister(&nodemgr_mid_layer_driver); 1868 1878 class_unregister(&nodemgr_ud_class); 1869 1879 class_unregister(&nodemgr_ne_class); 1870 1880 }