cciss: Rearrange logical drive sysfs code to make the "changing a disk" path work.
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Thu, 17 Sep 2009 18:47:19 +0000 (13:47 -0500)
committerJens Axboe <jens.axboe@oracle.com>
Thu, 1 Oct 2009 19:15:41 +0000 (21:15 +0200)
Rearrange logical drive sysfs code to make the "changing a disk" path work.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
drivers/block/cciss.c

index 30b328aefe7d5023ab497f4979fbb010fa2e93fc..2810dd9805a9d706c462834ddc7758db66794d59 100644 (file)
@@ -1916,9 +1916,10 @@ static int cciss_add_gendisk(ctlr_info_t *h, __u32 lunid, int controller_node)
                }
        }
        h->drv[drv_index].LunID = lunid;
-       if (cciss_create_ld_sysfs_entry(h, drv_index))
-               goto err_free_disk;
-
+       if (h->drv[drv_index].dev == NULL) {
+               if (cciss_create_ld_sysfs_entry(h, drv_index))
+                       goto err_free_disk;
+       }
        /* Don't need to mark this busy because nobody */
        /* else knows about this disk yet to contend */
        /* for access to it. */
@@ -2145,8 +2146,10 @@ 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)
+               if (disk->flags & GENHD_FL_UP) {
+                       cciss_destroy_ld_sysfs_entry(h, drv_index);
                        del_gendisk(disk);
+               }
                if (q) {
                        blk_cleanup_queue(q);
                        /* Set drv->queue to NULL so that we do not try
@@ -2190,7 +2193,6 @@ static int deregister_disk(ctlr_info_t *h, int drv_index,
                                 * indicate that this element of the drive
                                 * array is free.
                                 */
-       cciss_destroy_ld_sysfs_entry(h, drv_index);
 
        if (clear_all) {
                /* check to see if it was the last disk */
@@ -4308,15 +4310,13 @@ static void __devexit cciss_remove_one(struct pci_dev *pdev)
                if (disk) {
                        struct request_queue *q = disk->queue;
 
-                       if (disk->flags & GENHD_FL_UP)
+                       if (disk->flags & GENHD_FL_UP) {
+                               cciss_destroy_ld_sysfs_entry(hba[i], j);
                                del_gendisk(disk);
+                       }
                        if (q)
                                blk_cleanup_queue(q);
                }
-               if (hba[i]->drv[j].dev != NULL &&
-                       (j == 0 || hba[i]->drv[j].raid_level != -1))
-                               cciss_destroy_ld_sysfs_entry(hba[i], j);
-
        }
 
 #ifdef CONFIG_CISS_SCSI_TAPE