1 | // Demonstrate that moving the "acquire" in iderw after the loop that |
2 | // appends to the idequeue results in a race. |
3 | |
4 | // For this to work, you should also add a spin within iderw's |
5 | // idequeue traversal loop. Adding the following demonstrated a panic |
6 | // after about 5 runs of stressfs in QEMU on a 2.1GHz CPU: |
7 | // for (i = 0; i < 40000; i++) |
8 | // asm volatile(""); |
9 | |
10 | #include "types.h" |
11 | #include "stat.h" |
12 | #include "user.h" |
13 | #include "fs.h" |
14 | #include "fcntl.h" |
15 | |
16 | int |
17 | main(int argc, char *argv[]) |
18 | { |
19 | int fd, i; |
20 | char path[] = "stressfs0" ; |
21 | char data[512]; |
22 | |
23 | printf(1, "stressfs starting\n" ); |
24 | memset(data, 'a', sizeof(data)); |
25 | |
26 | for(i = 0; i < 4; i++) |
27 | if(fork() > 0) |
28 | break; |
29 | |
30 | printf(1, "write %d\n" , i); |
31 | |
32 | path[8] += i; |
33 | fd = open(path, O_CREATE | O_RDWR); |
34 | for(i = 0; i < 20; i++) |
35 | // printf(fd, "%d\n", i); |
36 | write(fd, data, sizeof(data)); |
37 | close(fd); |
38 | |
39 | printf(1, "read\n" ); |
40 | |
41 | fd = open(path, O_RDONLY); |
42 | for (i = 0; i < 20; i++) |
43 | read(fd, data, sizeof(data)); |
44 | close(fd); |
45 | |
46 | wait(); |
47 | |
48 | exit(); |
49 | } |
50 | |