diff options
author | rtm <rtm> | 2006-08-25 01:11:30 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-08-25 01:11:30 +0000 |
commit | 5051da6de3fcabb9e280d3bf36549da0ac0d5738 (patch) | |
tree | 9e93001ead271f31870c0896a409698309ff7f5d /fstests.c | |
parent | 74493bf4460f4024e06760289735e9d5dcb9dc3f (diff) | |
download | xv6-labs-5051da6de3fcabb9e280d3bf36549da0ac0d5738.tar.gz xv6-labs-5051da6de3fcabb9e280d3bf36549da0ac0d5738.tar.bz2 xv6-labs-5051da6de3fcabb9e280d3bf36549da0ac0d5738.zip |
inode addrs[NDIRECT] -> NADDRS
fix race in mknod / creat
use last component in dirent in mknod, not path
Diffstat (limited to 'fstests.c')
-rw-r--r-- | fstests.c | 122 |
1 files changed, 118 insertions, 4 deletions
@@ -213,7 +213,7 @@ unlinkread() exit(); } - fd1 = open("xxx", O_CREATE | O_RDWR); + fd1 = open("unlinkread", O_CREATE | O_RDWR); write(fd1, "yyy", 3); close(fd1); @@ -230,7 +230,7 @@ unlinkread() exit(); } close(fd); - unlink("xxx"); + unlink("unlinkread"); puts("unlinkread ok\n"); } @@ -319,7 +319,7 @@ concreate() } else { fd = open(file, O_CREATE | O_RDWR); if(fd < 0){ - puts("concreate create failed\n"); + printf(1, "concreate create %s failed\n", file); exit(); } close(fd); @@ -409,12 +409,126 @@ bigdir() puts("bigdir ok\n"); } +void +subdir() +{ + int fd; + + if(mkdir("dd") != 0){ + puts("subdir mkdir dd failed\n"); + exit(); + } + + fd = open("dd/ff", O_CREATE | O_RDWR); + if(fd < 0){ + puts("create dd/ff failed\n"); + exit(); + } + write(fd, "ff", 2); + close(fd); + + if(mkdir("/dd/dd") != 0){ + puts("subdir mkdir dd/dd failed\n"); + exit(); + } + + fd = open("dd/dd/ff", O_CREATE | O_RDWR); + if(fd < 0){ + puts("create dd/dd/ff failed\n"); + exit(); + } + write(fd, "FF", 2); + close(fd); + + if(link("dd/dd/ff", "dd/dd/ffff") != 0){ + puts("link dd/dd/ff dd/dd/ffff failed\n"); + exit(); + } + + if(unlink("dd/dd/ff") != 0){ + puts("unlink dd/dd/ff failed\n"); + exit(); + } + + fd = open("dd/dd/ffff", 0); + if(fd < 0){ + puts("open dd/dd/ffff failed\n"); + exit(); + } + if(read(fd, buf, sizeof(buf)) != 2){ + puts("read dd/dd/ffff wrong len\n"); + exit(); + } + close(fd); + + if(open("dd/dd/ff", 0) >= 0){ + puts("open dd/dd/ff succeeded!\n"); + exit(); + } + + if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ + puts("create dd/ff/ff succeeded!\n"); + exit(); + } + if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ + puts("create dd/xx/ff succeeded!\n"); + exit(); + } + if(link("dd/ff/ff", "dd/dd/xx") == 0){ + puts("link dd/ff/ff dd/dd/xx succeeded!\n"); + exit(); + } + if(link("dd/xx/ff", "dd/dd/xx") == 0){ + puts("link dd/xx/ff dd/dd/xx succeeded!\n"); + exit(); + } + if(link("dd/ff", "dd/dd/ff") == 0){ + puts("link dd/ff dd/dd/ff succeeded!\n"); + exit(); + } + if(mkdir("dd/ff/ff") == 0){ + puts("mkdir dd/ff/ff succeeded!\n"); + exit(); + } + if(mkdir("dd/xx/ff") == 0){ + puts("mkdir dd/xx/ff succeeded!\n"); + exit(); + } + if(mkdir("dd/dd/ff") == 0){ + puts("mkdir dd/dd/ff succeeded!\n"); + exit(); + } + if(unlink("dd/xx/ff") == 0){ + puts("unlink dd/xx/ff succeeded!\n"); + exit(); + } + if(unlink("dd/ff/ff") == 0){ + puts("unlink dd/ff/ff succeeded!\n"); + exit(); + } + + if(unlink("dd/dd/ff") != 0){ + puts("unlink dd/dd/ff failed\n"); + exit(); + } + if(unlink("dd/ff") != 0){ + puts("unlink dd/ff failed\n"); + exit(); + } + + // unlink dd/dd + // unlink dd + + puts("subdir ok\n"); +} + int main(int argc, char *argv[]) { puts("fstests starting\n"); - bigdir(); + subdir(); + // bigdir(); // slow concreate(); linktest(); unlinkread(); |