|
|
@@ -760,46 +760,54 @@ static void visual_init(struct vc_data *vc, int num, int init)
|
|
|
|
|
|
int vc_allocate(unsigned int currcons) /* return 0 on success */
|
|
|
{
|
|
|
+ struct vt_notifier_param param;
|
|
|
+ struct vc_data *vc;
|
|
|
+
|
|
|
WARN_CONSOLE_UNLOCKED();
|
|
|
|
|
|
if (currcons >= MAX_NR_CONSOLES)
|
|
|
return -ENXIO;
|
|
|
- if (!vc_cons[currcons].d) {
|
|
|
- struct vc_data *vc;
|
|
|
- struct vt_notifier_param param;
|
|
|
-
|
|
|
- /* due to the granularity of kmalloc, we waste some memory here */
|
|
|
- /* the alloc is done in two steps, to optimize the common situation
|
|
|
- of a 25x80 console (structsize=216, screenbuf_size=4000) */
|
|
|
- /* although the numbers above are not valid since long ago, the
|
|
|
- point is still up-to-date and the comment still has its value
|
|
|
- even if only as a historical artifact. --mj, July 1998 */
|
|
|
- param.vc = vc = kzalloc(sizeof(struct vc_data), GFP_KERNEL);
|
|
|
- if (!vc)
|
|
|
+
|
|
|
+ if (vc_cons[currcons].d)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* due to the granularity of kmalloc, we waste some memory here */
|
|
|
+ /* the alloc is done in two steps, to optimize the common situation
|
|
|
+ of a 25x80 console (structsize=216, screenbuf_size=4000) */
|
|
|
+ /* although the numbers above are not valid since long ago, the
|
|
|
+ point is still up-to-date and the comment still has its value
|
|
|
+ even if only as a historical artifact. --mj, July 1998 */
|
|
|
+ param.vc = vc = kzalloc(sizeof(struct vc_data), GFP_KERNEL);
|
|
|
+ if (!vc)
|
|
|
return -ENOMEM;
|
|
|
- vc_cons[currcons].d = vc;
|
|
|
- tty_port_init(&vc->port);
|
|
|
- INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
|
|
- visual_init(vc, currcons, 1);
|
|
|
- if (!*vc->vc_uni_pagedir_loc)
|
|
|
+
|
|
|
+ vc_cons[currcons].d = vc;
|
|
|
+ tty_port_init(&vc->port);
|
|
|
+ INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
|
|
+
|
|
|
+ visual_init(vc, currcons, 1);
|
|
|
+
|
|
|
+ if (!*vc->vc_uni_pagedir_loc)
|
|
|
con_set_default_unimap(vc);
|
|
|
- vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
|
|
|
- if (!vc->vc_screenbuf) {
|
|
|
- kfree(vc);
|
|
|
- vc_cons[currcons].d = NULL;
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
|
|
|
- /* If no drivers have overridden us and the user didn't pass a
|
|
|
- boot option, default to displaying the cursor */
|
|
|
- if (global_cursor_default == -1)
|
|
|
- global_cursor_default = 1;
|
|
|
+ vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL);
|
|
|
+ if (!vc->vc_screenbuf)
|
|
|
+ goto err_free;
|
|
|
+
|
|
|
+ /* If no drivers have overridden us and the user didn't pass a
|
|
|
+ boot option, default to displaying the cursor */
|
|
|
+ if (global_cursor_default == -1)
|
|
|
+ global_cursor_default = 1;
|
|
|
+
|
|
|
+ vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
|
|
|
+ vcs_make_sysfs(currcons);
|
|
|
+ atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, ¶m);
|
|
|
|
|
|
- vc_init(vc, vc->vc_rows, vc->vc_cols, 1);
|
|
|
- vcs_make_sysfs(currcons);
|
|
|
- atomic_notifier_call_chain(&vt_notifier_list, VT_ALLOCATE, ¶m);
|
|
|
- }
|
|
|
return 0;
|
|
|
+err_free:
|
|
|
+ kfree(vc);
|
|
|
+ vc_cons[currcons].d = NULL;
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
static inline int resize_screen(struct vc_data *vc, int width, int height,
|