aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorStephen M. Cameron <scameron@beardog.cce.hp.com>2009-11-23 03:31:48 -0500
committerJens Axboe <jens.axboe@oracle.com>2009-11-23 03:31:48 -0500
commitd61c42690c6e2ff093a3d01338dad49f35b1e27b (patch)
treeb8c419f13c09f7f5cde0b85c3f11e1fe7635a3c8 /drivers/block
parent87038c2d5bda2418fda8b1456a0ae81cc3ff5bd8 (diff)
cciss: fix scatter gather cleanup problems
On driver unload, only free up the extra scatter gather data if they were allocated in the first place (the controller supports it) and don't forget to free up the sg_cmd_list array of pointers. Signed-off-by: Don Brace <brace@beardog.cce.hp.com> Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/cciss.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index eab81c6c0ca5..873e594860d3 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -4326,10 +4326,15 @@ clean4:
4326 for (k = 0; k < hba[i]->nr_cmds; k++) 4326 for (k = 0; k < hba[i]->nr_cmds; k++)
4327 kfree(hba[i]->scatter_list[k]); 4327 kfree(hba[i]->scatter_list[k]);
4328 kfree(hba[i]->scatter_list); 4328 kfree(hba[i]->scatter_list);
4329 for (j = 0; j < hba[i]->nr_cmds; j++) { 4329 /* Only free up extra s/g lists if controller supports them */
4330 if (hba[i]->cmd_sg_list[j]) 4330 if (hba[i]->chainsize > 0) {
4331 kfree(hba[i]->cmd_sg_list[j]->sgchain); 4331 for (j = 0; j < hba[i]->nr_cmds; j++) {
4332 kfree(hba[i]->cmd_sg_list[j]); 4332 if (hba[i]->cmd_sg_list[j]) {
4333 kfree(hba[i]->cmd_sg_list[j]->sgchain);
4334 kfree(hba[i]->cmd_sg_list[j]);
4335 }
4336 }
4337 kfree(hba[i]->cmd_sg_list);
4333 } 4338 }
4334 if (hba[i]->cmd_pool) 4339 if (hba[i]->cmd_pool)
4335 pci_free_consistent(hba[i]->pdev, 4340 pci_free_consistent(hba[i]->pdev,
@@ -4448,9 +4453,15 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
4448 for (j = 0; j < hba[i]->nr_cmds; j++) 4453 for (j = 0; j < hba[i]->nr_cmds; j++)
4449 kfree(hba[i]->scatter_list[j]); 4454 kfree(hba[i]->scatter_list[j]);
4450 kfree(hba[i]->scatter_list); 4455 kfree(hba[i]->scatter_list);
4451 for (j = 0; j < hba[i]->nr_cmds; j++) { 4456 /* Only free up extra s/g lists if controller supports them */
4452 kfree(hba[i]->cmd_sg_list[j]->sgchain); 4457 if (hba[i]->chainsize > 0) {
4453 kfree(hba[i]->cmd_sg_list[j]); 4458 for (j = 0; j < hba[i]->nr_cmds; j++) {
4459 if (hba[i]->cmd_sg_list[j]) {
4460 kfree(hba[i]->cmd_sg_list[j]->sgchain);
4461 kfree(hba[i]->cmd_sg_list[j]);
4462 }
4463 }
4464 kfree(hba[i]->cmd_sg_list);
4454 } 4465 }
4455 /* 4466 /*
4456 * Deliberately omit pci_disable_device(): it does something nasty to 4467 * Deliberately omit pci_disable_device(): it does something nasty to