static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) { struct ide_disk_obj *idkp = NULL; mutex_lock(&ide_disk_ref_mutex); idkp = ide_drv_g(disk, ide_disk_obj); if (idkp) { if (ide_device_get(idkp->drive)) idkp = NULL; else kref_get(&idkp->kref); } mutex_unlock(&ide_disk_ref_mutex); return idkp; }
static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) { struct ide_scsi_obj *scsi = NULL; mutex_lock(&idescsi_ref_mutex); scsi = ide_scsi_g(disk); if (scsi) { if (ide_device_get(scsi->drive)) scsi = NULL; else scsi_host_get(scsi->host); } mutex_unlock(&idescsi_ref_mutex); return scsi; }
static struct cdrom_info *ide_cd_get(struct gendisk *disk) { struct cdrom_info *cd = NULL; mutex_lock(&idecd_ref_mutex); cd = ide_drv_g(disk, cdrom_info); if (cd) { if (ide_device_get(cd->drive)) cd = NULL; else get_device(&cd->dev); } mutex_unlock(&idecd_ref_mutex); return cd; }