diff options
author | Robert Morris <[email protected]> | 2014-08-04 13:06:48 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2014-08-04 13:06:48 -0400 |
commit | 2c56547272e43b483d560a61692f1e24926a82fb (patch) | |
tree | 514014c69ff9cfe2a67159b9a3f514a3a619aea6 /usertests.c | |
parent | 020c8e2384877ffc13579f633ac3c723f80baf8c (diff) | |
download | xv6-labs-2c56547272e43b483d560a61692f1e24926a82fb.tar.gz xv6-labs-2c56547272e43b483d560a61692f1e24926a82fb.tar.bz2 xv6-labs-2c56547272e43b483d560a61692f1e24926a82fb.zip |
every iput() and namei() must be inside a transaction
Diffstat (limited to 'usertests.c')
-rw-r--r-- | usertests.c | 106 |
1 files changed, 105 insertions, 1 deletions
diff --git a/usertests.c b/usertests.c index 92b9136..5a78c7c 100644 --- a/usertests.c +++ b/usertests.c @@ -13,6 +13,106 @@ char name[3]; char *echoargv[] = { "echo", "ALL", "TESTS", "PASSED", 0 }; int stdout = 1; +// does chdir() call iput(p->cwd) in a transaction? +void +iputtest(void) +{ + printf(stdout, "iput test\n"); + + if(mkdir("iputdir") < 0){ + printf(stdout, "mkdir failed\n"); + exit(); + } + if(chdir("iputdir") < 0){ + printf(stdout, "chdir iputdir failed\n"); + exit(); + } + if(unlink("../iputdir") < 0){ + printf(stdout, "unlink ../iputdir failed\n"); + exit(); + } + if(chdir("/") < 0){ + printf(stdout, "chdir / failed\n"); + exit(); + } + printf(stdout, "iput test ok\n"); +} + +// does exit() call iput(p->cwd) in a transaction? +void +exitiputtest(void) +{ + int pid; + + printf(stdout, "exitiput test\n"); + + pid = fork(); + if(pid < 0){ + printf(stdout, "fork failed\n"); + exit(); + } + if(pid == 0){ + if(mkdir("iputdir") < 0){ + printf(stdout, "mkdir failed\n"); + exit(); + } + if(chdir("iputdir") < 0){ + printf(stdout, "child chdir failed\n"); + exit(); + } + if(unlink("../iputdir") < 0){ + printf(stdout, "unlink ../iputdir failed\n"); + exit(); + } + exit(); + } + wait(); + printf(stdout, "exitiput test ok\n"); +} + +// does the error path in open() for attempt to write a +// directory call iput() in a transaction? +// needs a hacked kernel that pauses just after the namei() +// call in sys_open(): +// if((ip = namei(path)) == 0) +// return -1; +// { +// int i; +// for(i = 0; i < 10000; i++) +// yield(); +// } +void +openiputtest(void) +{ + int pid; + + printf(stdout, "openiput test\n"); + if(mkdir("oidir") < 0){ + printf(stdout, "mkdir oidir failed\n"); + exit(); + } + pid = fork(); + if(pid < 0){ + printf(stdout, "fork failed\n"); + exit(); + } + if(pid == 0){ + int fd = open("oidir", O_RDWR); + if(fd >= 0){ + printf(stdout, "open directory for write succeeded\n"); + exit(); + } + exit(); + } + sleep(1); + if(unlink("oidir") != 0){ + printf(stdout, "unlink failed\n"); + exit(); + } + wait(); + printf(stdout, "openiput test ok\n"); +} + // simple file system tests void @@ -187,7 +287,7 @@ void dirtest(void) printf(stdout, "unlink dir0 failed\n"); exit(); } - printf(stdout, "mkdir test\n"); + printf(stdout, "mkdir test ok\n"); } void @@ -1628,6 +1728,10 @@ main(int argc, char *argv[]) writetest1(); createtest(); + openiputtest(); + exitiputtest(); + iputtest(); + mem(); pipe1(); preempt(); |