Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 358088
b: refs/heads/master
c: e93a9a8
h: refs/heads/master
v: v3
  • Loading branch information
Takashi Iwai authored and Dave Airlie committed Feb 8, 2013
1 parent 2d1bdec commit 3592459
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 50e244cc793d511b86adea24972f3a7264cae114
refs/heads/master: e93a9a868792ad71cdd09d75e5a02d8067473c4e
43 changes: 28 additions & 15 deletions trunk/drivers/tty/vt/vt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3134,6 +3134,18 @@ static int con_is_graphics(const struct consw *csw, int first, int last)
* or 0 on success.
*/
int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
{
int retval;

console_lock();
retval = do_unbind_con_driver(csw, first, last, deflt);
console_unlock();
return retval;
}
EXPORT_SYMBOL(unbind_con_driver);

/* unlocked version of unbind_con_driver() */
int do_unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
{
struct module *owner = csw->owner;
const struct consw *defcsw = NULL;
Expand All @@ -3143,7 +3155,7 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
if (!try_module_get(owner))
return -ENODEV;

console_lock();
WARN_CONSOLE_UNLOCKED();

/* check if driver is registered and if it is unbindable */
for (i = 0; i < MAX_NR_CON_DRIVER; i++) {
Expand All @@ -3156,10 +3168,8 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
}
}

if (retval) {
console_unlock();
if (retval)
goto err;
}

retval = -ENODEV;

Expand All @@ -3175,15 +3185,11 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)
}
}

if (retval) {
console_unlock();
if (retval)
goto err;
}

if (!con_is_bound(csw)) {
console_unlock();
if (!con_is_bound(csw))
goto err;
}

first = max(first, con_driver->first);
last = min(last, con_driver->last);
Expand Down Expand Up @@ -3212,13 +3218,12 @@ int unbind_con_driver(const struct consw *csw, int first, int last, int deflt)

/* ignore return value, binding should not fail */
do_bind_con_driver(defcsw, first, last, deflt);
console_unlock();
err:
module_put(owner);
return retval;

}
EXPORT_SYMBOL(unbind_con_driver);
EXPORT_SYMBOL_GPL(do_unbind_con_driver);

static int vt_bind(struct con_driver *con)
{
Expand Down Expand Up @@ -3605,9 +3610,18 @@ EXPORT_SYMBOL(register_con_driver);
*/
int unregister_con_driver(const struct consw *csw)
{
int i, retval = -ENODEV;
int retval;

console_lock();
retval = do_unregister_con_driver(csw);
console_unlock();
return retval;
}
EXPORT_SYMBOL(unregister_con_driver);

int do_unregister_con_driver(const struct consw *csw)
{
int i, retval = -ENODEV;

/* cannot unregister a bound driver */
if (con_is_bound(csw))
Expand All @@ -3633,10 +3647,9 @@ int unregister_con_driver(const struct consw *csw)
}
}
err:
console_unlock();
return retval;
}
EXPORT_SYMBOL(unregister_con_driver);
EXPORT_SYMBOL_GPL(do_unregister_con_driver);

/*
* If we support more console drivers, this function is used
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/video/console/fbcon.c
Original file line number Diff line number Diff line change
Expand Up @@ -3004,7 +3004,7 @@ static int fbcon_unbind(void)
{
int ret;

ret = unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
ret = do_unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
fbcon_is_default);

if (!ret)
Expand Down Expand Up @@ -3077,7 +3077,7 @@ static int fbcon_fb_unregistered(struct fb_info *info)
primary_device = -1;

if (!num_registered_fb)
unregister_con_driver(&fb_con);
do_unregister_con_driver(&fb_con);

return 0;
}
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/video/fbmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1668,8 +1668,10 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)

if (!lock_fb_info(fb_info))
return -ENODEV;
console_lock();
event.info = fb_info;
ret = fb_notifier_call_chain(FB_EVENT_FB_UNBIND, &event);
console_unlock();
unlock_fb_info(fb_info);

if (ret)
Expand All @@ -1684,7 +1686,9 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
num_registered_fb--;
fb_cleanup_device(fb_info);
event.info = fb_info;
console_lock();
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
console_unlock();

/* this may free fb info */
put_fb_info(fb_info);
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ extern const struct consw prom_con; /* SPARC PROM console */
int con_is_bound(const struct consw *csw);
int register_con_driver(const struct consw *csw, int first, int last);
int unregister_con_driver(const struct consw *csw);
int do_unregister_con_driver(const struct consw *csw);
int take_over_console(const struct consw *sw, int first, int last, int deflt);
int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
void give_up_console(const struct consw *sw);
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/vt_kern.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ void vt_event_post(unsigned int event, unsigned int old, unsigned int new);
int vt_waitactive(int n);
void change_console(struct vc_data *new_vc);
void reset_vc(struct vc_data *vc);
extern int do_unbind_con_driver(const struct consw *csw, int first, int last,
int deflt);
extern int unbind_con_driver(const struct consw *csw, int first, int last,
int deflt);
int vty_init(const struct file_operations *console_fops);
Expand Down

0 comments on commit 3592459

Please sign in to comment.