diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/cciss.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index ced71b006cd..aa95eeb3020 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -682,6 +682,10 @@ static long cciss_create_ld_sysfs_entry(struct ctlr_info *h, { struct device *dev; + /* Special case for c*d0, we only create it once. */ + if (drv_index == 0 && h->drv[drv_index].dev != NULL) + return 0; + dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) return -ENOMEM; @@ -698,9 +702,15 @@ static long cciss_create_ld_sysfs_entry(struct ctlr_info *h, /* * Remove sysfs entries for a logical drive. */ -static void cciss_destroy_ld_sysfs_entry(struct ctlr_info *h, int drv_index) +static void cciss_destroy_ld_sysfs_entry(struct ctlr_info *h, int drv_index, + int ctlr_exiting) { struct device *dev = h->drv[drv_index].dev; + + /* special case for c*d0, we only destroy it on controller exit */ + if (drv_index == 0 && !ctlr_exiting) + return; + device_del(dev); put_device(dev); /* the "final" put. */ h->drv[drv_index].dev = NULL; @@ -1920,6 +1930,7 @@ static int cciss_add_gendisk(ctlr_info_t *h, __u32 lunid, int controller_node) drv_index = cciss_find_free_drive_index(h->ctlr, controller_node); if (drv_index == -1) return -1; + /*Check if the gendisk needs to be allocated */ if (!h->gendisk[drv_index]) { h->gendisk[drv_index] = @@ -2165,7 +2176,7 @@ static int deregister_disk(ctlr_info_t *h, int drv_index, if (h->gendisk[0] != disk) { struct request_queue *q = disk->queue; if (disk->flags & GENHD_FL_UP) { - cciss_destroy_ld_sysfs_entry(h, drv_index); + cciss_destroy_ld_sysfs_entry(h, drv_index, 0); del_gendisk(disk); } if (q) { @@ -2211,7 +2222,6 @@ static int deregister_disk(ctlr_info_t *h, int drv_index, * indicate that this element of the drive * array is free. */ - if (clear_all) { /* check to see if it was the last disk */ if (drv == h->drv + h->highest_lun) { @@ -4329,7 +4339,7 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev) struct request_queue *q = disk->queue; if (disk->flags & GENHD_FL_UP) { - cciss_destroy_ld_sysfs_entry(hba[i], j); + cciss_destroy_ld_sysfs_entry(hba[i], j, 1); del_gendisk(disk); } if (q) |