49 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// Demonstrate that moving the "acquire" in iderw after the loop that
 | 
						|
// appends to the idequeue results in a race.
 | 
						|
 | 
						|
// For this to work, you should also add a spin within iderw's
 | 
						|
// idequeue traversal loop.  Adding the following demonstrated a panic
 | 
						|
// after about 5 runs of stressfs in QEMU on a 2.1GHz CPU:
 | 
						|
//    for (i = 0; i < 40000; i++)
 | 
						|
//      asm volatile("");
 | 
						|
 | 
						|
#include "kernel/types.h"
 | 
						|
#include "kernel/stat.h"
 | 
						|
#include "user/user.h"
 | 
						|
#include "kernel/fs.h"
 | 
						|
#include "kernel/fcntl.h"
 | 
						|
 | 
						|
int
 | 
						|
main(int argc, char *argv[])
 | 
						|
{
 | 
						|
  int fd, i;
 | 
						|
  char path[] = "stressfs0";
 | 
						|
  char data[512];
 | 
						|
 | 
						|
  printf(1, "stressfs starting\n");
 | 
						|
  memset(data, 'a', sizeof(data));
 | 
						|
 | 
						|
  for(i = 0; i < 4; i++)
 | 
						|
    if(fork() > 0)
 | 
						|
      break;
 | 
						|
 | 
						|
  printf(1, "write %d\n", i);
 | 
						|
 | 
						|
  path[8] += i;
 | 
						|
  fd = open(path, O_CREATE | O_RDWR);
 | 
						|
  for(i = 0; i < 20; i++)
 | 
						|
//    printf(fd, "%d\n", i);
 | 
						|
    write(fd, data, sizeof(data));
 | 
						|
  close(fd);
 | 
						|
 | 
						|
  printf(1, "read\n");
 | 
						|
 | 
						|
  fd = open(path, O_RDONLY);
 | 
						|
  for (i = 0; i < 20; i++)
 | 
						|
    read(fd, data, sizeof(data));
 | 
						|
  close(fd);
 | 
						|
 | 
						|
  wait();
 | 
						|
 | 
						|
  exit();
 | 
						|
}
 |