forked from luck/tmp_suning_uos_patched
[PATCH] cciss: busy_initializing flag
This patch adds a flag called busy_initializing. If there are multiple controllers in a server AND the HP agents are running it's possible the agents may try to poll a card that is still initializing if the driver is removed and then added again. Signed-off-by: Don Brace <dab@hp.com> Signed-off-by: Mike Miller <mike.miller@hp.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
9dc7a86e85
commit
1f8ef3806c
@ -468,6 +468,9 @@ static int cciss_open(struct inode *inode, struct file *filep)
|
|||||||
printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
|
printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
|
||||||
#endif /* CCISS_DEBUG */
|
#endif /* CCISS_DEBUG */
|
||||||
|
|
||||||
|
if (host->busy_initializing)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Root is allowed to open raw volume zero even if it's not configured
|
* Root is allowed to open raw volume zero even if it's not configured
|
||||||
* so array config can still work. Root is also allowed to open any
|
* so array config can still work. Root is also allowed to open any
|
||||||
@ -2742,6 +2745,9 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
i = alloc_cciss_hba();
|
i = alloc_cciss_hba();
|
||||||
if(i < 0)
|
if(i < 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
|
hba[i]->busy_initializing = 1;
|
||||||
|
|
||||||
if (cciss_pci_init(hba[i], pdev) != 0)
|
if (cciss_pci_init(hba[i], pdev) != 0)
|
||||||
goto clean1;
|
goto clean1;
|
||||||
|
|
||||||
@ -2864,6 +2870,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
add_disk(disk);
|
add_disk(disk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hba[i]->busy_initializing = 0;
|
||||||
return(1);
|
return(1);
|
||||||
|
|
||||||
clean4:
|
clean4:
|
||||||
@ -2884,6 +2891,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
clean1:
|
clean1:
|
||||||
release_io_mem(hba[i]);
|
release_io_mem(hba[i]);
|
||||||
free_hba(i);
|
free_hba(i);
|
||||||
|
hba[i]->busy_initializing = 0;
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ struct ctlr_info
|
|||||||
int nr_allocs;
|
int nr_allocs;
|
||||||
int nr_frees;
|
int nr_frees;
|
||||||
int busy_configuring;
|
int busy_configuring;
|
||||||
|
int busy_initializing;
|
||||||
|
|
||||||
/* This element holds the zero based queue number of the last
|
/* This element holds the zero based queue number of the last
|
||||||
* queue to be started. It is used for fairness.
|
* queue to be started. It is used for fairness.
|
||||||
|
Loading…
Reference in New Issue
Block a user