提交 7bbdbc6d 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

roughly works, except for readdir/ls

上级 643e2f31
...@@ -554,10 +554,6 @@ dir_init(struct inode *dp) ...@@ -554,10 +554,6 @@ dir_init(struct inode *dp)
if (dp->type != T_DIR) if (dp->type != T_DIR)
panic("dir_init not DIR"); panic("dir_init not DIR");
ilock(dp, 1);
if (dp->dir)
return;
struct ns *dir = nsalloc(0); struct ns *dir = nsalloc(0);
for (uint off = 0; off < dp->size; off += BSIZE) { for (uint off = 0; off < dp->size; off += BSIZE) {
struct buf *bp = bread(dp->dev, bmap(dp, off / BSIZE), 0); struct buf *bp = bread(dp->dev, bmap(dp, off / BSIZE), 0);
...@@ -574,8 +570,10 @@ dir_init(struct inode *dp) ...@@ -574,8 +570,10 @@ dir_init(struct inode *dp)
} }
brelse(bp, 0); brelse(bp, 0);
} }
dp->dir = dir; if (!__sync_bool_compare_and_swap(&dp->dir, 0, dir)) {
iunlock(dp); // free all the dirents
nsfree(dir);
}
} }
// Look for a directory entry in a directory. // Look for a directory entry in a directory.
...@@ -660,8 +658,6 @@ namex(char *path, int nameiparent, char *name) ...@@ -660,8 +658,6 @@ namex(char *path, int nameiparent, char *name)
while((path = skipelem(path, name)) != 0){ while((path = skipelem(path, name)) != 0){
next = 0; next = 0;
if(nameiparent == 0)
next = nc_lookup(ip, name);
if(next == 0){ if(next == 0){
if(ip->type == 0) if(ip->type == 0)
panic("namex"); panic("namex");
...@@ -680,7 +676,6 @@ namex(char *path, int nameiparent, char *name) ...@@ -680,7 +676,6 @@ namex(char *path, int nameiparent, char *name)
rcu_end_read(); rcu_end_read();
return 0; return 0;
} }
nc_insert(ip, name, next);
iput(ip); iput(ip);
} }
ip = next; ip = next;
......
...@@ -62,7 +62,7 @@ mainc(void) ...@@ -62,7 +62,7 @@ mainc(void)
ideinit(); // disk ideinit(); // disk
if(!ismp) if(!ismp)
timerinit(); // uniprocessor timer timerinit(); // uniprocessor timer
nc_init(); //nc_init();
userinit(); // first user process userinit(); // first user process
bootothers(); // start other processors bootothers(); // start other processors
kvmalloc(); // new kernel page table wo. bottom mapped kvmalloc(); // new kernel page table wo. bottom mapped
......
...@@ -133,7 +133,7 @@ sys_link(void) ...@@ -133,7 +133,7 @@ sys_link(void)
if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0) if(dp->dev != ip->dev || dirlink(dp, name, ip->inum) < 0)
goto bad; goto bad;
nc_insert(dp, name, ip); //nc_insert(dp, name, ip);
iput(ip); iput(ip);
return 0; return 0;
...@@ -213,7 +213,7 @@ sys_unlink(void) ...@@ -213,7 +213,7 @@ sys_unlink(void)
iunlock(dp); iunlock(dp);
} }
nc_invalidate(dp, name); //nc_invalidate(dp, name);
iput(dp); iput(dp);
ip->nlink--; ip->nlink--;
...@@ -261,7 +261,7 @@ create(char *path, short type, short major, short minor) ...@@ -261,7 +261,7 @@ create(char *path, short type, short major, short minor)
if(dirlink(dp, name, ip->inum) < 0) if(dirlink(dp, name, ip->inum) < 0)
panic("create: dirlink"); panic("create: dirlink");
nc_insert(dp, name, ip); //nc_insert(dp, name, ip);
iput(dp); iput(dp);
return ip; return ip;
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论