Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ata - remove big buffers on stack. discussed on tech...
details: https://anonhg.NetBSD.org/src/rev/8c0ef6d4938c
branches: trunk
changeset: 533366:8c0ef6d4938c
user: yamt <yamt%NetBSD.org@localhost>
date: Fri Jun 28 16:40:50 2002 +0000
description:
- remove big buffers on stack. discussed on tech-kern.
- constify.
diffstat:
sys/dev/ata/wd.c | 65 +++++++++++++++++++++++++++++++++++--------------------
1 files changed, 41 insertions(+), 24 deletions(-)
diffs (173 lines):
diff -r ed5728c9d623 -r 8c0ef6d4938c sys/dev/ata/wd.c
--- a/sys/dev/ata/wd.c Fri Jun 28 16:37:20 2002 +0000
+++ b/sys/dev/ata/wd.c Fri Jun 28 16:40:50 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wd.c,v 1.220 2002/01/13 17:24:30 christos Exp $ */
+/* $NetBSD: wd.c,v 1.221 2002/06/28 16:40:50 yamt Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.220 2002/01/13 17:24:30 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.221 2002/06/28 16:40:50 yamt Exp $");
#ifndef WDCDEBUG
#define WDCDEBUG
@@ -181,7 +181,7 @@
int wddetach __P((struct device *, int));
int wdactivate __P((struct device *, enum devact));
int wdprint __P((void *, char *));
-void wdperror __P((struct ata_drive_datas *, int, char *));
+void wdperror __P((const struct wd_softc *));
struct cfattach wd_ca = {
sizeof(struct wd_softc), wdprobe, wdattach, wddetach, wdactivate
@@ -589,36 +589,41 @@
{
struct wd_softc *wd = v;
struct buf *bp = wd->sc_bp;
- char buf[256], *errbuf = buf;
+ const char *errmsg;
+ int do_perror = 0;
WDCDEBUG_PRINT(("wddone %s\n", wd->sc_dev.dv_xname),
DEBUG_XFERS);
if (bp == NULL)
return;
bp->b_resid = wd->sc_wdc_bio.bcount;
- errbuf[0] = '\0';
switch (wd->sc_wdc_bio.error) {
case ERR_DMA:
- errbuf = "DMA error";
+ errmsg = "DMA error";
goto retry;
case ERR_DF:
- errbuf = "device fault";
+ errmsg = "device fault";
goto retry;
case TIMEOUT:
- errbuf = "device timeout";
+ errmsg = "device timeout";
goto retry;
case ERROR:
/* Don't care about media change bits */
if (wd->sc_wdc_bio.r_error != 0 &&
(wd->sc_wdc_bio.r_error & ~(WDCE_MC | WDCE_MCR)) == 0)
goto noerror;
- wdperror(wd->drvp, wd->sc_wdc_bio.r_error, errbuf);
+ errmsg = "error";
+ do_perror = 1;
retry: /* Just reset and retry. Can we do more ? */
wd->atabus->ata_reset_channel(wd->drvp);
- diskerr(bp, "wd", errbuf, LOG_PRINTF,
+ diskerr(bp, "wd", errmsg, LOG_PRINTF,
wd->sc_wdc_bio.blkdone, wd->sc_dk.dk_label);
- if (wd->retries++ < WDIORETRIES) {
+ if (wd->retries < WDIORETRIES)
printf(", retrying\n");
+ if (do_perror)
+ wdperror(wd);
+ if (wd->retries < WDIORETRIES) {
+ wd->retries++;
callout_reset(&wd->sc_restart_ch, RECOVERYTIME,
wdrestart, wd);
return;
@@ -938,37 +943,43 @@
}
void
-wdperror(drvp, errno, buf)
- struct ata_drive_datas *drvp;
- int errno;
- char *buf;
+wdperror(wd)
+ const struct wd_softc *wd;
{
- static char *errstr0_3[] = {"address mark not found",
+ static const char *const errstr0_3[] = {"address mark not found",
"track 0 not found", "aborted command", "media change requested",
"id not found", "media changed", "uncorrectable data error",
"bad block detected"};
- static char *errstr4_5[] = {"obsolete (address mark not found)",
+ static const char *const errstr4_5[] = {
+ "obsolete (address mark not found)",
"no media/write protected", "aborted command",
"media change requested", "id not found", "media changed",
"uncorrectable data error", "interface CRC error"};
- char **errstr;
+ const char *const *errstr;
int i;
char *sep = "";
+ const char *devname = wd->sc_dev.dv_xname;
+ struct ata_drive_datas *drvp = wd->drvp;
+ int errno = wd->sc_wdc_bio.r_error;
+
if (drvp->ata_vers >= 4)
errstr = errstr4_5;
else
errstr = errstr0_3;
+ printf("%s: (", devname);
+
if (errno == 0)
- sprintf(buf, "error not notified");
+ printf("error not notified");
for (i = 0; i < 8; i++) {
if (errno & (1 << i)) {
- buf += sprintf(buf, "%s%s", sep, errstr[i]);
+ printf("%s%s", sep, errstr[i]);
sep = ", ";
}
}
+ printf(")\n");
}
int
@@ -1235,7 +1246,6 @@
struct disklabel *lp; /* disk's disklabel */
int part, err;
int nblks; /* total number of sectors left to write */
- char errbuf[256];
/* Check if recursive dump; if so, punt. */
if (wddoingadump)
@@ -1274,7 +1284,9 @@
}
while (nblks > 0) {
+ int do_perror;
again:
+ do_perror = 0;
wd->sc_bp = NULL;
wd->sc_wdc_bio.blkno = blkno;
wd->sc_wdc_bio.flags = ATA_POLL;
@@ -1312,9 +1324,8 @@
err = EIO;
break;
case ERROR:
- errbuf[0] = '\0';
- wdperror(wd->drvp, wd->sc_wdc_bio.r_error, errbuf);
- printf("wddump: %s", errbuf);
+ printf("wddump: ");
+ do_perror = 1;
err = EIO;
break;
case NOERROR:
@@ -1327,6 +1338,12 @@
if (wddumpmulti != 1) {
wddumpmulti = 1; /* retry in single-sector */
printf(", retrying\n");
+ }
+ if (do_perror) {
+ printf("wddump: ");
+ wdperror(wd);
+ }
+ if (wddumpmulti != 1) {
goto again;
}
printf("\n");
Home |
Main Index |
Thread Index |
Old Index