Commit 2b6df45e authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] i2o switched to alloc_disk()

parent e102c579
...@@ -186,7 +186,7 @@ static struct i2ob_request *i2ob_backlog_tail[MAX_I2O_CONTROLLERS]; ...@@ -186,7 +186,7 @@ static struct i2ob_request *i2ob_backlog_tail[MAX_I2O_CONTROLLERS];
static struct i2ob_device i2ob_dev[MAX_I2OB<<4]; static struct i2ob_device i2ob_dev[MAX_I2OB<<4];
static int i2ob_dev_count = 0; static int i2ob_dev_count = 0;
static struct gendisk i2o_disk[MAX_I2OB]; static struct gendisk *i2o_disk[MAX_I2OB];
/* /*
* Mutex and spin lock for event handling synchronization * Mutex and spin lock for event handling synchronization
...@@ -715,7 +715,7 @@ static int i2ob_evt(void *dummy) ...@@ -715,7 +715,7 @@ static int i2ob_evt(void *dummy)
*/ */
case I2O_EVT_IND_BSA_VOLUME_LOAD: case I2O_EVT_IND_BSA_VOLUME_LOAD:
{ {
struct gendisk *p = &i2o_disk[unit>>4]; struct gendisk *p = i2o_disk[unit>>4];
i2ob_install_device(i2ob_dev[unit].i2odev->controller, i2ob_install_device(i2ob_dev[unit].i2odev->controller,
i2ob_dev[unit].i2odev, unit); i2ob_dev[unit].i2odev, unit);
add_disk(p); add_disk(p);
...@@ -730,7 +730,7 @@ static int i2ob_evt(void *dummy) ...@@ -730,7 +730,7 @@ static int i2ob_evt(void *dummy)
*/ */
case I2O_EVT_IND_BSA_VOLUME_UNLOAD: case I2O_EVT_IND_BSA_VOLUME_UNLOAD:
{ {
struct gendisk *p = &i2o_disk[unit>>4]; struct gendisk *p = i2o_disk[unit>>4];
del_gendisk(p); del_gendisk(p);
for(i = unit; i <= unit+15; i++) for(i = unit; i <= unit+15; i++)
blk_queue_max_sectors(i2ob_dev[i].req_queue, 0); blk_queue_max_sectors(i2ob_dev[i].req_queue, 0);
...@@ -762,7 +762,7 @@ static int i2ob_evt(void *dummy) ...@@ -762,7 +762,7 @@ static int i2ob_evt(void *dummy)
i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8); i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8);
spin_lock_irqsave(I2O_LOCK(unit), flags); spin_lock_irqsave(I2O_LOCK(unit), flags);
set_capacity(&i2o_disk[unit>>4], size>>9); set_capacity(i2o_disk[unit>>4], size>>9);
spin_unlock_irqrestore(I2O_LOCK(unit), flags); spin_unlock_irqrestore(I2O_LOCK(unit), flags);
break; break;
} }
...@@ -1040,7 +1040,7 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, ...@@ -1040,7 +1040,7 @@ static int i2ob_ioctl(struct inode *inode, struct file *file,
if (cmd != HDIO_GETGEO) if (cmd != HDIO_GETGEO)
return -EINVAL; return -EINVAL;
i2o_block_biosparam(get_capacity(&i2o_disk[u]), i2o_block_biosparam(get_capacity(i2o_disk[u]),
&g.cylinders, &g.heads, &g.sectors); &g.cylinders, &g.heads, &g.sectors);
g.start = get_start_sect(inode->i_bdev); g.start = get_start_sect(inode->i_bdev);
return copy_to_user((void *)arg, &g, sizeof(g)) ? -EFAULT : 0; return copy_to_user((void *)arg, &g, sizeof(g)) ? -EFAULT : 0;
...@@ -1216,7 +1216,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i ...@@ -1216,7 +1216,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i
i2ob_query_device(dev, 0x0000, 5, &flags, 4); i2ob_query_device(dev, 0x0000, 5, &flags, 4);
i2ob_query_device(dev, 0x0000, 6, &status, 4); i2ob_query_device(dev, 0x0000, 6, &status, 4);
set_capacity(&i2o_disk[unit>>4], size>>9); set_capacity(i2o_disk[unit>>4], size>>9);
/* Set limit based on inbound frame size */ /* Set limit based on inbound frame size */
limit = (d->controller->status_block->inbound_frame_size - 8)/2; limit = (d->controller->status_block->inbound_frame_size - 8)/2;
...@@ -1253,7 +1253,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i ...@@ -1253,7 +1253,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i
} }
strcpy(d->dev_name, i2o_disk[unit>>4].disk_name); strcpy(d->dev_name, i2o_disk[unit>>4]->disk_name);
printk(KERN_INFO "%s: Max segments %d, queue depth %d, byte limit %d.\n", printk(KERN_INFO "%s: Max segments %d, queue depth %d, byte limit %d.\n",
d->dev_name, i2ob_dev[unit].max_segments, i2ob_dev[unit].depth, limit); d->dev_name, i2ob_dev[unit].max_segments, i2ob_dev[unit].depth, limit);
...@@ -1460,7 +1460,7 @@ static void i2ob_scan(int bios) ...@@ -1460,7 +1460,7 @@ static void i2ob_scan(int bios)
printk(KERN_WARNING "Could not install I2O block device\n"); printk(KERN_WARNING "Could not install I2O block device\n");
else else
{ {
add_disk(&i2o_disk[scan_unit>>4]); add_disk(i2o_disk[scan_unit>>4]);
scan_unit+=16; scan_unit+=16;
i2ob_dev_count++; i2ob_dev_count++;
...@@ -1548,7 +1548,7 @@ void i2ob_new_device(struct i2o_controller *c, struct i2o_device *d) ...@@ -1548,7 +1548,7 @@ void i2ob_new_device(struct i2o_controller *c, struct i2o_device *d)
printk(KERN_ERR "i2o_block: Could not install new device\n"); printk(KERN_ERR "i2o_block: Could not install new device\n");
else else
{ {
add_disk(&i2o_disk[unit>>4]); add_disk(i2o_disk[unit>>4]);
i2ob_dev_count++; i2ob_dev_count++;
i2o_device_notify_on(d, &i2o_block_handler); i2o_device_notify_on(d, &i2o_block_handler);
} }
...@@ -1599,7 +1599,7 @@ void i2ob_del_device(struct i2o_controller *c, struct i2o_device *d) ...@@ -1599,7 +1599,7 @@ void i2ob_del_device(struct i2o_controller *c, struct i2o_device *d)
* This will force errors when i2ob_get_queue() is called * This will force errors when i2ob_get_queue() is called
* by the kenrel. * by the kenrel.
*/ */
del_gendisk(&i2o_disk[unit>>4]); del_gendisk(i2o_disk[unit>>4]);
i2ob_dev[unit].req_queue = NULL; i2ob_dev[unit].req_queue = NULL;
for(i = unit; i <= unit+15; i++) for(i = unit; i <= unit+15; i++)
{ {
...@@ -1709,11 +1709,7 @@ static struct block_device_operations i2ob_fops = ...@@ -1709,11 +1709,7 @@ static struct block_device_operations i2ob_fops =
* (Just smiley confuses emacs :-) * (Just smiley confuses emacs :-)
*/ */
#ifdef MODULE static int __init i2o_block_init(void)
#define i2o_block_init init_module
#endif
int i2o_block_init(void)
{ {
int i; int i;
...@@ -1729,6 +1725,12 @@ int i2o_block_init(void) ...@@ -1729,6 +1725,12 @@ int i2o_block_init(void)
MAJOR_NR); MAJOR_NR);
return -EIO; return -EIO;
} }
for (i = 0; i < MAX_I2OB; i++) {
struct gendisk *disk = alloc_disk();
if (!disk)
goto Enomem;
i2o_disk[i] = disk;
}
#ifdef MODULE #ifdef MODULE
printk(KERN_INFO "i2o_block: registered device at major %d\n", MAJOR_NR); printk(KERN_INFO "i2o_block: registered device at major %d\n", MAJOR_NR);
#endif #endif
...@@ -1751,7 +1753,7 @@ int i2o_block_init(void) ...@@ -1751,7 +1753,7 @@ int i2o_block_init(void)
} }
for (i = 0; i < MAX_I2OB; i++) { for (i = 0; i < MAX_I2OB; i++) {
struct gendisk *disk = i2o_disk + i; struct gendisk *disk = i2o_disk[i];
disk->major = MAJOR_NR; disk->major = MAJOR_NR;
disk->first_minor = i<<4; disk->first_minor = i<<4;
disk->minor_shift = 4; disk->minor_shift = 4;
...@@ -1808,15 +1810,14 @@ int i2o_block_init(void) ...@@ -1808,15 +1810,14 @@ int i2o_block_init(void)
i2ob_probe(); i2ob_probe();
return 0; return 0;
Enomem:
while (i--)
put_disk(i2o_disk[i]);
unregister_blkdev(MAJOR_NR, "i2o_block");
return -ENOMEM;
} }
#ifdef MODULE static void __exit i2o_block_exit(void)
MODULE_AUTHOR("Red Hat Software");
MODULE_DESCRIPTION("I2O Block Device OSM");
MODULE_LICENSE("GPL");
void cleanup_module(void)
{ {
int i; int i;
...@@ -1862,11 +1863,20 @@ void cleanup_module(void) ...@@ -1862,11 +1863,20 @@ void cleanup_module(void)
*/ */
i2o_remove_handler(&i2o_block_handler); i2o_remove_handler(&i2o_block_handler);
for (i = 0; i < MAX_I2OB; i++)
put_disk(i2o_disk[i]);
/* /*
* Return the block device * Return the block device
*/ */
if (unregister_blkdev(MAJOR_NR, "i2o_block") != 0) if (unregister_blkdev(MAJOR_NR, "i2o_block") != 0)
printk("i2o_block: cleanup_module failed\n"); printk("i2o_block: cleanup_module failed\n");
} }
#endif
MODULE_AUTHOR("Red Hat Software");
MODULE_DESCRIPTION("I2O Block Device OSM");
MODULE_LICENSE("GPL");
module_init(i2o_block_init)
module_exit(i2o_block_exit)
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