The patch titled Detaching fbcon: fix give_up_console() has been added to the -mm tree. Its filename is detaching-fbcon-fix-give_up_console.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: Detaching fbcon: fix give_up_console() From: "Antonino A. Daplas" <adaplas@xxxxxxxxx> To allow for detaching fbcon, it must be able to give up the console. However, the function give_up_console() is plain broken. It just sets the entries in the console driver map to NULL, it leaves the vt layer without a console driver, and does not decrement the module reference count. Calling give_up_console() is guaranteed to hang the machine.. To fix this problem, ensure that the virtual consoles are not left dangling without a driver. All systems have a default boot driver (either vgacon or dummycon) which is never unloaded. For those vt's that lost their driver, the default boot driver is reassigned back to them. Signed-off-by: Antonino Daplas <adaplas@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/char/vt.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff -puN drivers/char/vt.c~detaching-fbcon-fix-give_up_console drivers/char/vt.c --- devel/drivers/char/vt.c~detaching-fbcon-fix-give_up_console 2006-06-06 15:12:50.000000000 -0700 +++ devel-akpm/drivers/char/vt.c 2006-06-06 15:12:50.000000000 -0700 @@ -100,6 +100,7 @@ const struct consw *conswitchp; +static struct consw *defcsw; /* default console */ /* A bitmap for codes <32. A bit of 1 indicates that the code * corresponding to that bit number invokes some special action @@ -2673,17 +2674,23 @@ int take_over_console(const struct consw if (!try_module_get(owner)) return -ENODEV; - acquire_console_sem(); + /* save default console, for possible recovery later on */ + if (!defcsw) + defcsw = (struct consw *) conswitchp; + acquire_console_sem(); desc = csw->con_startup(); + if (!desc) { release_console_sem(); module_put(owner); return -ENODEV; } + if (deflt) { if (conswitchp) module_put(conswitchp->owner); + __module_get(owner); conswitchp = csw; } @@ -2701,6 +2708,7 @@ int take_over_console(const struct consw continue; j = i; + if (CON_IS_VISIBLE(vc)) { k = i; save_screen(vc); @@ -2709,10 +2717,8 @@ int take_over_console(const struct consw old_was_color = vc->vc_can_do_color; vc->vc_sw->con_deinit(vc); vc->vc_origin = (unsigned long)vc->vc_screenbuf; - vc->vc_visible_origin = vc->vc_origin; - vc->vc_scr_end = vc->vc_origin + vc->vc_screenbuf_size; - vc->vc_pos = vc->vc_origin + vc->vc_size_row * vc->vc_y + 2 * vc->vc_x; visual_init(vc, i, 0); + set_origin(vc); update_attr(vc); /* If the console changed between mono <-> color, then @@ -2741,22 +2747,29 @@ int take_over_console(const struct consw printk("to %s\n", desc); release_console_sem(); - module_put(owner); return 0; } void give_up_console(const struct consw *csw) { - int i; + int i, first = -1, last = -1, deflt = 0; - for(i = 0; i < MAX_NR_CONSOLES; i++) + for (i = 0; i < MAX_NR_CONSOLES; i++) if (con_driver_map[i] == csw) { + if (first == -1) + first = i; + last = i; module_put(csw->owner); con_driver_map[i] = NULL; } -} + if (first != -1 && defcsw) { + if (first == 0 && last == MAX_NR_CONSOLES - 1) + deflt = 1; + take_over_console(defcsw, first, last, deflt); + } +} #endif /* _ Patches currently in -mm which might be from adaplas@xxxxxxxxx are git-intelfb.patch savagefb-allocate-space-for-current-and-saved-register.patch savagefb-add-state-save-and_restore-hooks.patch savagefb-add-state-save-and_restore-hooks-fix.patch fbdev-more-accurate-sync-range-extrapolation.patch nvidiafb-revise-pci_device_id-table.patch atyfb-fix-hardware-cursor-handling.patch atyfb-remove-unneeded-calls-to-wait_for_idle.patch atyfb-set-correct-acceleration-flags.patch epson1355fb-update-platform-code.patch vesafb-update-platform-code.patch vfb-update-platform-code.patch vga16fb-update-platform-code.patch fbdev-static-pseudocolor-with-depth-less-than-4-does.patch savagefb-whitespace-cleanup.patch fbdev-firmware-edid-fixes.patch nvidiafb-add-support-for-geforce-6100-and-related-chipsets.patch vesafb-fix-return-code-of-vesafb_setcolreg.patch vesafb-prefer-vga-registers-over-pmi.patch atyfb-fix-dead-code.patch fbdev-coverity-bug-85.patch fbdev-coverity-bug-90.patch backlight-fix-kconfig-dependency.patch detaching-fbcon-fix-vgacon-to-allow-retaking-of-the.patch detaching-fbcon-fix-give_up_console.patch detaching-fbcon-remove-calls-to-pci_disable_device.patch detaching-fbcon-add-sysfs-class-device-entry-for-fbcon.patch detaching-fbcon-clean-up-exit-code.patch detaching-fbcon-add-capability-to-attach-detach-fbcon.patch detaching-fbcon-update-documentation.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html