diff options
author | Bryn M. Reeves <breeves@redhat.com> | 2007-10-19 22:29:32 +0100 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2007-10-20 02:00:57 +0100 |
commit | c7ac86de6a1bcb1b59c83e19b0d0d64a59604ade (patch) | |
tree | 6dba24ddd057340ce8fe8ce6b887b7d6ce4f4193 | |
parent | 60812a4a99b796d894d2522dc63cb0fafc3be25e (diff) | |
download | op-kernel-dev-c7ac86de6a1bcb1b59c83e19b0d0d64a59604ade.zip op-kernel-dev-c7ac86de6a1bcb1b59c83e19b0d0d64a59604ade.tar.gz |
dm mpath: rdac fix init race
Re-order the initialisation of dm-rdac to avoid registering the hw
handler before the workqueue has been initialised. Closes a race
that would potentially give an oops.
Signed-off-by: Bryn M. Reeves <breeves@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
-rw-r--r-- | drivers/md/dm-mpath-rdac.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/md/dm-mpath-rdac.c b/drivers/md/dm-mpath-rdac.c index 16b1613..e04eb5c 100644 --- a/drivers/md/dm-mpath-rdac.c +++ b/drivers/md/dm-mpath-rdac.c @@ -664,20 +664,21 @@ static struct hw_handler_type rdac_handler = { static int __init rdac_init(void) { - int r = dm_register_hw_handler(&rdac_handler); - - if (r < 0) { - DMERR("%s: register failed %d", RDAC_DM_HWH_NAME, r); - return r; - } + int r; rdac_wkqd = create_singlethread_workqueue("rdac_wkqd"); if (!rdac_wkqd) { DMERR("Failed to create workqueue rdac_wkqd."); - dm_unregister_hw_handler(&rdac_handler); return -ENOMEM; } + r = dm_register_hw_handler(&rdac_handler); + if (r < 0) { + DMERR("%s: register failed %d", RDAC_DM_HWH_NAME, r); + destroy_workqueue(rdac_wkqd); + return r; + } + DMINFO("%s: version %s loaded", RDAC_DM_HWH_NAME, RDAC_DM_HWH_VER); return 0; } |