aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@trik.(none)>2005-04-02 20:00:50 +0200
committerBartlomiej Zolnierkiewicz <bzolnier@trik.(none)>2005-04-02 20:00:50 +0200
commit5cc8d0f5a3e5d9f133cea67c3194cbdc046983ec (patch)
tree80df98ee68c38cbd563d8b89506b08f7f93381a3
parentdbb3dc01862b4121a09a4624d820bbe2e1cc24a0 (diff)
downloadhistory-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.c7
-rw-r--r--drivers/ide/ide-cd.h1
-rw-r--r--drivers/ide/ide-disk.c8
-rw-r--r--drivers/ide/ide-dma.c8
-rw-r--r--drivers/ide/ide-floppy.c8
-rw-r--r--drivers/ide/ide-io.c44
-rw-r--r--drivers/ide/ide-tape.c8
-rw-r--r--drivers/ide/ide-taskfile.c11
-rw-r--r--drivers/ide/ide.c4
-rw-r--r--drivers/scsi/ide-scsi.c17
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) {