summaryrefslogtreecommitdiff
path: root/fd.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-08-08 19:58:06 +0000
committerrtm <rtm>2006-08-08 19:58:06 +0000
commit0e84a0ec6e7893dad13dff9a958c5bc987b79c82 (patch)
tree5739d0a2af8277db7a47c74e52975d9e9d81cef7 /fd.c
parente8d11c2e846ad15b32caacc8a919722b76d00f79 (diff)
downloadxv6-labs-0e84a0ec6e7893dad13dff9a958c5bc987b79c82.tar.gz
xv6-labs-0e84a0ec6e7893dad13dff9a958c5bc987b79c82.tar.bz2
xv6-labs-0e84a0ec6e7893dad13dff9a958c5bc987b79c82.zip
fix race in holding() check in acquire()
give cpu1 a TSS and gdt for when it enters scheduler() and a pseudo proc[] entry for each cpu cpu0 waits for each other cpu to start up read() for files
Diffstat (limited to 'fd.c')
-rw-r--r--fd.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fd.c b/fd.c
index 9ce6bae..8332454 100644
--- a/fd.c
+++ b/fd.c
@@ -69,6 +69,13 @@ fd_read(struct fd *fd, char *addr, int n)
return -1;
if(fd->type == FD_PIPE){
return pipe_read(fd->pipe, addr, n);
+ } else if(fd->type == FD_FILE){
+ ilock(fd->ip);
+ int cc = readi(fd->ip, addr, fd->off, n);
+ if(cc > 0)
+ fd->off += cc;
+ iunlock(fd->ip);
+ return cc;
} else {
panic("fd_read");
return -1;