]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/direct_io/test_sync_io.c
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
);