vt: Don't ignore unbind errors in vt_unbind
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 5 Jun 2014 14:33:24 +0000 (16:33 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 6 Jun 2014 20:19:47 +0000 (22:19 +0200)
Otherwise the loop will never stop since we don't make any
forward progress. Noticed while breaking this accidentally
in a painful attempt to make vga_con unregistering work.

With this patch we'll bail out on the first attempt, which
at least leaves a useful enough system behind for debugging.
Livelocks on console_lock just aren't fun.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/tty/vt/vt.c

index 5077fe87324d50f64dbd6217eeb0743ff5d41136..3c00dcb3b145a3460ee5ba54fbc4eb05ce839cd0 100644 (file)
@@ -3260,6 +3260,7 @@ static int vt_unbind(struct con_driver *con)
 {
        const struct consw *csw = NULL;
        int i, more = 1, first = -1, last = -1, deflt = 0;
+       int ret;
 
        if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) ||
            con_is_graphics(con->con, con->first, con->last))
@@ -3285,8 +3286,10 @@ static int vt_unbind(struct con_driver *con)
 
                if (first != -1) {
                        console_lock();
-                       do_unbind_con_driver(csw, first, last, deflt);
+                       ret = do_unbind_con_driver(csw, first, last, deflt);
                        console_unlock();
+                       if (ret != 0)
+                               return ret;
                }
 
                first = -1;