.remove                 = ide_cd_remove,
        .version                = IDECD_VERSION,
        .do_request             = ide_cd_do_request,
-       .end_request            = ide_end_request,
 #ifdef CONFIG_IDE_PROC_FS
        .proc_entries           = ide_cd_proc_entries,
        .proc_devsets           = ide_cd_proc_devsets,
 
        .init_media     = ide_disk_init_media,
        .set_doorlock   = ide_disk_set_doorlock,
        .do_request     = ide_do_rw_disk,
-       .end_request    = ide_end_request,
        .ioctl          = ide_disk_ioctl,
 };
 
  */
 #define IDEFLOPPY_PC_DELAY     (HZ/20) /* default delay for ZIP 100 (50ms) */
 
-/*
- * Used to finish servicing a private request.
- */
-static int ide_floppy_end_request(ide_drive_t *drive, int uptodate, int nsecs)
-{
-       struct request *rq = drive->hwif->rq;
-
-       ide_debug_log(IDE_DBG_FUNC, "enter");
-
-       if (uptodate == 0)
-               drive->failed_pc = NULL;
-
-       rq->errors = uptodate ? 0 : IDE_DRV_ERROR_GENERAL;
-
-       ide_complete_rq(drive, 0);
-
-       return 0;
-}
-
 static void idefloppy_update_buffers(ide_drive_t *drive,
                                struct ide_atapi_pc *pc)
 {
        .init_media     = ide_floppy_init_media,
        .set_doorlock   = ide_set_media_lock,
        .do_request     = ide_floppy_do_request,
-       .end_request    = ide_floppy_end_request,
        .ioctl          = ide_floppy_ioctl,
 };
 
        return drive->disk_ops->do_request(drive, rq, sector);
 }
 
-static int ide_gd_end_request(ide_drive_t *drive, int uptodate, int nrsecs)
-{
-       return drive->disk_ops->end_request(drive, uptodate, nrsecs);
-}
-
 static struct ide_driver ide_gd_driver = {
        .gen_driver = {
                .owner          = THIS_MODULE,
        .shutdown               = ide_gd_shutdown,
        .version                = IDE_GD_VERSION,
        .do_request             = ide_gd_do_request,
-       .end_request            = ide_gd_end_request,
 #ifdef CONFIG_IDE_PROC_FS
        .proc_entries           = ide_disk_proc_entries,
        .proc_devsets           = ide_disk_proc_devsets,
 
 
 void ide_kill_rq(ide_drive_t *drive, struct request *rq)
 {
+       u8 drv_req = blk_special_request(rq) && rq->rq_disk;
+       u8 media = drive->media;
+
        drive->failed_pc = NULL;
 
-       if (drive->media == ide_tape)
+       if ((media == ide_floppy && drv_req) || media == ide_tape)
                rq->errors = IDE_DRV_ERROR_GENERAL;
 
-       if (blk_special_request(rq) && rq->rq_disk) {
-               struct ide_driver *drv;
-
-               drv = *(struct ide_driver **)rq->rq_disk->private_data;
-               drv->end_request(drive, 0, 0);
-       } else
+       if ((media == ide_floppy || media == ide_tape) && drv_req)
+               ide_complete_rq(drive, 0);
+       else
                ide_end_request(drive, 0, 0);
 }
 
 
        }
 }
 
-static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
-{
-       struct request *rq = drive->hwif->rq;
-
-       debug_log(DBG_PROCS, "Enter %s\n", __func__);
-
-       rq->errors = uptodate ? 0 : IDE_DRV_ERROR_GENERAL;
-
-       if (uptodate == 0)
-               drive->failed_pc = NULL;
-
-       ide_complete_rq(drive, 0);
-
-       return 0;
-}
-
 static void ide_tape_handle_dsc(ide_drive_t *);
 
 static void ide_tape_callback(ide_drive_t *drive, int dsc)
        .remove                 = ide_tape_remove,
        .version                = IDETAPE_VERSION,
        .do_request             = idetape_do_request,
-       .end_request            = idetape_end_request,
 #ifdef CONFIG_IDE_PROC_FS
        .proc_entries           = ide_tape_proc_entries,
        .proc_devsets           = ide_tape_proc_devsets,
 
                                        int);
        ide_startstop_t (*do_request)(struct ide_drive_s *, struct request *,
                                      sector_t);
-       int             (*end_request)(struct ide_drive_s *, int, int);
        int             (*ioctl)(struct ide_drive_s *, struct block_device *,
                                 fmode_t, unsigned int, unsigned long);
 };
 struct ide_driver {
        const char                      *version;
        ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t);
-       int             (*end_request)(ide_drive_t *, int, int);
        struct device_driver    gen_driver;
        int             (*probe)(ide_drive_t *);
        void            (*remove)(ide_drive_t *);