Browse Source

Plan 9 from Bell Labs 2012-10-03

David du Colombier 11 years ago
parent
commit
818d150792
5 changed files with 60 additions and 34 deletions
  1. 3 1
      sys/lib/backup/backuparenas
  2. 23 3
      sys/src/9/pc/sdiahci.c
  3. 15 15
      sys/src/9/pc/x86watchdog.c
  4. 17 12
      sys/src/9/port/devwd.c
  5. 2 3
      sys/src/liblex/allprint.c

+ 3 - 1
sys/lib/backup/backuparenas

@@ -26,8 +26,10 @@ if (! ~ $ok [Yy]*)
 cd $fsroot/dev/fs
 for (name) {
 	grep next /mnt/cd/ctl
+	# use -o 8192 to avoid devmnt fragmentation if bd drive is imported
 	venti/rdarena arena0 $name |
-		pump -i 65536 -o 1048576 -k 51200 -d 10 >/mnt/cd/wd/$name
+		pump -i 65536 -o 8192 -k 100000 -d 5 >/mnt/cd/wd/$name
+#		pump -i 65536 -o 1048576 -k 51200 -d 10 >/mnt/cd/wd/$name
 	quitonfailure $status
 
 #	ls -l /mnt/cd

+ 23 - 3
sys/src/9/pc/sdiahci.c

@@ -1613,7 +1613,7 @@ flushcache(Drive *d)
 static int
 iariopkt(SDreq *r, Drive *d)
 {
-	int n, count, try, max, flag, task;
+	int n, count, try, max, flag, task, wormwrite;
 	char *name;
 	uchar *cmd, *data;
 	Aport *p;
@@ -1682,8 +1682,28 @@ retry:
 			r->status = SDcheck;
 			return SDcheck;
 		}
-		print("%s: retry\n", name);
-		goto retry;
+		/*
+		 * write retries cannot succeed on write-once media,
+		 * so just accept any failure.
+		 */
+		wormwrite = 0;
+		switch(d->unit->inquiry[0] & SDinq0periphtype){
+		case SDperworm:
+		case SDpercd:
+			switch(cmd[0]){
+			case 0x0a:		/* write (6?) */
+			case 0x2a:		/* write (10) */
+			case 0x8a:		/* long write (16) */
+			case 0x2e:		/* write and verify (10) */
+				wormwrite = 1;
+				break;
+			}
+			break;
+		}
+		if (!wormwrite) {
+			print("%s: retry\n", name);
+			goto retry;
+		}
 	}
 	if(flag & Ferror){
 		if((task&Eidnf) == 0)

+ 15 - 15
sys/src/9/pc/x86watchdog.c

@@ -68,12 +68,12 @@ x86wdenable(void)
 	u32int evntsel;
 
 	wd = &x86wd;
-	lock(wd);
+	ilock(wd);
 	if(wd->inuse){
-		unlock(wd);
+		iunlock(wd);
 		error(Einuse);
 	}
-	unlock(wd);
+	iunlock(wd);
 
 	/*
 	 * keep this process on cpu 0 so we always see the same timers
@@ -102,9 +102,9 @@ x86wdenable(void)
 	    (m->cpuiddx & (Cpuapic|Cpumsr|Tsc)) != (Cpuapic|Cpumsr|Tsc))
 		error(Enodev);
 
-	lock(wd);
+	ilock(wd);
 	if(wd->inuse){
-		unlock(wd);
+		iunlock(wd);
 		error(Einuse);
 	}
 	wd->model = model;
@@ -178,7 +178,7 @@ x86wdenable(void)
 		wrmsr(0xC0010000, 0x00400000|evntsel);
 		break;
 	}
-	unlock(wd);
+	iunlock(wd);
 }
 
 static void
@@ -187,19 +187,19 @@ x86wddisable(void)
 	Wd *wd;
 
 	wd = &x86wd;
-	lock(wd);
+	ilock(wd);
 	if(!wd->inuse){
 		/*
 		 * Can't error, called at boot by addwatchdog().
 		 */
-		unlock(wd);
+		iunlock(wd);
 		return;
 	}
-	unlock(wd);
+	iunlock(wd);
 
 	runoncpu(0);
 
-	lock(wd);
+	ilock(wd);
 	lapicnmidisable();
 	switch(wd->model){
 	case P6:
@@ -215,7 +215,7 @@ x86wddisable(void)
 		break;
 	}
 	wd->inuse = 0;
-	unlock(wd);
+	iunlock(wd);
 }
 
 static void
@@ -228,7 +228,7 @@ x86wdrestart(void)
 	t = interval();
 
 	wd = &x86wd;
-	lock(wd);
+	ilock(wd);
 	switch(wd->model){
 	case P6:
 		wrmsr(0xC1, -t);
@@ -246,7 +246,7 @@ x86wdrestart(void)
 		break;
 	}
 	wd->ticks++;
-	unlock(wd);
+	iunlock(wd);
 }
 
 void
@@ -257,10 +257,10 @@ x86wdstat(char* p, char* ep)
 	uint ticks;
 
 	wd = &x86wd;
-	lock(wd);
+	ilock(wd);
 	inuse = wd->inuse;
 	ticks = wd->ticks;
-	unlock(wd);
+	iunlock(wd);
 
 	if(inuse)
 		seprint(p, ep, "enabled %ud restarts\n", ticks);

+ 17 - 12
sys/src/9/port/devwd.c

@@ -49,6 +49,16 @@ wdallowed(void)
 	return getconf("*nowatchdog") == nil;
 }
 
+static void
+wdshutdown(void)
+{
+	if (wd) {
+		wd->disable();
+		watchdogon = 0;
+	}
+}
+
+/* called from clock interrupt, so restart needs ilock internally */
 static void
 wdpet(void)
 {
@@ -75,14 +85,18 @@ wdautostart(void)
 	}
 }
 
+/*
+ * disable strokes from the clock interrupt.
+ * have to disable the watchdog to mark it `not in use'.
+ */
 static void
 wdautostop(void)
 {
 	if (!wdautopet)
 		return;
-	wdautopet = watchdogon = 0;
-	wd->disable();
-	iprint("watchdog: off\n");
+	wdautopet = 0;
+	wdshutdown();
+	iprint("watchdog: disabled before open\n");
 }
 
 static void
@@ -119,15 +133,6 @@ wdopen(Chan* c, int omode)
 	return c;
 }
 
-static void
-wdshutdown(void)
-{
-	if (wd) {
-		wd->disable();
-		watchdogon = 0;
-	}
-}
-
 static void
 wdclose(Chan *c)
 {

+ 2 - 3
sys/src/liblex/allprint.c

@@ -1,5 +1,4 @@
-#include	<u.h>
-#include	<libc.h>
+#include	"/sys/src/cmd/lex/ldefs.h"
 #include	<stdio.h>
 
 extern	FILE*	yyout;
@@ -11,7 +10,7 @@ printable(int c)
 }
 
 void
-allprint(char c)
+allprint(int c)
 {
 
 	switch(c) {