Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 29311
b: refs/heads/master
c: 0c247c5
h: refs/heads/master
i:
  29309: 64adc48
  29307: f0153d5
  29303: 5467ae4
  29295: 6c06e0f
  29279: b8b5e90
  29247: cbd4c3d
  29183: abd2282
v: v3
  • Loading branch information
Tejun Heo committed May 15, 2006
1 parent 55528b8 commit cd7e93a
Show file tree
Hide file tree
Showing 3 changed files with 63 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: 9be1e979f2e1e57a091a658fa88dac266f9fd6fe
refs/heads/master: 0c247c559cd70f85ba9f0764ce13ae00e20fcad8
45 changes: 45 additions & 0 deletions trunk/drivers/scsi/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,51 @@

static void __ata_port_freeze(struct ata_port *ap);

static void ata_ering_record(struct ata_ering *ering, int is_io,
unsigned int err_mask)
{
struct ata_ering_entry *ent;

WARN_ON(!err_mask);

ering->cursor++;
ering->cursor %= ATA_ERING_SIZE;

ent = &ering->ring[ering->cursor];
ent->is_io = is_io;
ent->err_mask = err_mask;
ent->timestamp = get_jiffies_64();
}

static struct ata_ering_entry * ata_ering_top(struct ata_ering *ering)
{
struct ata_ering_entry *ent = &ering->ring[ering->cursor];
if (!ent->err_mask)
return NULL;
return ent;
}

static int ata_ering_map(struct ata_ering *ering,
int (*map_fn)(struct ata_ering_entry *, void *),
void *arg)
{
int idx, rc = 0;
struct ata_ering_entry *ent;

idx = ering->cursor;
do {
ent = &ering->ring[idx];
if (!ent->err_mask)
break;
rc = map_fn(ent, arg);
if (rc)
break;
idx = (idx - 1 + ATA_ERING_SIZE) % ATA_ERING_SIZE;
} while (idx != ering->cursor);

return rc;
}

/**
* ata_scsi_timed_out - SCSI layer time out callback
* @cmd: timed out SCSI command
Expand Down
17 changes: 17 additions & 0 deletions trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,9 @@ enum {
ATA_PORT_PRIMARY = (1 << 0),
ATA_PORT_SECONDARY = (1 << 1),

/* ering size */
ATA_ERING_SIZE = 32,

/* reset / recovery action types */
ATA_EH_REVALIDATE = (1 << 0),
ATA_EH_SOFTRESET = (1 << 1),
Expand Down Expand Up @@ -375,6 +378,17 @@ struct ata_host_stats {
unsigned long rw_reqbuf;
};

struct ata_ering_entry {
int is_io;
unsigned int err_mask;
u64 timestamp;
};

struct ata_ering {
int cursor;
struct ata_ering_entry ring[ATA_ERING_SIZE];
};

struct ata_device {
struct ata_port *ap;
u64 n_sectors; /* size of device, if ATA */
Expand All @@ -401,6 +415,9 @@ struct ata_device {
u16 cylinders; /* Number of cylinders */
u16 heads; /* Number of heads */
u16 sectors; /* Number of sectors per track */

/* error history */
struct ata_ering ering;
};

struct ata_port {
Expand Down

0 comments on commit cd7e93a

Please sign in to comment.