Commit 1f8ef380 authored by Mike Miller's avatar Mike Miller Committed by Linus Torvalds

[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: default avatarDon Brace <dab@hp.com>
Signed-off-by: default avatarMike Miller <mike.miller@hp.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 9dc7a86e
...@@ -468,6 +468,9 @@ static int cciss_open(struct inode *inode, struct file *filep) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 ...@@ -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.
......
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