summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2>2012-01-12 12:54:45 +0100
committercinap_lenrek <cinap_lenrek@rei2>2012-01-12 12:54:45 +0100
commit577d31ab137f300e8b6fcb25bbb206777fb8d557 (patch)
treed2d0863117a2e35a2916fa8e4243f26e567c601d /sys/src
parent75e1ef0ab60acb6bccc54254b82770aec5786ead (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.c6
-rw-r--r--sys/src/9/port/segment.c1
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;