|
@@ -141,7 +141,6 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
|
|
unsigned int cmd, unsigned long arg);
|
|
unsigned int cmd, unsigned long arg);
|
|
static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
|
|
static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
|
|
|
|
|
|
-static int revalidate_allvol(ctlr_info_t *host);
|
|
|
|
static int cciss_revalidate(struct gendisk *disk);
|
|
static int cciss_revalidate(struct gendisk *disk);
|
|
static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk);
|
|
static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk);
|
|
static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
|
|
static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
|
|
@@ -857,9 +856,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
|
|
}
|
|
}
|
|
|
|
|
|
case CCISS_REVALIDVOLS:
|
|
case CCISS_REVALIDVOLS:
|
|
- if (bdev != bdev->bd_contains || drv != host->drv)
|
|
|
|
- return -ENXIO;
|
|
|
|
- return revalidate_allvol(host);
|
|
|
|
|
|
+ return rebuild_lun_table(host, NULL);
|
|
|
|
|
|
case CCISS_GETLUNINFO:{
|
|
case CCISS_GETLUNINFO:{
|
|
LogvolInfo_struct luninfo;
|
|
LogvolInfo_struct luninfo;
|
|
@@ -1159,75 +1156,6 @@ static int cciss_ioctl(struct inode *inode, struct file *filep,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * revalidate_allvol is for online array config utilities. After a
|
|
|
|
- * utility reconfigures the drives in the array, it can use this function
|
|
|
|
- * (through an ioctl) to make the driver zap any previous disk structs for
|
|
|
|
- * that controller and get new ones.
|
|
|
|
- *
|
|
|
|
- * Right now I'm using the getgeometry() function to do this, but this
|
|
|
|
- * function should probably be finer grained and allow you to revalidate one
|
|
|
|
- * particular logical volume (instead of all of them on a particular
|
|
|
|
- * controller).
|
|
|
|
- */
|
|
|
|
-static int revalidate_allvol(ctlr_info_t *host)
|
|
|
|
-{
|
|
|
|
- int ctlr = host->ctlr, i;
|
|
|
|
- unsigned long flags;
|
|
|
|
-
|
|
|
|
- spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
|
|
|
|
- if (host->usage_count > 1) {
|
|
|
|
- spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
|
|
|
|
- printk(KERN_WARNING "cciss: Device busy for volume"
|
|
|
|
- " revalidation (usage=%d)\n", host->usage_count);
|
|
|
|
- return -EBUSY;
|
|
|
|
- }
|
|
|
|
- host->usage_count++;
|
|
|
|
- spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
|
|
|
|
-
|
|
|
|
- for (i = 0; i < NWD; i++) {
|
|
|
|
- struct gendisk *disk = host->gendisk[i];
|
|
|
|
- if (disk) {
|
|
|
|
- request_queue_t *q = disk->queue;
|
|
|
|
-
|
|
|
|
- if (disk->flags & GENHD_FL_UP)
|
|
|
|
- del_gendisk(disk);
|
|
|
|
- if (q)
|
|
|
|
- blk_cleanup_queue(q);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Set the partition and block size structures for all volumes
|
|
|
|
- * on this controller to zero. We will reread all of this data
|
|
|
|
- */
|
|
|
|
- memset(host->drv, 0, sizeof(drive_info_struct)
|
|
|
|
- * CISS_MAX_LUN);
|
|
|
|
- /*
|
|
|
|
- * Tell the array controller not to give us any interrupts while
|
|
|
|
- * we check the new geometry. Then turn interrupts back on when
|
|
|
|
- * we're done.
|
|
|
|
- */
|
|
|
|
- host->access.set_intr_mask(host, CCISS_INTR_OFF);
|
|
|
|
- cciss_getgeometry(ctlr);
|
|
|
|
- host->access.set_intr_mask(host, CCISS_INTR_ON);
|
|
|
|
-
|
|
|
|
- /* Loop through each real device */
|
|
|
|
- for (i = 0; i < NWD; i++) {
|
|
|
|
- struct gendisk *disk = host->gendisk[i];
|
|
|
|
- drive_info_struct *drv = &(host->drv[i]);
|
|
|
|
- /* we must register the controller even if no disks exist */
|
|
|
|
- /* this is for the online array utilities */
|
|
|
|
- if (!drv->heads && i)
|
|
|
|
- continue;
|
|
|
|
- blk_queue_hardsect_size(drv->queue, drv->block_size);
|
|
|
|
- set_capacity(disk, drv->nr_blocks);
|
|
|
|
- add_disk(disk);
|
|
|
|
- }
|
|
|
|
- host->usage_count--;
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static inline void complete_buffers(struct bio *bio, int status)
|
|
static inline void complete_buffers(struct bio *bio, int status)
|
|
{
|
|
{
|
|
while (bio) {
|
|
while (bio) {
|