From: Tejun Heo <htejun@gmail.com>
To: jgarzik@pobox.com, alan@lxorguk.ukuu.org.uk, albertcc@tw.ibm.com,
linux-ide@vger.kernel.org
Cc: Tejun Heo <htejun@gmail.com>
Subject: [PATCH 02/13] libata: implement ata_ering
Date: Mon, 3 Apr 2006 12:44:38 +0900 [thread overview]
Message-ID: <11440358783417-git-send-email-htejun@gmail.com> (raw)
In-Reply-To: <11440358783861-git-send-email-htejun@gmail.com>
ata_ering is a ring buffer which records libata errors - whether a
command was for normar IO request, err_mask and timestamp. This will
be used by EH to determine recovery actions.
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/scsi/libata-eh.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
drivers/scsi/libata.h | 1 +
include/linux/libata.h | 16 ++++++++++++++
3 files changed, 68 insertions(+), 0 deletions(-)
b92a795c5b84f3840388da95e2d4675d976c9e66
diff --git a/drivers/scsi/libata-eh.c b/drivers/scsi/libata-eh.c
index dfbb8c4..b5825b7 100644
--- a/drivers/scsi/libata-eh.c
+++ b/drivers/scsi/libata-eh.c
@@ -44,6 +44,57 @@
#include "libata.h"
+void ata_ering_init(struct ata_ering *ering, int size)
+{
+ memset(ering, 0, sizeof(*ering) + sizeof(ering->ring[0]) * size);
+ ering->size = size;
+}
+
+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 %= 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 + ering->size) % ering->size;
+ } while (idx != ering->cursor);
+
+ return rc;
+}
+
/**
* ata_scsi_timed_out - SCSI layer time out callback
* @cmd: timed out SCSI command
diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h
index 826010c..97eeacb 100644
--- a/drivers/scsi/libata.h
+++ b/drivers/scsi/libata.h
@@ -105,6 +105,7 @@ extern void ata_scsi_rbuf_fill(struct at
u8 *rbuf, unsigned int buflen));
/* libata-eh.c */
+extern void ata_ering_init(struct ata_ering *ering, int size);
extern enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd);
extern void ata_eh_schedule_qc(struct ata_queued_cmd *qc);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 19d3ecc..e4480f2 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -371,6 +371,22 @@ 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;
+ int size;
+ struct ata_ering_entry ring[];
+};
+
+#define DEFINE_ATA_ERING(name, size) \
+ struct ata_ering name; \
+ struct ata_ering_entry name_entries[size];
+
struct ata_device {
u64 n_sectors; /* size of device, if ATA */
unsigned long flags; /* ATA_DFLAG_xxx */
--
1.2.4
next prev parent reply other threads:[~2006-04-03 3:44 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-03 3:44 [PATCHSET] new EH implementation Tejun Heo
2006-04-03 3:44 ` [PATCH 04/13] libata: implement EH utility functions Tejun Heo
2006-04-03 3:44 ` Tejun Heo [this message]
2006-04-03 3:44 ` [PATCH 01/13] libata: add constants and flags to be used by EH Tejun Heo
2006-04-03 3:44 ` [PATCH 05/13] libata: implement ata_eh_determine_qc() Tejun Heo
2006-04-03 3:44 ` [PATCH 03/13] libata: add per-dev ata_ering Tejun Heo
2006-04-03 3:44 ` [PATCH 09/13] libata: implement ata_eh_finish_qcs() Tejun Heo
2006-04-03 3:44 ` [PATCH 10/13] libata: implement EH methods for BMDMA controllers Tejun Heo
2006-04-03 3:44 ` [PATCH 12/13] sata_sil: convert to new EH Tejun Heo
2006-04-03 3:44 ` [PATCH 08/13] libata: implement ata_eh_revive() Tejun Heo
2006-04-03 7:42 ` Tejun Heo
2006-04-03 3:44 ` [PATCH 06/13] libata: implement ata_eh_autopsy() Tejun Heo
2006-04-03 3:44 ` [PATCH 13/13] ahci: convert to new EH Tejun Heo
2006-04-03 3:44 ` [PATCH 11/13] ata_piix: " Tejun Heo
2006-04-03 3:44 ` [PATCH 07/13] libata: implement ata_eh_report() Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11440358783417-git-send-email-htejun@gmail.com \
--to=htejun@gmail.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=albertcc@tw.ibm.com \
--cc=jgarzik@pobox.com \
--cc=linux-ide@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.