| From d8a0be6ab7ba1ffa43e7ea0dcdde3e8b68d4f762 Mon Sep 17 00:00:00 2001 |
| From: Stephen M. Cameron <scameron@beardog.cca.cpqcorp.net> |
| Date: Thu, 18 Dec 2008 14:55:11 +0100 |
| Subject: cciss: fix problem that deleting multiple logical drives could cause a panic |
| |
| From: Stephen M. Cameron <scameron@beardog.cca.cpqcorp.net> |
| |
| commit d8a0be6ab7ba1ffa43e7ea0dcdde3e8b68d4f762 upstream. |
| |
| Fix problem that deleting multiple logical drives could cause a panic. |
| |
| It fixes a panic which can be easily reproduced in the following way: Just |
| create several "arrays," each with multiple logical drives via hpacucli, |
| then delete the first array, and it will blow up in deregister_disk(), in |
| the call to get_host() when it tries to dig the hba pointer out of a NULL |
| queue pointer. |
| |
| The problem has been present since my code to make rebuild_lun_table |
| behave better went in. |
| |
| Signed-off-by: Stephen M. Cameron <scameron@beardog.cca.cpqcorp.net> |
| Signed-off-by: Jens Axboe <jens.axboe@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/block/cciss.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/drivers/block/cciss.c |
| +++ b/drivers/block/cciss.c |
| @@ -1692,6 +1692,11 @@ static int rebuild_lun_table(ctlr_info_t |
| for (i = 0; i <= h->highest_lun; i++) { |
| int j; |
| drv_found = 0; |
| + |
| + /* skip holes in the array from already deleted drives */ |
| + if (h->drv[i].raid_level == -1) |
| + continue; |
| + |
| for (j = 0; j < num_luns; j++) { |
| memcpy(&lunid, &ld_buff->LUN[j][0], 4); |
| lunid = le32_to_cpu(lunid); |