/* 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;
}
