diff options
Diffstat (limited to 'drivers/tty/vt/vt.c')
-rw-r--r-- | drivers/tty/vt/vt.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 5e0f6ff2e2f5..b33b00b386de 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
@@ -3226,8 +3226,7 @@ int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt | |||
3226 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { | 3226 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { |
3227 | con_back = ®istered_con_driver[i]; | 3227 | con_back = ®istered_con_driver[i]; |
3228 | 3228 | ||
3229 | if (con_back->con && | 3229 | if (con_back->con && con_back->con != csw) { |
3230 | !(con_back->flag & CON_DRIVER_FLAG_MODULE)) { | ||
3231 | defcsw = con_back->con; | 3230 | defcsw = con_back->con; |
3232 | retval = 0; | 3231 | retval = 0; |
3233 | break; | 3232 | break; |
@@ -3332,6 +3331,7 @@ static int vt_unbind(struct con_driver *con) | |||
3332 | { | 3331 | { |
3333 | const struct consw *csw = NULL; | 3332 | const struct consw *csw = NULL; |
3334 | int i, more = 1, first = -1, last = -1, deflt = 0; | 3333 | int i, more = 1, first = -1, last = -1, deflt = 0; |
3334 | int ret; | ||
3335 | 3335 | ||
3336 | if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) || | 3336 | if (!con->con || !(con->flag & CON_DRIVER_FLAG_MODULE) || |
3337 | con_is_graphics(con->con, con->first, con->last)) | 3337 | con_is_graphics(con->con, con->first, con->last)) |
@@ -3357,8 +3357,10 @@ static int vt_unbind(struct con_driver *con) | |||
3357 | 3357 | ||
3358 | if (first != -1) { | 3358 | if (first != -1) { |
3359 | console_lock(); | 3359 | console_lock(); |
3360 | do_unbind_con_driver(csw, first, last, deflt); | 3360 | ret = do_unbind_con_driver(csw, first, last, deflt); |
3361 | console_unlock(); | 3361 | console_unlock(); |
3362 | if (ret != 0) | ||
3363 | return ret; | ||
3362 | } | 3364 | } |
3363 | 3365 | ||
3364 | first = -1; | 3366 | first = -1; |
@@ -3645,17 +3647,20 @@ err: | |||
3645 | */ | 3647 | */ |
3646 | int do_unregister_con_driver(const struct consw *csw) | 3648 | int do_unregister_con_driver(const struct consw *csw) |
3647 | { | 3649 | { |
3648 | int i, retval = -ENODEV; | 3650 | int i; |
3649 | 3651 | ||
3650 | /* cannot unregister a bound driver */ | 3652 | /* cannot unregister a bound driver */ |
3651 | if (con_is_bound(csw)) | 3653 | if (con_is_bound(csw)) |
3652 | goto err; | 3654 | return -EBUSY; |
3655 | |||
3656 | if (csw == conswitchp) | ||
3657 | return -EINVAL; | ||
3653 | 3658 | ||
3654 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { | 3659 | for (i = 0; i < MAX_NR_CON_DRIVER; i++) { |
3655 | struct con_driver *con_driver = ®istered_con_driver[i]; | 3660 | struct con_driver *con_driver = ®istered_con_driver[i]; |
3656 | 3661 | ||
3657 | if (con_driver->con == csw && | 3662 | if (con_driver->con == csw && |
3658 | con_driver->flag & CON_DRIVER_FLAG_MODULE) { | 3663 | con_driver->flag & CON_DRIVER_FLAG_INIT) { |
3659 | vtconsole_deinit_device(con_driver); | 3664 | vtconsole_deinit_device(con_driver); |
3660 | device_destroy(vtconsole_class, | 3665 | device_destroy(vtconsole_class, |
3661 | MKDEV(0, con_driver->node)); | 3666 | MKDEV(0, con_driver->node)); |
@@ -3666,12 +3671,11 @@ int do_unregister_con_driver(const struct consw *csw) | |||
3666 | con_driver->flag = 0; | 3671 | con_driver->flag = 0; |
3667 | con_driver->first = 0; | 3672 | con_driver->first = 0; |
3668 | con_driver->last = 0; | 3673 | con_driver->last = 0; |
3669 | retval = 0; | 3674 | return 0; |
3670 | break; | ||
3671 | } | 3675 | } |
3672 | } | 3676 | } |
3673 | err: | 3677 | |
3674 | return retval; | 3678 | return -ENODEV; |
3675 | } | 3679 | } |
3676 | EXPORT_SYMBOL_GPL(do_unregister_con_driver); | 3680 | EXPORT_SYMBOL_GPL(do_unregister_con_driver); |
3677 | 3681 | ||