/* testpwrite.c * reproduces issue on NFS 4.2 client on Linux 5.10.5 * (c) Kurt Garloff , 1/2021 * License: GNU GPL 2 or later */ #include #include #include #include #include #include #include #define MAXBUF 1048576 #define MAXSIZE (128*MAXBUF) #define REP 16384 long randomwrite(int fd) { void* buf = malloc(MAXBUF); long written = 0; int rep = REP; int ret; if (!buf) { perror("malloc"); return -3; } memset(buf, 0, MAXBUF); while (--rep) { #if MAXSIZE >= RAND_MAX loff_t offset = rand() * (MAXSIZE/RAND_MAX); #else loff_t offset = rand() / (RAND_MAX/MAXSIZE); #endif #if MAXBUF >= RAND_MAX size_t len = rand() * (MAXBUF/RAND_MAX); #else size_t len = rand() / (RAND_MAX/MAXBUF); #endif //ret = pread(fd, buf+len/4, len/2, offset); /* Slowly fill in some random non-0 values */ *(int*)(buf + (len - len%8)) = rand(); ret = pwrite(fd, buf, len, offset); if (ret < 0) { fprintf(stderr, "pwrite(%i,%p,%li,%li): ", fd, buf, len, offset); perror(""); return -1; } else written += ret; } return written; } int main(int argc, char *argv[]) { srand(time(0)); int fd = open("testfile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP); if (fd <= 0) { perror("open(\"testfile\")"); return 2; } ftruncate(fd, MAXSIZE); unlink("testfile"); long rc = randomwrite(fd); close(fd); if (rc < 0) return -rc; printf("%li bytes written successfully\n", rc); return 0; }