[PATCH] convert IDE device drivers to driver-model
* add ide_bus_match() and export ide_bus_type * split ide_remove_driver_from_hwgroup() out of ide_unregister() * move device cleanup from ide_unregister() to drive_release_dev() * convert ide_driver_t->name to driver->name * convert ide_driver_t->{attach,cleanup} to driver->{probe,remove} * remove ide_driver_t->busy as ide_bus_type->subsys.rwsem protects against concurrent ->{probe,remove} calls * make ide_{un}register_driver() void as it cannot fail now * use driver_{un}register() directly, remove ide_{un}register_driver() * use device_register() instead of ata_attach(), remove ata_attach() * add proc_print_driver() and ide_drivers_show(), remove ide_drivers_op * fix ide_replace_subdriver() and move it to ide-proc.c * remove ide_driver_t->drives, ide_drives and drives_lock * remove ide_driver_t->drivers, drivers and drivers_lock * remove ide_drive_t->driver and DRIVER() macro Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>
This commit is contained in:
@@ -47,6 +47,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/devfs_fs_kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/kmod.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -918,7 +919,7 @@ int probe_hwif_init_with_fixup(ide_hwif_t *hwif, void (*fixup)(ide_hwif_t *hwif)
|
||||
want them on default or a new "empty" class
|
||||
for hotplug reprobing ? */
|
||||
if (drive->present) {
|
||||
ata_attach(drive);
|
||||
device_register(&drive->gendev);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1279,10 +1280,51 @@ void ide_init_disk(struct gendisk *disk, ide_drive_t *drive)
|
||||
|
||||
EXPORT_SYMBOL_GPL(ide_init_disk);
|
||||
|
||||
static void ide_remove_drive_from_hwgroup(ide_drive_t *drive)
|
||||
{
|
||||
ide_hwgroup_t *hwgroup = drive->hwif->hwgroup;
|
||||
|
||||
if (drive == drive->next) {
|
||||
/* special case: last drive from hwgroup. */
|
||||
BUG_ON(hwgroup->drive != drive);
|
||||
hwgroup->drive = NULL;
|
||||
} else {
|
||||
ide_drive_t *walk;
|
||||
|
||||
walk = hwgroup->drive;
|
||||
while (walk->next != drive)
|
||||
walk = walk->next;
|
||||
walk->next = drive->next;
|
||||
if (hwgroup->drive == drive) {
|
||||
hwgroup->drive = drive->next;
|
||||
hwgroup->hwif = hwgroup->drive->hwif;
|
||||
}
|
||||
}
|
||||
BUG_ON(hwgroup->drive == drive);
|
||||
}
|
||||
|
||||
static void drive_release_dev (struct device *dev)
|
||||
{
|
||||
ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
if (drive->devfs_name[0] != '\0') {
|
||||
devfs_remove(drive->devfs_name);
|
||||
drive->devfs_name[0] = '\0';
|
||||
}
|
||||
ide_remove_drive_from_hwgroup(drive);
|
||||
if (drive->id != NULL) {
|
||||
kfree(drive->id);
|
||||
drive->id = NULL;
|
||||
}
|
||||
drive->present = 0;
|
||||
/* Messed up locking ... */
|
||||
spin_unlock_irq(&ide_lock);
|
||||
blk_cleanup_queue(drive->queue);
|
||||
spin_lock_irq(&ide_lock);
|
||||
drive->queue = NULL;
|
||||
spin_unlock_irq(&ide_lock);
|
||||
|
||||
up(&drive->gendev_rel_sem);
|
||||
}
|
||||
|
||||
@@ -1306,7 +1348,6 @@ static void init_gendisk (ide_hwif_t *hwif)
|
||||
drive->gendev.driver_data = drive;
|
||||
drive->gendev.release = drive_release_dev;
|
||||
if (drive->present) {
|
||||
device_register(&drive->gendev);
|
||||
sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
|
||||
(hwif->channel && hwif->mate) ?
|
||||
hwif->mate->index : hwif->index,
|
||||
@@ -1412,7 +1453,7 @@ int ideprobe_init (void)
|
||||
hwif->chipset = ide_generic;
|
||||
for (unit = 0; unit < MAX_DRIVES; ++unit)
|
||||
if (hwif->drives[unit].present)
|
||||
ata_attach(&hwif->drives[unit]);
|
||||
device_register(&hwif->drives[unit].gendev);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user