Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29474
b: refs/heads/master
c: c6cf9e9
h: refs/heads/master
v: v3
  • Loading branch information
Tejun Heo committed May 31, 2006
1 parent 090c7be commit 98ff6da
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7395acb2c840fd4d0cacc91d6fb71440057141ab
refs/heads/master: c6cf9e99d1de5ca6a08fb639bb73031ffe50d802
1 change: 1 addition & 0 deletions trunk/drivers/scsi/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -5189,6 +5189,7 @@ static void ata_host_init(struct ata_port *ap, struct Scsi_Host *host,

INIT_WORK(&ap->port_task, NULL, NULL);
INIT_LIST_HEAD(&ap->eh_done_q);
init_waitqueue_head(&ap->eh_wait_q);

/* set cable type */
ap->cbl = ATA_CBL_NONE;
Expand Down
38 changes: 38 additions & 0 deletions trunk/drivers/scsi/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ void ata_scsi_error(struct Scsi_Host *host)
ap->eh_context.i = ap->eh_info;
memset(&ap->eh_info, 0, sizeof(ap->eh_info));

ap->flags |= ATA_FLAG_EH_IN_PROGRESS;
ap->flags &= ~ATA_FLAG_EH_PENDING;

spin_unlock_irqrestore(hs_lock, flags);
Expand Down Expand Up @@ -290,11 +291,48 @@ void ata_scsi_error(struct Scsi_Host *host)
ata_port_printk(ap, KERN_INFO, "EH complete\n");
ap->flags &= ~ATA_FLAG_RECOVERED;

/* tell wait_eh that we're done */
ap->flags &= ~ATA_FLAG_EH_IN_PROGRESS;
wake_up_all(&ap->eh_wait_q);

spin_unlock_irqrestore(hs_lock, flags);

DPRINTK("EXIT\n");
}

/**
* ata_port_wait_eh - Wait for the currently pending EH to complete
* @ap: Port to wait EH for
*
* Wait until the currently pending EH is complete.
*
* LOCKING:
* Kernel thread context (may sleep).
*/
void ata_port_wait_eh(struct ata_port *ap)
{
unsigned long flags;
DEFINE_WAIT(wait);

retry:
spin_lock_irqsave(&ap->host_set->lock, flags);

while (ap->flags & (ATA_FLAG_EH_PENDING | ATA_FLAG_EH_IN_PROGRESS)) {
prepare_to_wait(&ap->eh_wait_q, &wait, TASK_UNINTERRUPTIBLE);
spin_unlock_irqrestore(&ap->host_set->lock, flags);
schedule();
spin_lock_irqsave(&ap->host_set->lock, flags);
}

spin_unlock_irqrestore(&ap->host_set->lock, flags);

/* make sure SCSI EH is complete */
if (scsi_host_in_recovery(ap->host)) {
msleep(10);
goto retry;
}
}

/**
* ata_qc_timeout - Handle timeout of queued command
* @qc: Command that timed out
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/scsi/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ extern void ata_schedule_scsi_eh(struct Scsi_Host *shost);
/* libata-eh.c */
extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
extern void ata_scsi_error(struct Scsi_Host *host);
extern void ata_port_wait_eh(struct ata_port *ap);
extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);

#endif /* __LIBATA_H__ */
2 changes: 2 additions & 0 deletions trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ enum {
ATA_FLAG_FLUSH_PORT_TASK = (1 << 14), /* flush port task */

ATA_FLAG_EH_PENDING = (1 << 15), /* EH pending */
ATA_FLAG_EH_IN_PROGRESS = (1 << 16), /* EH in progress */
ATA_FLAG_FROZEN = (1 << 17), /* port is frozen */
ATA_FLAG_RECOVERED = (1 << 18), /* recovery action performed */

Expand Down Expand Up @@ -490,6 +491,7 @@ struct ata_port {

u32 msg_enable;
struct list_head eh_done_q;
wait_queue_head_t eh_wait_q;

void *private_data;

Expand Down

0 comments on commit 98ff6da

Please sign in to comment.