From 774416ef05b6b5c5208ba786c46405d0e7836323 Mon Sep 17 00:00:00 2001 From: "Antonino A. Daplas" Date: Tue, 3 Oct 2006 01:14:49 -0700 Subject: [PATCH] --- yaml --- r: 38054 b: refs/heads/master c: 928e964f262b522dad57483108f62d87c52ccf82 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/char/vt.c | 31 ++++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 3f71ae4d569e..b31c96afdb6c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 212f26398f63bc905ea28f55b31d4ecd4a21a33b +refs/heads/master: 928e964f262b522dad57483108f62d87c52ccf82 diff --git a/trunk/drivers/char/vt.c b/trunk/drivers/char/vt.c index ec0c070bf15f..a398b6b6aa65 100644 --- a/trunk/drivers/char/vt.c +++ b/trunk/drivers/char/vt.c @@ -106,7 +106,8 @@ #define MAX_NR_CON_DRIVER 16 #define CON_DRIVER_FLAG_MODULE 1 -#define CON_DRIVER_FLAG_INIT 2 +#define CON_DRIVER_FLAG_INIT 2 +#define CON_DRIVER_FLAG_ATTR 4 struct con_driver { const struct consw *con; @@ -3070,22 +3071,37 @@ static struct class_device_attribute class_device_attrs[] = { static int vtconsole_init_class_device(struct con_driver *con) { int i; + int error = 0; + con->flag |= CON_DRIVER_FLAG_ATTR; class_set_devdata(con->class_dev, con); - for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) - class_device_create_file(con->class_dev, + for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { + error = class_device_create_file(con->class_dev, &class_device_attrs[i]); + if (error) + break; + } - return 0; + if (error) { + while (--i >= 0) + class_device_remove_file(con->class_dev, + &class_device_attrs[i]); + con->flag &= ~CON_DRIVER_FLAG_ATTR; + } + + return error; } static void vtconsole_deinit_class_device(struct con_driver *con) { int i; - for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) - class_device_remove_file(con->class_dev, - &class_device_attrs[i]); + if (con->flag & CON_DRIVER_FLAG_ATTR) { + for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) + class_device_remove_file(con->class_dev, + &class_device_attrs[i]); + con->flag &= ~CON_DRIVER_FLAG_ATTR; + } } /** @@ -3184,6 +3200,7 @@ int register_con_driver(const struct consw *csw, int first, int last) } else { vtconsole_init_class_device(con_driver); } + err: release_console_sem(); module_put(owner);