DF-3072 / df3072.c
/* DF-3072 - tmpfs fhtovp during inactive DOOMED window (KKASSERT panic). * usage: df3072 <file-on-nfs> * phase1: write 400MB real data (server-side tmpfs pages) * phase2: print READY; hammer fstat(fd) until killed (root rm's the file * server-side; GETATTR-by-fh -> tmpfs_fhtovp -> tmpfs_alloc_vp * KKASSERT(DOOMED) during the truncate window) */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> int main(int argc,char**argv){ char b[65536]; long long tot=0; int iter=0; if(argc<2){fprintf(stderr,"usage: df3072 file\n");return 2;} int fd=open(argv[1],O_RDWR|O_CREAT,0644); if(fd<0){perror("open");return 1;} memset(b,0x33,sizeof b); for(int i=0;i<6400;i++){ ssize_t r=write(fd,b,sizeof b); if(r<=0){perror("write");return 1;} tot+=r; } printf("WROTE %lld bytes; READY - hammering fstat\n",tot); fflush(stdout); struct stat st; for(;;){ fstat(fd,&st); usleep(300); if(!(++iter%2000)){ printf("fstat iters=%d\n",iter); fflush(stdout);} } return 0; } |