7 #include <linux/types.h>
10 #include <sys/ioctl.h>
13 //#include "../client/ioctl.h"
15 #include <linux/ioctl.h>
16 #define CEPH_IOCTL_MAGIC 0x97
17 #define CEPH_IOC_SYNCIO _IO(CEPH_IOCTL_MAGIC, 5)
21 printf("writing pattern\n");
26 int fd = open("foo", O_CREAT|O_WRONLY, 0644);
29 printf("write_pattern: error: open() failed with: %d (%s)\n", r, strerror(r));
32 for (i=0; i<1048576 * sizeof(i); i += sizeof(i)) {
33 r = write(fd, &i, sizeof(i));
36 printf("write_pattern: error: write() failed with: %d (%s)\n", r, strerror(r));
44 int verify_pattern(char *buf, size_t len, uint64_t off)
48 for (i = 0; i < len; i += sizeof(uint64_t)) {
49 uint64_t expected = i + off;
50 uint64_t actual = *(uint64_t*)(buf + i);
51 if (expected != actual) {
52 printf("error: offset %llu had %llu\n", (unsigned long long)expected,
53 (unsigned long long)actual);
60 void generate_pattern(void *buf, size_t len, uint64_t offset)
65 for (i=0; i<len / sizeof(v); i++)
66 v[i] = i * sizeof(v) + offset;
67 verify_pattern(buf, len, offset);
70 int read_file(int buf_align, uint64_t offset, int len, int direct) {
72 printf("read_file buf_align %d offset %llu len %d\n", buf_align,
73 (unsigned long long)offset, len);
80 flags = O_RDONLY|O_DIRECT;
84 int fd = open("foo", flags);
87 printf("read_file: error: open() failed with: %d (%s)\n", err, strerror(err));
92 ioctl(fd, CEPH_IOC_SYNCIO);
94 if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
95 printf("read_file: error: posix_memalign failed with %d", r);
100 void *buf = (char *)rawbuf + buf_align;
102 r = pread(fd, buf, len, offset);
105 printf("read_file: error: pread() failed with: %d (%s)\n", err, strerror(err));
108 r = verify_pattern(buf, len, offset);
116 int read_direct(int buf_align, uint64_t offset, int len)
118 printf("read_direct buf_align %d offset %llu len %d\n", buf_align,
119 (unsigned long long)offset, len);
120 return read_file(buf_align, offset, len, 1);
123 int read_sync(int buf_align, uint64_t offset, int len)
125 printf("read_sync buf_align %d offset %llu len %d\n", buf_align,
126 (unsigned long long)offset, len);
127 return read_file(buf_align, offset, len, 0);
130 int write_file(int buf_align, uint64_t offset, int len, int direct)
132 printf("write_file buf_align %d offset %llu len %d\n", buf_align,
133 (unsigned long long)offset, len);
139 flags = O_WRONLY|O_DIRECT|O_CREAT;
141 flags = O_WRONLY|O_CREAT;
143 int fd = open("foo", flags, 0644);
146 printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
150 if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
151 printf("write_file: error: posix_memalign failed with %d", r);
157 ioctl(fd, CEPH_IOC_SYNCIO);
159 void *buf = (char *)rawbuf + buf_align;
161 generate_pattern(buf, len, offset);
163 r = pwrite(fd, buf, len, offset);
166 fd = open("foo", O_RDONLY);
169 printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
173 void *buf2 = malloc(len);
176 printf("write_file: error: malloc failed\n");
180 memset(buf2, 0, len);
181 r = pread(fd, buf2, len, offset);
184 printf("write_file: error: pread() failed with: %d (%s)\n", err, strerror(err));
187 r = verify_pattern(buf2, len, offset);
202 int write_direct(int buf_align, uint64_t offset, int len)
204 printf("write_direct buf_align %d offset %llu len %d\n", buf_align,
205 (unsigned long long)offset, len);
206 return write_file (buf_align, offset, len, 1);
209 int write_sync(int buf_align, uint64_t offset, int len)
211 printf("write_sync buf_align %d offset %llu len %d\n", buf_align,
212 (unsigned long long)offset, len);
213 return write_file (buf_align, offset, len, 0);
216 int main(int argc, char **argv)
222 if (argc >= 2 && strcmp(argv[1], "read") == 0)
224 if (argc >= 2 && strcmp(argv[1], "write") == 0)
230 for (i = 0; i < 4096; i += 512)
231 for (j = 4*1024*1024 - 4096; j < 4*1024*1024 + 4096; j += 512)
232 for (k = 1024; k <= 16384; k *= 2) {
233 read_direct(i, j, k);
240 for (i = 0; i < 4096; i += 512)
241 for (j = 4*1024*1024 - 4096 + 512; j < 4*1024*1024 + 4096; j += 512)
242 for (k = 1024; k <= 16384; k *= 2) {
243 write_direct(i, j, k);