2 * This programme was originally written by
3 * Jeff Moyer <jmoyer@redhat.com>
5 * Copyright (C) 2016, Red Hat, Inc.
18 void usage(char *prog)
21 "usage: %s <src file> <dest file> <size> <msg>\n",
26 void err_exit(char *op, unsigned long len, char *s)
28 fprintf(stderr, "%s(%s) len %lu %s\n",
29 op, strerror(errno), len, s);
33 int main(int argc, char **argv)
35 int fd, fd2, ret, dio = 1;
40 unsigned long len, opt;
43 usage(basename(argv[0]));
45 while ((opt = getopt(argc, argv, "b")) != -1)
49 dfile = argv[optind + 1];
50 msg = argv[optind + 3];
51 len = strtoul(argv[optind + 2], NULL, 10);
53 err_exit("strtoul", 0, msg);
55 /* Open source file and mmap*/
56 fd = open(sfile, O_RDWR, 0644);
58 err_exit("open src", len, msg);
60 map = (char *)mmap(NULL, len,
61 PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
62 if (map == MAP_FAILED)
63 err_exit("mmap", len, msg);
66 /* Open dest file with O_DIRECT */
67 fd2 = open(dfile, O_RDWR|O_DIRECT, 0644);
69 err_exit("open dest", len, msg);
71 /* Open dest file without O_DIRECT */
72 fd2 = open(dfile, O_RDWR, 0644);
74 err_exit("open dest", len, msg);
77 /* First, test storing to dest file from source mapping */
78 ret = write(fd2, map, len);
80 err_exit("write", len, msg);
84 err_exit("fsync", len, msg);
86 ret = (int)lseek(fd2, 0, SEEK_SET);
88 err_exit("lseek", len, msg);
90 /* Next, test reading from dest file into source mapping */
91 ret = read(fd2, map, len);
93 err_exit("read", len, msg);
94 ret = msync(map, len, MS_SYNC);
96 err_exit("msync", len, msg);
98 ret = munmap(map, len);
100 err_exit("munmap", len, msg);
104 err_exit("clsoe fd", len, msg);
108 err_exit("close fd2", len, msg);