static void ide_gd_remove(ide_drive_t *drive) { struct ide_disk_obj *idkp = drive->driver_data; struct gendisk *g = idkp->disk; ide_proc_unregister_driver(drive, idkp->driver); del_gendisk(g); drive->disk_ops->flush(drive); ide_disk_put(idkp); }
static void ide_gd_remove(ide_drive_t *drive) { struct ide_disk_obj *idkp = drive->driver_data; struct gendisk *g = idkp->disk; ide_proc_unregister_driver(drive, idkp->driver); device_del(&idkp->dev); del_gendisk(g); drive->disk_ops->flush(drive); mutex_lock(&ide_disk_ref_mutex); put_device(&idkp->dev); mutex_unlock(&ide_disk_ref_mutex); }
static void ide_scsi_remove(ide_drive_t *drive) { struct Scsi_Host *scsihost = drive->driver_data; struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost); struct gendisk *g = scsi->disk; scsi_remove_host(scsihost); ide_proc_unregister_driver(drive, scsi->driver); ide_unregister_region(g); drive->driver_data = NULL; g->private_data = NULL; put_disk(g); ide_scsi_put(scsi); drive->scsi = 0; }
static int ide_scsi_probe(ide_drive_t *drive) { idescsi_scsi_t *idescsi; struct Scsi_Host *host; struct gendisk *g; static int warned; int err = -ENOMEM; if (!warned && drive->media == ide_cdrom) { printk(KERN_WARNING "ide-scsi is deprecated for cd burning! Use ide-cd and give dev=/dev/hdX as device\n"); warned = 1; } if (idescsi_nocd && drive->media == ide_cdrom) return -ENODEV; if (!strstr("ide-scsi", drive->driver_req) || !drive->present || drive->media == ide_disk || !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t)))) return -ENODEV; drive->scsi = 1; g = alloc_disk(1 << PARTN_BITS); if (!g) goto out_host_put; ide_init_disk(g, drive); host->max_id = 1; if (drive->id->last_lun) debug_log("%s: id->last_lun=%u\n", drive->name, drive->id->last_lun); if ((drive->id->last_lun & 0x7) != 7) host->max_lun = (drive->id->last_lun & 0x7) + 1; else host->max_lun = 1; drive->driver_data = host; idescsi = scsihost_to_idescsi(host); idescsi->drive = drive; idescsi->driver = &idescsi_driver; idescsi->host = host; idescsi->disk = g; g->private_data = &idescsi->driver; ide_proc_register_driver(drive, &idescsi_driver); err = 0; idescsi_setup(drive, idescsi); g->fops = &idescsi_ops; ide_register_region(g); err = scsi_add_host(host, &drive->gendev); if (!err) { scsi_scan_host(host); return 0; } /* fall through on error */ ide_unregister_region(g); ide_proc_unregister_driver(drive, &idescsi_driver); put_disk(g); out_host_put: drive->scsi = 0; scsi_host_put(host); return err; }