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
--
⑨