git: 9front

Download patch

ref: bc7d74f09b53c39ada4e73ce73c01c6c0928f9f4
parent: 41d6036032943035e75a54ffa6b079ba2175c75d
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Aug 7 03:08:33 EDT 2012

floppy: fix endless loop when trying to change floppy type on media change

--- a/sys/src/9/pc/devfloppy.c
+++ b/sys/src/9/pc/devfloppy.c
@@ -134,6 +134,8 @@
 	CMreset,	"reset",	1,
 };
 
+static	char	Echange[]	= "media or partition has changed";
+
 static void
 fldump(void)
 {
@@ -149,12 +151,14 @@
 {
 	FType *t;
 
+	dp->t = floppytype;
 	for(t = floppytype; t < &floppytype[nelem(floppytype)]; t++)
 		if(dp->dt == t->dt){
 			dp->t = t;
-			floppydir[1+NFDIR*dp->dev].length = dp->t->cap;
 			break;
 		}
+	floppydir[1+NFDIR*dp->dev].length = dp->t->cap;
+	dp->dt = dp->t->dt;
 }
 
 static void
@@ -323,9 +327,9 @@
 				nexterror();
 
 			while(++dp->t){
-				if(dp->t == &floppytype[nelem(floppytype)])
+				if(dp->t >= &floppytype[nelem(floppytype)])
 					dp->t = floppytype;
-				if(dp->dt == dp->t->dt)
+				if(dp->t == start || dp->dt == dp->t->dt)
 					break;
 			}
 			floppydir[1+NFDIR*dp->dev].length = dp->t->cap;
@@ -332,12 +336,12 @@
 
 			/* floppyon will fail if there's a controller but no drive */
 			if(floppyon(dp) < 0)
-				error(Eio);
+				nexterror();
+			if(dp->t == start)
+				nexterror();
 
 			DPRINT("changed: trying %s\n", dp->t->name);
 			fldump();
-			if(dp->t == start)
-				nexterror();
 		}
 
 		/* if the read succeeds, we've got the density right */
@@ -349,7 +353,7 @@
 	old = c->qid.vers;
 	c->qid.vers = dp->vers;
 	if(old && old != dp->vers)
-		error(Eio);
+		error(Echange);
 }
 
 static int
--