#include #include #include #include #include #include #include #include #include #include #include //#include "../client/ioctl.h" #include #define CEPH_IOCTL_MAGIC 0x97 #define CEPH_IOC_SYNCIO _IO(CEPH_IOCTL_MAGIC, 5) void write_pattern() { printf("writing pattern\n"); uint64_t i; int r; int fd = open("foo", O_CREAT|O_WRONLY, 0644); if (fd < 0) { r = errno; printf("write_pattern: error: open() failed with: %d (%s)\n", r, strerror(r)); exit(r); } for (i=0; i<1048576 * sizeof(i); i += sizeof(i)) { r = write(fd, &i, sizeof(i)); if (r == -1) { r = errno; printf("write_pattern: error: write() failed with: %d (%s)\n", r, strerror(r)); break; } } close(fd); } int verify_pattern(char *buf, size_t len, uint64_t off) { size_t i; for (i = 0; i < len; i += sizeof(uint64_t)) { uint64_t expected = i + off; uint64_t actual = *(uint64_t*)(buf + i); if (expected != actual) { printf("error: offset %llu had %llu\n", (unsigned long long)expected, (unsigned long long)actual); exit(1); } } return 0; } void generate_pattern(void *buf, size_t len, uint64_t offset) { uint64_t *v = buf; size_t i; for (i=0; i= 2 && strcmp(argv[1], "read") == 0) write = 0; if (argc >= 2 && strcmp(argv[1], "write") == 0) read = 0; if (read) { write_pattern(); for (i = 0; i < 4096; i += 512) for (j = 4*1024*1024 - 4096; j < 4*1024*1024 + 4096; j += 512) for (k = 1024; k <= 16384; k *= 2) { read_direct(i, j, k); read_sync(i, j, k); } } unlink("foo"); if (write) { for (i = 0; i < 4096; i += 512) for (j = 4*1024*1024 - 4096 + 512; j < 4*1024*1024 + 4096; j += 512) for (k = 1024; k <= 16384; k *= 2) { write_direct(i, j, k); write_sync(i, j, k); } } return 0; }