fix race condition of the CCACHE flag by clearing the flag in
attachimage() instead of temporarily reseting in pio().
This commit is contained in:
parent
75e1ef0ab6
commit
577d31ab13
2 changed files with 2 additions and 5 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue