test: one process unlinks a file while another links to it
test: one process opens a file while another deletes it
test: mkdir. deadlock d/.. vs ../d
+test: sub-sub directories. mkdir("d1/d2")
+test: dup() shared fd->off
+test: indirect blocks. files and directories.
+test: sbrk
+test: does echo foo > x truncate x?
make proc[0] runnable
cpu early tss and gdt
sh: support pipes? leave it for the class?
sh: dynamic memory allocation?
sh: should sh support ; () & --- need malloc
-sh: stop stdin on ctrl-d (for cat > y)
\ No newline at end of file
+sh: stop stdin on ctrl-d (for cat > y)
+
+really should have bdwrite() for file content
+ and make some inode updates async
+ so soft updates make sense
if (ip->addrs[i] != 0) {
if (i == INDIRECT) {
inbp = bread(ip->dev, ip->addrs[INDIRECT]);
+ uint *a = (uint *) inbp->data;
for (j = 0; j < NINDIRECT; j++) {
- uint *a = (uint *) inbp->data;
if (a[j] != 0) {
bfree(ip->dev, a[j]);
a[j] = 0;
ip = iget(dev, inum);
+ if(ip->nlink < 1)
+ panic("unlink nlink < 1");
+
ip->nlink--;
iupdate(ip);
puts("concreate ok\n");
}
+// directory that uses indirect blocks
+void
+bigdir()
+{
+ int i, fd;
+ char name[10];
+
+ unlink("bd");
+
+ fd = open("bd", O_CREATE);
+ if(fd < 0){
+ puts("bigdir create failed\n");
+ exit();
+ }
+ close(fd);
+
+ for(i = 0; i < 500; i++){
+ name[0] = 'x';
+ name[1] = '0' + (i / 64);
+ name[2] = '0' + (i % 64);
+ name[3] = '\0';
+ if(link("bd", name) != 0){
+ puts("bigdir link failed\n");
+ exit();
+ }
+ puts("c");
+ }
+
+ unlink("bd");
+ for(i = 0; i < 500; i++){
+ name[0] = 'x';
+ name[1] = '0' + (i / 64);
+ name[2] = '0' + (i % 64);
+ name[3] = '\0';
+ if(unlink(name) != 0){
+ puts("bigdir unlink failed");
+ exit();
+ }
+ puts("d");
+ }
+
+ puts("bigdir ok\n");
+}
+
int
main(int argc, char *argv[])
{
puts("fstests starting\n");
+ bigdir();
concreate();
linktest();
unlinkread();