generic/484: add _require_xfs_io_command "syncfs"
[xfstests-dev.git] / src / t_mmap_dio.c
1 /*
2  * This programme was originally written by
3  *     Jeff Moyer <jmoyer@redhat.com>
4  *
5  * Copyright (C) 2016, Red Hat, Inc.
6  */
7 #define _GNU_SOURCE 1
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <sys/mman.h>
14 #include <libaio.h>
15 #include <errno.h>
16 #include <sys/time.h>
17
18 void usage(char *prog)
19 {
20         fprintf(stderr,
21                 "usage: %s <src file> <dest file> <size> <msg>\n",
22                 prog);
23         exit(1);
24 }
25
26 void err_exit(char *op, unsigned long len, char *s)
27 {
28         fprintf(stderr, "%s(%s) len %lu %s\n",
29                 op, strerror(errno), len, s);
30         exit(1);
31 }
32
33 int main(int argc, char **argv)
34 {
35         int fd, fd2, ret, dio = 1;
36         char *map;
37         char *msg;
38         char *sfile;
39         char *dfile;
40         unsigned long len, opt;
41
42         if (argc < 5)
43                 usage(basename(argv[0]));
44
45         while ((opt = getopt(argc, argv, "b")) != -1)
46                 dio = 0;
47
48         sfile = argv[optind];
49         dfile = argv[optind + 1];
50         msg = argv[optind + 3];
51         len = strtoul(argv[optind + 2], NULL, 10);
52         if (errno == ERANGE)
53                 err_exit("strtoul", 0, msg);
54
55         /* Open source file and mmap*/
56         fd = open(sfile, O_RDWR, 0644);
57         if (fd < 0)
58                 err_exit("open src", len, msg);
59
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);
64
65         if (dio == 1) {
66                 /* Open dest file with O_DIRECT */
67                 fd2 = open(dfile, O_RDWR|O_DIRECT, 0644);
68                 if (fd2 < 0)
69                         err_exit("open dest", len, msg);
70         } else {
71                 /* Open dest file without O_DIRECT */
72                 fd2 = open(dfile, O_RDWR, 0644);
73                 if (fd2 < 0)
74                         err_exit("open dest", len, msg);
75         }
76
77         /* First, test storing to dest file from source mapping */
78         ret = write(fd2, map, len);
79         if (ret != len)
80                 err_exit("write", len, msg);
81
82         ret = fsync(fd2);
83         if (ret != 0)
84                 err_exit("fsync", len, msg);
85
86         ret = (int)lseek(fd2, 0, SEEK_SET);
87         if (ret == -1)
88                 err_exit("lseek", len, msg);
89
90         /* Next, test reading from dest file into source mapping */
91         ret = read(fd2, map, len);
92         if (ret != len)
93                 err_exit("read", len, msg);
94         ret = msync(map, len, MS_SYNC);
95         if (ret < 0)
96                 err_exit("msync", len, msg);
97
98         ret = munmap(map, len);
99         if (ret < 0)
100                 err_exit("munmap", len, msg);
101
102         ret = close(fd);
103         if (ret < 0)
104                 err_exit("clsoe fd", len, msg);
105
106         ret = close(fd2);
107         if (ret < 0)
108                 err_exit("close fd2", len, msg);
109
110         exit(0);
111 }