#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
+#include <errno.h>
//#include "../client/ioctl.h"
{
printf("writing pattern\n");
- int fd = open("foo", O_CREAT|O_WRONLY, 0644);
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));
}
printf("error: offset %llu had %llu\n", (unsigned long long)expected,
(unsigned long long)actual);
exit(1);
- return -1;
}
}
return 0;
verify_pattern(buf, len, offset);
}
-int read_direct(int buf_align, uint64_t offset, int len)
-{
- printf("read_direct buf_align %d offset %llu len %d\n", buf_align,
+int read_file(int buf_align, uint64_t offset, int len, int direct) {
+
+ printf("read_file buf_align %d offset %llu len %d\n", buf_align,
(unsigned long long)offset, len);
- int fd = open("foo", O_RDONLY|O_DIRECT);
void *rawbuf;
- int r = posix_memalign(&rawbuf, 4096, len + buf_align);
+ int r;
+ int flags;
+ if(direct)
+ flags = O_RDONLY|O_DIRECT;
+ else
+ flags = O_RDONLY;
+
+ int fd = open("foo", flags);
+ if (fd < 0) {
+ int err = errno;
+ printf("read_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+ exit(err);
+ }
+
+ if (!direct)
+ ioctl(fd, CEPH_IOC_SYNCIO);
+
+ if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
+ printf("read_file: error: posix_memalign failed with %d", r);
+ exit (r);
+ }
+
void *buf = (char *)rawbuf + buf_align;
memset(buf, 0, len);
r = pread(fd, buf, len, offset);
return r;
}
+int read_direct(int buf_align, uint64_t offset, int len)
+{
+ printf("read_direct buf_align %d offset %llu len %d\n", buf_align,
+ (unsigned long long)offset, len);
+ return read_file(buf_align, offset, len, 1);
+}
+
int read_sync(int buf_align, uint64_t offset, int len)
{
printf("read_sync buf_align %d offset %llu len %d\n", buf_align,
(unsigned long long)offset, len);
- int fd = open("foo", O_RDONLY);
- ioctl(fd, CEPH_IOC_SYNCIO);
- void *rawbuf;
- int r = posix_memalign(&rawbuf, 4096, len + buf_align);
- void *buf = (char *)rawbuf + buf_align;
- memset(buf, 0, len);
- r = pread(fd, buf, len, offset);
- close(fd);
- r = verify_pattern(buf, len, offset);
- free(rawbuf);
- return r;
+ return read_file(buf_align, offset, len, 0);
}
-int write_direct(int buf_align, uint64_t offset, int len)
+int write_file(int buf_align, uint64_t offset, int len, int direct)
{
- printf("write_direct buf_align %d offset %llu len %d\n", buf_align,
+ printf("write_file buf_align %d offset %llu len %d\n", buf_align,
(unsigned long long)offset, len);
- int fd = open("foo", O_WRONLY|O_DIRECT|O_CREAT, 0644);
void *rawbuf;
- posix_memalign(&rawbuf, 4096, len + buf_align);
- void *buf = (char *)rawbuf + buf_align;
int r;
+ int err = 0;
+ int flags;
+ if (direct)
+ flags = O_WRONLY|O_DIRECT|O_CREAT;
+ else
+ flags = O_WRONLY|O_CREAT;
+
+ int fd = open("foo", flags, 0644);
+ if (fd < 0) {
+ int err = errno;
+ printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+ exit(err);
+ }
+
+ if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
+ printf("write_file: error: posix_memalign failed with %d", r);
+ err = r;
+ goto out_close;
+ }
+
+ if (!direct)
+ ioctl(fd, CEPH_IOC_SYNCIO);
+
+ void *buf = (char *)rawbuf + buf_align;
generate_pattern(buf, len, offset);
close(fd);
fd = open("foo", O_RDONLY);
+ if (fd < 0) {
+ err = errno;
+ printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+ free(rawbuf);
+ goto out_unlink;
+ }
void *buf2 = malloc(len);
+ if (!buf2) {
+ err = -ENOMEM;
+ printf("write_file: error: malloc failed\n");
+ goto out_free;
+ }
+
memset(buf2, 0, len);
r = pread(fd, buf2, len, offset);
- close(fd);
-
r = verify_pattern(buf2, len, offset);
- unlink("foo");
- free(rawbuf);
free(buf2);
+out_free:
+ free(rawbuf);
+out_close:
+ close(fd);
+out_unlink:
+ unlink("foo");
+ if (err)
+ exit(err);
return r;
}
+int write_direct(int buf_align, uint64_t offset, int len)
+{
+ printf("write_direct buf_align %d offset %llu len %d\n", buf_align,
+ (unsigned long long)offset, len);
+ return write_file (buf_align, offset, len, 1);
+}
+
int write_sync(int buf_align, uint64_t offset, int len)
{
printf("write_sync buf_align %d offset %llu len %d\n", buf_align,
(unsigned long long)offset, len);
- int fd = open("foo", O_WRONLY|O_CREAT, 0644);
- ioctl(fd, CEPH_IOC_SYNCIO);
- void *rawbuf;
- int r = posix_memalign(&rawbuf, 4096, len + buf_align);
- void *buf = (char *)rawbuf + buf_align;
-
- generate_pattern(buf, len, offset);
-
- r = pwrite(fd, buf, len, offset);
- close(fd);
-
- fd = open("foo", O_RDONLY);
- void *buf2 = malloc(len);
- memset(buf2, 0, len);
- r = pread(fd, buf2, len, offset);
- close(fd);
-
- r = verify_pattern(buf2, len, offset);
-
- unlink("foo");
- free(buf2);
- free(rawbuf);
- return r;
+ return write_file (buf_align, offset, len, 0);
}
int main(int argc, char **argv)