patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / scsi / ide-scsi.c
index 00a4d60..9b110a8 100644 (file)
@@ -318,6 +318,13 @@ ide_startstop_t idescsi_atapi_error (ide_drive_t *drive, const char *msg, byte s
        if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
                return ide_stopped;
 
+       /* retry only "normal" I/O: */
+       if (rq->flags & (REQ_DRIVE_CMD | REQ_DRIVE_TASK | REQ_DRIVE_TASKFILE)) {
+               rq->errors = 1;
+               ide_end_drive_cmd(drive, stat, err);
+               return ide_stopped;
+       }
+
        if (HWIF(drive)->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT))
                /* force an abort */
                HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG);
@@ -334,6 +341,13 @@ ide_startstop_t idescsi_atapi_abort (ide_drive_t *drive, const char *msg)
        if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
               return ide_stopped;
 
+       /* retry only "normal" I/O: */
+       if (rq->flags & (REQ_DRIVE_CMD | REQ_DRIVE_TASK | REQ_DRIVE_TASKFILE)) {
+               rq->errors = 1;
+               ide_end_drive_cmd(drive, BUSY_STAT, 0);
+               return ide_stopped;
+       }
+
 #if IDESCSI_DEBUG_LOG
        printk(KERN_WARNING "idescsi_atapi_abort called for %lu\n",
                        ((idescsi_pc_t *) rq->special)->scsi_cmd->serial_number);
@@ -745,7 +759,7 @@ static const char *idescsi_info (struct Scsi_Host *host)
        return "SCSI host adapter emulation for IDE ATAPI devices";
 }
 
-static int idescsi_ioctl (Scsi_Device *dev, int cmd, void *arg)
+static int idescsi_ioctl (Scsi_Device *dev, int cmd, void __user *arg)
 {
        idescsi_scsi_t *scsi = scsihost_to_idescsi(dev->host);
 
@@ -756,7 +770,7 @@ static int idescsi_ioctl (Scsi_Device *dev, int cmd, void *arg)
                        clear_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
                return 0;
        } else if (cmd == SG_GET_TRANSFORM)
-               return put_user(test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform), (int *) arg);
+               return put_user(test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform), (int __user *) arg);
        return -EINVAL;
 }