fix race condition of the CCACHE flag by clearing the flag in

attachimage() instead of temporarily reseting in pio().
This commit is contained in:
cinap_lenrek 2012-01-12 12:54:45 +01:00
parent 75e1ef0ab6
commit 577d31ab13
2 changed files with 2 additions and 5 deletions

View file

@ -200,7 +200,7 @@ pio(Segment *s, ulong addr, ulong soff, Page **p)
Page *new; Page *new;
KMap *k; KMap *k;
Chan *c; Chan *c;
int n, ask, cache; int n, ask;
char *kaddr; char *kaddr;
ulong daddr; ulong daddr;
Page *loadrec; Page *loadrec;
@ -238,18 +238,14 @@ retry:
k = kmap(new); k = kmap(new);
kaddr = (char*)VA(k); kaddr = (char*)VA(k);
cache = c->flag & CCACHE;
while(waserror()) { while(waserror()) {
c->flag |= cache;
if(strcmp(up->errstr, Eintr) == 0) if(strcmp(up->errstr, Eintr) == 0)
continue; continue;
kunmap(k); kunmap(k);
putpage(new); putpage(new);
faulterror(Eioload, c, 0); faulterror(Eioload, c, 0);
} }
c->flag &= ~CCACHE;
n = devtab[c->type]->read(c, kaddr, ask, daddr); n = devtab[c->type]->read(c, kaddr, ask, daddr);
c->flag |= cache;
if(n != ask) if(n != ask)
faulterror(Eioload, c, 0); faulterror(Eioload, c, 0);
if(ask < BY2PG) if(ask < BY2PG)

View file

@ -287,6 +287,7 @@ attachimage(int type, Chan *c, ulong base, ulong len)
lock(i); lock(i);
incref(c); incref(c);
c->flag &= ~CCACHE;
i->c = c; i->c = c;
i->type = c->type; i->type = c->type;
i->qid = c->qid; i->qid = c->qid;