diff options
author | Ossama Othman <ossama.othman@intel.com> | 2010-07-19 09:32:26 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-07-22 14:30:32 -0700 |
commit | 05e2408d4324ae132eda6530cce0aa24e79f0c41 (patch) | |
tree | 51389832f921fd435e2986165abd6ef94fdaad5a /drivers/staging/memrar | |
parent | 4cae2597f5455a3c8ffc6c200b34e15c83184579 (diff) | |
download | lwn-05e2408d4324ae132eda6530cce0aa24e79f0c41.tar.gz lwn-05e2408d4324ae132eda6530cce0aa24e79f0c41.zip |
memrar: Address kernel oops during resource cleanup
Some delayed initialization is performed in this driver. Make sure
resources that are used during driver clean-up (e.g. during driver's
release() function) are fully initialized before first use. This is
particularly important for the case when the delayed initialization
isn't completed, leaving behind a partially initialized driver.
Such a scenario can occur when RAR is not available on the platform,
and the driver is release()d.
Signed-off-by: Ossama Othman <ossama.othman@intel.com>
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/memrar')
-rw-r--r-- | drivers/staging/memrar/memrar_handler.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/drivers/staging/memrar/memrar_handler.c b/drivers/staging/memrar/memrar_handler.c index 22208cde2ca5..dd5d2c8d13ad 100644 --- a/drivers/staging/memrar/memrar_handler.c +++ b/drivers/staging/memrar/memrar_handler.c @@ -279,15 +279,6 @@ static int memrar_init_rar_resources(int rarnum, char const *devname) BUG_ON(!memrar_is_valid_rar_type(rarnum)); BUG_ON(rar->allocated); - mutex_init(&rar->lock); - - /* - * Initialize the process table before we reach any - * code that exit on failure since the finalization - * code requires an initialized list. - */ - INIT_LIST_HEAD(&rar->buffers.list); - if (rar_get_address(rarnum, &low, &high) != 0) /* No RAR is available. */ return -ENODEV; @@ -941,9 +932,28 @@ static int memrar_registration_callback(unsigned long rar) static int __init memrar_init(void) { int err; + int i; printk(banner); + /* + * Some delayed initialization is performed in this driver. + * Make sure resources that are used during driver clean-up + * (e.g. during driver's release() function) are fully + * initialized before first use. This is particularly + * important for the case when the delayed initialization + * isn't completed, leaving behind a partially initialized + * driver. + * + * Such a scenario can occur when RAR is not available on the + * platform, and the driver is release()d. + */ + for (i = 0; i != ARRAY_SIZE(memrars); ++i) { + struct memrar_rar_info * const rar = &memrars[i]; + mutex_init(&rar->lock); + INIT_LIST_HEAD(&rar->buffers.list); + } + err = misc_register(&memrar_miscdev); if (err) return err; |