diff options
author | cinap_lenrek <cinap_lenrek@rei2> | 2012-01-12 12:54:45 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@rei2> | 2012-01-12 12:54:45 +0100 |
commit | 577d31ab137f300e8b6fcb25bbb206777fb8d557 (patch) | |
tree | d2d0863117a2e35a2916fa8e4243f26e567c601d /sys/src | |
parent | 75e1ef0ab60acb6bccc54254b82770aec5786ead (diff) |
fix race condition of the CCACHE flag by clearing the flag in
attachimage() instead of temporarily reseting in pio().
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/port/fault.c | 6 | ||||
-rw-r--r-- | sys/src/9/port/segment.c | 1 |
2 files changed, 2 insertions, 5 deletions
diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c index 4a1cbdbff..5ab0c9f2e 100644 --- a/sys/src/9/port/fault.c +++ b/sys/src/9/port/fault.c @@ -200,7 +200,7 @@ pio(Segment *s, ulong addr, ulong soff, Page **p) Page *new; KMap *k; Chan *c; - int n, ask, cache; + int n, ask; char *kaddr; ulong daddr; Page *loadrec; @@ -238,18 +238,14 @@ retry: k = kmap(new); kaddr = (char*)VA(k); - cache = c->flag & CCACHE; while(waserror()) { - c->flag |= cache; if(strcmp(up->errstr, Eintr) == 0) continue; kunmap(k); putpage(new); faulterror(Eioload, c, 0); } - c->flag &= ~CCACHE; n = devtab[c->type]->read(c, kaddr, ask, daddr); - c->flag |= cache; if(n != ask) faulterror(Eioload, c, 0); if(ask < BY2PG) diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index db896c9e3..aa0ab33cc 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -287,6 +287,7 @@ attachimage(int type, Chan *c, ulong base, ulong len) lock(i); incref(c); + c->flag &= ~CCACHE; i->c = c; i->type = c->type; i->qid = c->qid; |