Commit d61c4269 authored by Stephen M. Cameron's avatar Stephen M. Cameron Committed by Jens Axboe

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: default avatarDon Brace <brace@beardog.cce.hp.com>
Signed-off-by: default avatarStephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 87038c2d
...@@ -4326,10 +4326,15 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, ...@@ -4326,10 +4326,15 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
for (k = 0; k < hba[i]->nr_cmds; k++) for (k = 0; k < hba[i]->nr_cmds; k++)
kfree(hba[i]->scatter_list[k]); kfree(hba[i]->scatter_list[k]);
kfree(hba[i]->scatter_list); kfree(hba[i]->scatter_list);
for (j = 0; j < hba[i]->nr_cmds; j++) { /* Only free up extra s/g lists if controller supports them */
if (hba[i]->cmd_sg_list[j]) if (hba[i]->chainsize > 0) {
kfree(hba[i]->cmd_sg_list[j]->sgchain); for (j = 0; j < hba[i]->nr_cmds; j++) {
kfree(hba[i]->cmd_sg_list[j]); if (hba[i]->cmd_sg_list[j]) {
kfree(hba[i]->cmd_sg_list[j]->sgchain);
kfree(hba[i]->cmd_sg_list[j]);
}
}
kfree(hba[i]->cmd_sg_list);
} }
if (hba[i]->cmd_pool) if (hba[i]->cmd_pool)
pci_free_consistent(hba[i]->pdev, pci_free_consistent(hba[i]->pdev,
...@@ -4448,9 +4453,15 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev) ...@@ -4448,9 +4453,15 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
for (j = 0; j < hba[i]->nr_cmds; j++) for (j = 0; j < hba[i]->nr_cmds; j++)
kfree(hba[i]->scatter_list[j]); kfree(hba[i]->scatter_list[j]);
kfree(hba[i]->scatter_list); kfree(hba[i]->scatter_list);
for (j = 0; j < hba[i]->nr_cmds; j++) { /* Only free up extra s/g lists if controller supports them */
kfree(hba[i]->cmd_sg_list[j]->sgchain); if (hba[i]->chainsize > 0) {
kfree(hba[i]->cmd_sg_list[j]); for (j = 0; j < hba[i]->nr_cmds; j++) {
if (hba[i]->cmd_sg_list[j]) {
kfree(hba[i]->cmd_sg_list[j]->sgchain);
kfree(hba[i]->cmd_sg_list[j]);
}
}
kfree(hba[i]->cmd_sg_list);
} }
/* /*
* Deliberately omit pci_disable_device(): it does something nasty to * Deliberately omit pci_disable_device(): it does something nasty to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment