diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@trik.(none)> | 2005-04-02 20:00:50 +0200 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@trik.(none)> | 2005-04-02 20:00:50 +0200 |
commit | 5cc8d0f5a3e5d9f133cea67c3194cbdc046983ec (patch) | |
tree | 80df98ee68c38cbd563d8b89506b08f7f93381a3 | |
parent | dbb3dc01862b4121a09a4624d820bbe2e1cc24a0 (diff) | |
download | history-5cc8d0f5a3e5d9f133cea67c3194cbdc046983ec.tar.gz |
[ide] get driver from rq->rq_disk->private_data
* add ide_driver_t * to device drivers objects
* set it to point at driver's ide_driver_t
* store address of this entry in disk->private_data
* fix ide_{cd,disk,floppy,tape,scsi}_g accordingly
* use rq->rq_disk->private_data instead of drive->driver
to obtain driver (this allows us to kill ide-default)
ide_dma_intr() OOPS fixed by Tejun Heo <htejun@gmail.com>.
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | drivers/ide/ide-cd.c | 7 | ||||
-rw-r--r-- | drivers/ide/ide-cd.h | 1 | ||||
-rw-r--r-- | drivers/ide/ide-disk.c | 8 | ||||
-rw-r--r-- | drivers/ide/ide-dma.c | 8 | ||||
-rw-r--r-- | drivers/ide/ide-floppy.c | 8 | ||||
-rw-r--r-- | drivers/ide/ide-io.c | 44 | ||||
-rw-r--r-- | drivers/ide/ide-tape.c | 8 | ||||
-rw-r--r-- | drivers/ide/ide-taskfile.c | 11 | ||||
-rw-r--r-- | drivers/ide/ide.c | 4 | ||||
-rw-r--r-- | drivers/scsi/ide-scsi.c | 17 |
10 files changed, 91 insertions, 25 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index df13295189014d..33a020faeabde2 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -328,7 +328,8 @@ static DECLARE_MUTEX(idecd_ref_sem); #define to_ide_cd(obj) container_of(obj, struct cdrom_info, kref) -#define ide_cd_g(disk) ((disk)->private_data) +#define ide_cd_g(disk) \ + container_of((disk)->private_data, struct cdrom_info, driver) static struct cdrom_info *ide_cd_get(struct gendisk *disk) { @@ -3462,8 +3463,11 @@ static int ide_cdrom_attach (ide_drive_t *drive) kref_init(&info->kref); info->drive = drive; + info->driver = &ide_cdrom_driver; info->disk = g; + g->private_data = &info->driver; + drive->driver_data = info; DRIVER(drive)->busy++; @@ -3492,7 +3496,6 @@ static int ide_cdrom_attach (ide_drive_t *drive) cdrom_read_toc(drive, &sense); g->fops = &idecd_ops; - g->private_data = info; g->flags |= GENHD_FL_REMOVABLE; add_disk(g); return 0; diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h index ee97600a1f312d..7ca3e5afc66551 100644 --- a/drivers/ide/ide-cd.h +++ b/drivers/ide/ide-cd.h @@ -461,6 +461,7 @@ struct atapi_changer_info { /* Extra per-device info for cdrom drives. */ struct cdrom_info { ide_drive_t *drive; + ide_driver_t *driver; struct gendisk *disk; struct kref kref; diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 78733d395d6659..5d54f77561007f 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -73,6 +73,7 @@ struct ide_disk_obj { ide_drive_t *drive; + ide_driver_t *driver; struct gendisk *disk; struct kref kref; }; @@ -81,7 +82,8 @@ static DECLARE_MUTEX(idedisk_ref_sem); #define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref) -#define ide_disk_g(disk) ((disk)->private_data) +#define ide_disk_g(disk) \ + container_of((disk)->private_data, struct ide_disk_obj, driver) static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) { @@ -1230,8 +1232,11 @@ static int idedisk_attach(ide_drive_t *drive) kref_init(&idkp->kref); idkp->drive = drive; + idkp->driver = &idedisk_driver; idkp->disk = g; + g->private_data = &idkp->driver; + drive->driver_data = idkp; DRIVER(drive)->busy++; @@ -1249,7 +1254,6 @@ static int idedisk_attach(ide_drive_t *drive) g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; set_capacity(g, idedisk_capacity(drive)); g->fops = &idedisk_ops; - g->private_data = idkp; add_disk(g); return 0; diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 1179a31f81405a..2d2eefb610dd80 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -176,7 +176,13 @@ ide_startstop_t ide_dma_intr (ide_drive_t *drive) if (!dma_stat) { struct request *rq = HWGROUP(drive)->rq; - DRIVER(drive)->end_request(drive, 1, rq->nr_sectors); + if (rq->rq_disk) { + ide_driver_t *drv; + + drv = *(ide_driver_t **)rq->rq_disk->private_data;; + drv->end_request(drive, 1, rq->nr_sectors); + } else + ide_end_request(drive, 1, rq->nr_sectors); return ide_stopped; } printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n", diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 1b7d172febf730..36c0b74a4e45b6 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -276,6 +276,7 @@ typedef struct { */ typedef struct ide_floppy_obj { ide_drive_t *drive; + ide_driver_t *driver; struct gendisk *disk; struct kref kref; @@ -520,7 +521,8 @@ static DECLARE_MUTEX(idefloppy_ref_sem); #define to_ide_floppy(obj) container_of(obj, struct ide_floppy_obj, kref) -#define ide_floppy_g(disk) ((disk)->private_data) +#define ide_floppy_g(disk) \ + container_of((disk)->private_data, struct ide_floppy_obj, driver) static struct ide_floppy_obj *ide_floppy_get(struct gendisk *disk) { @@ -2160,8 +2162,11 @@ static int idefloppy_attach (ide_drive_t *drive) kref_init(&floppy->kref); floppy->drive = drive; + floppy->driver = &idefloppy_driver; floppy->disk = g; + g->private_data = &floppy->driver; + drive->driver_data = floppy; DRIVER(drive)->busy++; @@ -2172,7 +2177,6 @@ static int idefloppy_attach (ide_drive_t *drive) strcpy(g->devfs_name, drive->devfs_name); g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; g->fops = &idefloppy_ops; - g->private_data = floppy; drive->attach = 1; add_disk(g); return 0; diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 94f5744c62d746..248e3cc8b3527d 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -410,6 +410,17 @@ static void try_to_flush_leftover_data (ide_drive_t *drive) } } +static void ide_kill_rq(ide_drive_t *drive, struct request *rq) +{ + if (rq->rq_disk) { + ide_driver_t *drv; + + drv = *(ide_driver_t **)rq->rq_disk->private_data; + drv->end_request(drive, 0, 0); + } else + ide_end_request(drive, 0, 0); +} + static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) { ide_hwif_t *hwif = drive->hwif; @@ -444,7 +455,7 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8 hwif->OUTB(WIN_IDLEIMMEDIATE, IDE_COMMAND_REG); if (rq->errors >= ERROR_MAX || blk_noretry_request(rq)) - drive->driver->end_request(drive, 0, 0); + ide_kill_rq(drive, rq); else { if ((rq->errors & ERROR_RESET) == ERROR_RESET) { ++rq->errors; @@ -473,7 +484,7 @@ static ide_startstop_t ide_atapi_error(ide_drive_t *drive, struct request *rq, u hwif->OUTB(WIN_IDLEIMMEDIATE, IDE_COMMAND_REG); if (rq->errors >= ERROR_MAX) { - drive->driver->end_request(drive, 0, 0); + ide_kill_rq(drive, rq); } else { if ((rq->errors & ERROR_RESET) == ERROR_RESET) { ++rq->errors; @@ -525,7 +536,13 @@ ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, u8 stat) return ide_stopped; } - return drive->driver->error(drive, rq, stat, err); + if (rq->rq_disk) { + ide_driver_t *drv; + + drv = *(ide_driver_t **)rq->rq_disk->private_data; + return drv->error(drive, rq, stat, err); + } else + return __ide_error(drive, rq, stat, err); } EXPORT_SYMBOL_GPL(ide_error); @@ -535,7 +552,8 @@ ide_startstop_t __ide_abort(ide_drive_t *drive, struct request *rq) if (drive->media != ide_disk) rq->errors |= ERROR_RESET; - DRIVER(drive)->end_request(drive, 0, 0); + ide_kill_rq(drive, rq); + return ide_stopped; } @@ -569,7 +587,13 @@ ide_startstop_t ide_abort(ide_drive_t *drive, const char *msg) return ide_stopped; } - return drive->driver->abort(drive, rq); + if (rq->rq_disk) { + ide_driver_t *drv; + + drv = *(ide_driver_t **)rq->rq_disk->private_data; + return drv->abort(drive, rq); + } else + return __ide_abort(drive, rq); } /** @@ -622,7 +646,7 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive) udelay(100); } - if (!OK_STAT(stat, READY_STAT, BAD_STAT) && DRIVER(drive) != NULL) + if (!OK_STAT(stat, READY_STAT, BAD_STAT)) return ide_error(drive, "drive_cmd", stat); /* calls ide_end_drive_cmd */ ide_end_drive_cmd(drive, stat, hwif->INB(IDE_ERROR_REG)); @@ -922,6 +946,8 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) return startstop; } if (!drive->special.all) { + ide_driver_t *drv; + if (rq->flags & (REQ_DRIVE_CMD | REQ_DRIVE_TASK)) return execute_drive_cmd(drive, rq); else if (rq->flags & REQ_DRIVE_TASKFILE) @@ -937,11 +963,13 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) ide_complete_pm_request(drive, rq); return startstop; } - return (DRIVER(drive)->do_request(drive, rq, block)); + + drv = *(ide_driver_t **)rq->rq_disk->private_data; + return drv->do_request(drive, rq, block); } return do_special(drive); kill_rq: - DRIVER(drive)->end_request(drive, 0, 0); + ide_kill_rq(drive, rq); return ide_stopped; } diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index a394afa8467157..4825448549850d 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c @@ -783,6 +783,7 @@ typedef struct { */ typedef struct ide_tape_obj { ide_drive_t *drive; + ide_driver_t *driver; struct gendisk *disk; struct kref kref; @@ -1014,7 +1015,8 @@ static DECLARE_MUTEX(idetape_ref_sem); #define to_ide_tape(obj) container_of(obj, struct ide_tape_obj, kref) -#define ide_tape_g(disk) ((disk)->private_data) +#define ide_tape_g(disk) \ + container_of((disk)->private_data, struct ide_tape_obj, driver) static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) { @@ -4873,8 +4875,11 @@ static int idetape_attach (ide_drive_t *drive) kref_init(&tape->kref); tape->drive = drive; + tape->driver = &idetape_driver; tape->disk = g; + g->private_data = &tape->driver; + drive->driver_data = tape; down(&idetape_ref_sem); @@ -4894,7 +4899,6 @@ static int idetape_attach (ide_drive_t *drive) g->number = devfs_register_tape(drive->devfs_name); g->fops = &idetape_block_ops; - g->private_data = tape; ide_register_region(g); return 0; diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 246a1a1bd46577..d04f62ab5de199 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -354,8 +354,12 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq, break; } - if (sectors > 0) - drive->driver->end_request(drive, 1, sectors); + if (sectors > 0) { + ide_driver_t *drv; + + drv = *(ide_driver_t **)rq->rq_disk->private_data; + drv->end_request(drive, 1, sectors); + } } return ide_error(drive, s, stat); } @@ -371,7 +375,8 @@ static void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat) return; } } - drive->driver->end_request(drive, 1, rq->hard_nr_sectors); + + ide_end_request(drive, 1, rq->hard_nr_sectors); } /* diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 3087a565e6bbc4..482a90d2053bb4 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -1408,6 +1408,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device unsigned int cmd, unsigned long arg) { ide_settings_t *setting; + ide_driver_t *drv; int err = 0; void __user *p = (void __user *)arg; @@ -1507,7 +1508,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device if (arg != (arg & ((1 << IDE_NICE_DSC_OVERLAP) | (1 << IDE_NICE_1)))) return -EPERM; drive->dsc_overlap = (arg >> IDE_NICE_DSC_OVERLAP) & 1; - if (drive->dsc_overlap && !DRIVER(drive)->supports_dsc_overlap) { + drv = *(ide_driver_t **)bdev->bd_disk->private_data; + if (drive->dsc_overlap && !drv->supports_dsc_overlap) { drive->dsc_overlap = 0; return -EPERM; } diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 2fa6834a911b19..2e2486b035dd95 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c @@ -98,6 +98,7 @@ typedef struct idescsi_pc_s { typedef struct ide_scsi_obj { ide_drive_t *drive; + ide_driver_t *driver; struct gendisk *disk; struct Scsi_Host *host; @@ -109,7 +110,8 @@ typedef struct ide_scsi_obj { static DECLARE_MUTEX(idescsi_ref_sem); -#define ide_scsi_g(disk) ((disk)->private_data) +#define ide_scsi_g(disk) \ + container_of((disk)->private_data, struct ide_scsi_obj, driver) static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk) { @@ -328,6 +330,8 @@ static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_co return ide_do_drive_cmd(drive, rq, ide_preempt); } +static int idescsi_end_request(ide_drive_t *, int, int); + static ide_startstop_t idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) { @@ -336,7 +340,9 @@ idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err) HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG); rq->errors++; - DRIVER(drive)->end_request(drive, 0, 0); + + idescsi_end_request(drive, 0, 0); + return ide_stopped; } @@ -348,7 +354,9 @@ idescsi_atapi_abort(ide_drive_t *drive, struct request *rq) ((idescsi_pc_t *) rq->special)->scsi_cmd->serial_number); #endif rq->errors |= ERROR_MAX; - DRIVER(drive)->end_request(drive, 0, 0); + + idescsi_end_request(drive, 0, 0); + return ide_stopped; } @@ -1126,13 +1134,14 @@ static int idescsi_attach(ide_drive_t *drive) 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; err = ide_register_subdriver(drive, &idescsi_driver); if (!err) { idescsi_setup (drive, idescsi); g->fops = &idescsi_ops; - g->private_data = idescsi; ide_register_region(g); err = scsi_add_host(host, &drive->gendev); if (!err) { |