|
@@ -82,7 +82,6 @@ typedef struct ide_scsi_obj {
|
|
|
struct gendisk *disk;
|
|
|
struct Scsi_Host *host;
|
|
|
|
|
|
- struct ide_atapi_pc *pc; /* Current packet command */
|
|
|
unsigned long transform; /* SCSI cmd translation layer */
|
|
|
unsigned long log; /* log flags */
|
|
|
} idescsi_scsi_t;
|
|
@@ -140,7 +139,7 @@ static int idescsi_end_request(ide_drive_t *, int, int);
|
|
|
static void ide_scsi_callback(ide_drive_t *drive, int dsc)
|
|
|
{
|
|
|
idescsi_scsi_t *scsi = drive_to_idescsi(drive);
|
|
|
- struct ide_atapi_pc *pc = scsi->pc;
|
|
|
+ struct ide_atapi_pc *pc = drive->pc;
|
|
|
|
|
|
if (pc->flags & PC_FLAG_TIMEDOUT)
|
|
|
debug_log("%s: got timed out packet %lu at %lu\n", __func__,
|
|
@@ -267,7 +266,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs)
|
|
|
spin_unlock_irqrestore(host->host_lock, flags);
|
|
|
kfree(pc);
|
|
|
blk_put_request(rq);
|
|
|
- scsi->pc = NULL;
|
|
|
+ drive->pc = NULL;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -278,8 +277,7 @@ static inline unsigned long get_timeout(struct ide_atapi_pc *pc)
|
|
|
|
|
|
static int idescsi_expiry(ide_drive_t *drive)
|
|
|
{
|
|
|
- idescsi_scsi_t *scsi = drive_to_idescsi(drive);
|
|
|
- struct ide_atapi_pc *pc = scsi->pc;
|
|
|
+ struct ide_atapi_pc *pc = drive->pc;
|
|
|
|
|
|
debug_log("%s called for %lu at %lu\n", __func__,
|
|
|
pc->scsi_cmd->serial_number, jiffies);
|
|
@@ -294,19 +292,14 @@ static int idescsi_expiry(ide_drive_t *drive)
|
|
|
*/
|
|
|
static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
|
|
|
{
|
|
|
- idescsi_scsi_t *scsi = drive_to_idescsi(drive);
|
|
|
- struct ide_atapi_pc *pc = scsi->pc;
|
|
|
-
|
|
|
- return ide_pc_intr(drive, pc, idescsi_pc_intr, get_timeout(pc),
|
|
|
+ return ide_pc_intr(drive, idescsi_pc_intr, get_timeout(drive->pc),
|
|
|
idescsi_expiry, NULL, NULL, ide_io_buffers);
|
|
|
}
|
|
|
|
|
|
static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
|
|
|
{
|
|
|
- idescsi_scsi_t *scsi = drive_to_idescsi(drive);
|
|
|
-
|
|
|
- return ide_transfer_pc(drive, scsi->pc, idescsi_pc_intr,
|
|
|
- get_timeout(scsi->pc), idescsi_expiry);
|
|
|
+ return ide_transfer_pc(drive, idescsi_pc_intr,
|
|
|
+ get_timeout(drive->pc), idescsi_expiry);
|
|
|
}
|
|
|
|
|
|
static inline int idescsi_set_direction(struct ide_atapi_pc *pc)
|
|
@@ -351,12 +344,10 @@ static int idescsi_map_sg(ide_drive_t *drive, struct ide_atapi_pc *pc)
|
|
|
static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive,
|
|
|
struct ide_atapi_pc *pc)
|
|
|
{
|
|
|
- idescsi_scsi_t *scsi = drive_to_idescsi(drive);
|
|
|
-
|
|
|
/* Set the current packet command */
|
|
|
- scsi->pc = pc;
|
|
|
+ drive->pc = pc;
|
|
|
|
|
|
- return ide_issue_pc(drive, pc, idescsi_transfer_pc,
|
|
|
+ return ide_issue_pc(drive, idescsi_transfer_pc,
|
|
|
get_timeout(pc), idescsi_expiry);
|
|
|
}
|
|
|
|
|
@@ -621,6 +612,8 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd)
|
|
|
int busy;
|
|
|
int ret = FAILED;
|
|
|
|
|
|
+ struct ide_atapi_pc *pc;
|
|
|
+
|
|
|
/* In idescsi_eh_abort we try to gently pry our command from the ide subsystem */
|
|
|
|
|
|
if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
|
|
@@ -641,26 +634,27 @@ static int idescsi_eh_abort (struct scsi_cmnd *cmd)
|
|
|
spin_lock_irq(&ide_lock);
|
|
|
|
|
|
/* If there is no pc running we're done (our interrupt took care of it) */
|
|
|
- if (!scsi->pc) {
|
|
|
+ pc = drive->pc;
|
|
|
+ if (pc == NULL) {
|
|
|
ret = SUCCESS;
|
|
|
goto ide_unlock;
|
|
|
}
|
|
|
|
|
|
/* It's somewhere in flight. Does ide subsystem agree? */
|
|
|
- if (scsi->pc->scsi_cmd->serial_number == cmd->serial_number && !busy &&
|
|
|
- elv_queue_empty(drive->queue) && HWGROUP(drive)->rq != scsi->pc->rq) {
|
|
|
+ if (pc->scsi_cmd->serial_number == cmd->serial_number && !busy &&
|
|
|
+ elv_queue_empty(drive->queue) && HWGROUP(drive)->rq != pc->rq) {
|
|
|
/*
|
|
|
* FIXME - not sure this condition can ever occur
|
|
|
*/
|
|
|
printk (KERN_ERR "ide-scsi: cmd aborted!\n");
|
|
|
|
|
|
- if (blk_sense_request(scsi->pc->rq))
|
|
|
- kfree(scsi->pc->buf);
|
|
|
+ if (blk_sense_request(pc->rq))
|
|
|
+ kfree(pc->buf);
|
|
|
/* we need to call blk_put_request twice. */
|
|
|
- blk_put_request(scsi->pc->rq);
|
|
|
- blk_put_request(scsi->pc->rq);
|
|
|
- kfree(scsi->pc);
|
|
|
- scsi->pc = NULL;
|
|
|
+ blk_put_request(pc->rq);
|
|
|
+ blk_put_request(pc->rq);
|
|
|
+ kfree(pc);
|
|
|
+ drive->pc = NULL;
|
|
|
|
|
|
ret = SUCCESS;
|
|
|
}
|
|
@@ -682,6 +676,8 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|
|
int ready = 0;
|
|
|
int ret = SUCCESS;
|
|
|
|
|
|
+ struct ide_atapi_pc *pc;
|
|
|
+
|
|
|
/* In idescsi_eh_reset we forcefully remove the command from the ide subsystem and reset the device. */
|
|
|
|
|
|
if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
|
|
@@ -696,7 +692,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|
|
spin_lock_irq(cmd->device->host->host_lock);
|
|
|
spin_lock(&ide_lock);
|
|
|
|
|
|
- if (!scsi->pc || (req = scsi->pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
|
|
|
+ pc = drive->pc;
|
|
|
+
|
|
|
+ if (pc == NULL || (req = pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
|
|
|
printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n");
|
|
|
spin_unlock(&ide_lock);
|
|
|
spin_unlock_irq(cmd->device->host->host_lock);
|
|
@@ -707,9 +705,9 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|
|
if (__blk_end_request(req, -EIO, 0))
|
|
|
BUG();
|
|
|
if (blk_sense_request(req))
|
|
|
- kfree(scsi->pc->buf);
|
|
|
- kfree(scsi->pc);
|
|
|
- scsi->pc = NULL;
|
|
|
+ kfree(pc->buf);
|
|
|
+ kfree(pc);
|
|
|
+ drive->pc = NULL;
|
|
|
blk_put_request(req);
|
|
|
|
|
|
/* now nuke the drive queue */
|