test concurrent open/unlink of same file (ok)
test files with holes (not ok)
This commit is contained in:
parent
68ae4cc127
commit
3d5f21ee1f
1 changed files with 89 additions and 3 deletions
92
usertests.c
92
usertests.c
|
@ -138,6 +138,76 @@ writetest1(void)
|
||||||
printf(stdout, "big files ok\n");
|
printf(stdout, "big files ok\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
writetest2(void)
|
||||||
|
{
|
||||||
|
int fd, fd1, n;
|
||||||
|
|
||||||
|
printf(stdout, "files with holes\n");
|
||||||
|
|
||||||
|
fd = open("hole", O_CREATE|O_RDWR);
|
||||||
|
if(fd < 0){
|
||||||
|
printf(stdout, "error: creat hole failed!\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[0] = 1;
|
||||||
|
if(write(fd, buf, 512) != 512) {
|
||||||
|
printf(stdout, "error: write hole file failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// now truncate, while fd is still open
|
||||||
|
fd1 = open("hole", O_CREATE | O_RDWR);
|
||||||
|
if(fd < 0){
|
||||||
|
printf(stdout, "error: 2nd creat hole failed!\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
close(fd1);
|
||||||
|
|
||||||
|
// now write another block, should be 2nd in file
|
||||||
|
buf[0] = 2;
|
||||||
|
if(write(fd, buf, 512) != 512) {
|
||||||
|
printf(stdout, "error: 2nd write hole file failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
fd = open("hole", O_RDONLY);
|
||||||
|
if(fd < 0){
|
||||||
|
printf(stdout, "error: open hole failed!\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
n = read(fd, buf, 512);
|
||||||
|
if(n != 512){
|
||||||
|
printf(stdout, "error: 1st hole read failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
if(buf[0] != 0){
|
||||||
|
printf(stdout, "error: 1st hole block didn't have zeros\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
n = read(fd, buf, 512);
|
||||||
|
if(n != 512){
|
||||||
|
printf(stdout, "error: 2nd hole read failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
if(buf[0] != 1){
|
||||||
|
printf(stdout, "error: 2nd hole block wrong content\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
if(unlink("hole") < 0) {
|
||||||
|
printf(stdout, "unlink hole failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
printf(stdout, "hole files ok\n");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
createtest(void)
|
createtest(void)
|
||||||
{
|
{
|
||||||
|
@ -461,7 +531,7 @@ twofiles(void)
|
||||||
printf(1, "twofiles ok\n");
|
printf(1, "twofiles ok\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// two processes create and delete files in same directory
|
// two processes create and delete different files in same directory
|
||||||
void
|
void
|
||||||
createdelete(void)
|
createdelete(void)
|
||||||
{
|
{
|
||||||
|
@ -647,7 +717,7 @@ linktest(void)
|
||||||
printf(1, "linktest ok\n");
|
printf(1, "linktest ok\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// test concurrent create of the same file
|
// test concurrent create and unlink of the same file
|
||||||
void
|
void
|
||||||
concreate(void)
|
concreate(void)
|
||||||
{
|
{
|
||||||
|
@ -713,7 +783,22 @@ concreate(void)
|
||||||
|
|
||||||
for(i = 0; i < 40; i++){
|
for(i = 0; i < 40; i++){
|
||||||
file[1] = '0' + i;
|
file[1] = '0' + i;
|
||||||
unlink(file);
|
pid = fork();
|
||||||
|
if(pid < 0){
|
||||||
|
printf(1, "fork failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
if(((i % 3) == 0 && pid == 0) ||
|
||||||
|
((i % 3) == 1 && pid != 0)){
|
||||||
|
fd = open(file, 0);
|
||||||
|
close(fd);
|
||||||
|
} else {
|
||||||
|
unlink(file);
|
||||||
|
}
|
||||||
|
if(pid == 0)
|
||||||
|
exit();
|
||||||
|
else
|
||||||
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(1, "concreate ok\n");
|
printf(1, "concreate ok\n");
|
||||||
|
@ -1095,6 +1180,7 @@ main(int argc, char *argv[])
|
||||||
opentest();
|
opentest();
|
||||||
writetest();
|
writetest();
|
||||||
writetest1();
|
writetest1();
|
||||||
|
writetest2();
|
||||||
createtest();
|
createtest();
|
||||||
|
|
||||||
mem();
|
mem();
|
||||||
|
|
Loading…
Reference in a new issue