[SCSI] bug fix for free list handling
commit:
commit 542bd1377a
Author: James Bottomley <James.Bottomley@HansenPartnership.com>
Date: Mon Apr 21 10:57:20 2008 -0500
[SCSI] fix SLUB WARN_ON
Fixed another problem in free list handling by moving list allocation
from scsi_host_alloc() to scsi_add_host(). Unfortunately it
introduced a new failure mode in that hosts can pass straight from
alloc to put without going through add, leaving the free list
uninitialised.
Fix by checking shost->cmd_pool on the release path to see if it got
initialised.
Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
49dd09613c
commit
61d7416a28
1 changed files with 8 additions and 0 deletions
|
@ -469,6 +469,7 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
|
||||||
cmd = scsi_pool_alloc_command(shost->cmd_pool, gfp_mask);
|
cmd = scsi_pool_alloc_command(shost->cmd_pool, gfp_mask);
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
scsi_put_host_cmd_pool(gfp_mask);
|
scsi_put_host_cmd_pool(gfp_mask);
|
||||||
|
shost->cmd_pool = NULL;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
list_add(&cmd->list, &shost->free_list);
|
list_add(&cmd->list, &shost->free_list);
|
||||||
|
@ -481,6 +482,13 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost)
|
||||||
*/
|
*/
|
||||||
void scsi_destroy_command_freelist(struct Scsi_Host *shost)
|
void scsi_destroy_command_freelist(struct Scsi_Host *shost)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* If cmd_pool is NULL the free list was not initialized, so
|
||||||
|
* do not attempt to release resources.
|
||||||
|
*/
|
||||||
|
if (!shost->cmd_pool)
|
||||||
|
return;
|
||||||
|
|
||||||
while (!list_empty(&shost->free_list)) {
|
while (!list_empty(&shost->free_list)) {
|
||||||
struct scsi_cmnd *cmd;
|
struct scsi_cmnd *cmd;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue