1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2003 Silicon Graphics, Inc.
18 #define O_DIRECT 040000
23 #define ALIGNMENT 16384
24 #define TRUNCSIZE 1000
26 /* write data to disk - buffered/sync or direct
27 * write different buffered data to disk
29 * direct read back, see if server puts stale data down
38 char *buf = NULL, *goodbuf = NULL;
40 char *filename="testfile";
44 printf("Usage: trunc -f testfilename\n");
48 while((c=getopt(argc,argv,"f:"))!=EOF) {
54 fprintf(stderr,"Usage: trunc -f filename\n");
59 err = posix_memalign((void **)&buf, ALIGNMENT, BUFSIZE);
61 fprintf(stderr, "posix_memalign failed: %s\n", strerror(err));
63 err = posix_memalign((void **)&goodbuf, ALIGNMENT, BUFSIZE);
65 fprintf(stderr, "posix_memalign failed: %s\n", strerror(err));
67 err = unlink(filename);
68 /* if (err < 0) perror("unlink failed");*/
70 fd = open(filename, O_CREAT|O_RDWR|O_DIRECT, 0666);
71 if (fd < 0) perror("direct open failed");
73 memset(buf, 1, BUFSIZE);
75 printf("direct write of 1's into file\n");
76 err = write(fd, buf, BUFSIZE);
77 if (err < 0) perror("direct write failed");
81 fd = open(filename, O_CREAT|O_RDWR, 0666);
82 if (fd < 0) perror("buffered open failed");
86 memset(buf, 2, BUFSIZE);
87 memset(goodbuf, 2, BUFSIZE);
89 printf("buffered write of 2's into file\n");
90 err = write(fd, buf, BUFSIZE);
91 if (err < 0) perror("buffered write failed");
93 /* 1 now on disk, but 2 data is buffered */
95 printf("truncate file\n");
96 err = ftruncate(fd, TRUNCSIZE);
97 if (err < 0) perror("ftruncate failed");
98 starttime = time(NULL);
100 printf("sync buffered data (2's)\n");
102 if (err < 0) perror("fdatasync failed");
104 /* during truncate server may have read/modified/written last block */
108 fd = open(filename, O_CREAT|O_RDWR|O_DIRECT, 0666);
109 if (fd < 0) perror("direct open failed");
111 /* read what's really on disk now */
113 printf("iterate direct reads for %ds or until failure...\n", WAITTIME);
115 while ((elapsed = (time(NULL) - starttime)) <= WAITTIME) {
120 err = lseek(fd, 0, SEEK_SET);
121 if (err < 0) perror("lseek failed");
123 err = read(fd, buf, BUFSIZE);
124 if (err < 0) perror("read failed");
126 err = memcmp(buf, goodbuf, 100);
128 printf("\nFailed after %d secs: read %d's\n", elapsed, buf[0]);