#include <unistd.h>
#include <stdlib.h>
-int handle;
-#define N_WRITES 8000
-#define STRIDE 1000
+#define N_WRITES 16
+#define STRIDE 250000
-#define BUFFER_N 2000
-unsigned buffer[BUFFER_N];
+#define BUFFER_N 1100
+unsigned xxbuffer[BUFFER_N];
void set_buffer(int n)
{
int i;
for(i = 0; i < BUFFER_N; i++)
- buffer[i] = i + n;
+ xxbuffer[i] = i + n;
}
void write_big_sparse_file(int h)
{
int i;
- off64_t offset = 0;
- off64_t pos;
- int n = sizeof(buffer);
+ loff_t offset = 0;
+ loff_t pos;
+ int n = sizeof(xxbuffer);
int wrote;
-
- for(i = 0; i < 4000; i++) {
+
+ for(i = 0; i < N_WRITES; i++) {
+ printf("writing at %lld\n", offset);
set_buffer(i);
pos = lseek64(h, offset, SEEK_SET);
if(pos != offset) {
perror("lseek64");
exit(1);
}
- wrote = write(h, buffer, n);
-
+ wrote = write(h, xxbuffer, n);
+
if(wrote != n) {
printf("mismatched write wrote %d n %d\n", wrote, n);
exit(1);
}
-
- offset += (STRIDE * sizeof(buffer));
- }
-}
-
+ offset += (STRIDE * sizeof(xxbuffer));
+ }
+ ftruncate(h, offset);
-void verify_big_sparse_file(int h)
-{
}
+
int main(int argc, char *argv[])
{
+ int handle;
if(argc < 2) {
printf("Gimme a file name!\n");
exit(1);
}
-
+
handle = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
-
+
if(handle < 0) {
perror("opening file");
exit(1);
}
-
+
write_big_sparse_file(handle);
- system("sudo echo 3 > /proc/sys/vm/drop_caches");
- verify_big_sparse_file(handle);
-
+
printf("Job done\n");
return 0;
}