|
|
@@ -1059,6 +1059,13 @@ static void visual_init(struct vc_data *vc, int num, int init)
|
|
|
vc->vc_screenbuf_size = vc->vc_rows * vc->vc_size_row;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+static void visual_deinit(struct vc_data *vc)
|
|
|
+{
|
|
|
+ vc->vc_sw->con_deinit(vc);
|
|
|
+ module_put(vc->vc_sw->owner);
|
|
|
+}
|
|
|
+
|
|
|
int vc_allocate(unsigned int currcons) /* return 0 on success */
|
|
|
{
|
|
|
struct vt_notifier_param param;
|
|
|
@@ -1106,6 +1113,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
|
|
|
|
|
|
return 0;
|
|
|
err_free:
|
|
|
+ visual_deinit(vc);
|
|
|
kfree(vc);
|
|
|
vc_cons[currcons].d = NULL;
|
|
|
return -ENOMEM;
|
|
|
@@ -1334,9 +1342,8 @@ struct vc_data *vc_deallocate(unsigned int currcons)
|
|
|
param.vc = vc = vc_cons[currcons].d;
|
|
|
atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, ¶m);
|
|
|
vcs_remove_sysfs(currcons);
|
|
|
- vc->vc_sw->con_deinit(vc);
|
|
|
+ visual_deinit(vc);
|
|
|
put_pid(vc->vt_pid);
|
|
|
- module_put(vc->vc_sw->owner);
|
|
|
vc_uniscr_set(vc, NULL);
|
|
|
kfree(vc->vc_screenbuf);
|
|
|
vc_cons[currcons].d = NULL;
|