From 6f3f17397ae77dac049288a4e819367d271d3e51 Mon Sep 17 00:00:00 2001 From: Danny Al-Gaaf Date: Tue, 12 Feb 2013 16:48:15 +0100 Subject: [PATCH] test_sync_io.c: add error handling Add error handling for open(), posix_memalign() and malloc(). Reuse code for read_* and write_* functions. Signed-off-by: Danny Al-Gaaf --- qa/workunits/direct_io/test_sync_io.c | 144 +++++++++++++++++--------- 1 file changed, 94 insertions(+), 50 deletions(-) diff --git a/qa/workunits/direct_io/test_sync_io.c b/qa/workunits/direct_io/test_sync_io.c index 613631e5fcfd..59d32cf972a9 100644 --- a/qa/workunits/direct_io/test_sync_io.c +++ b/qa/workunits/direct_io/test_sync_io.c @@ -8,6 +8,7 @@ #include #include #include +#include //#include "../client/ioctl.h" @@ -19,10 +20,15 @@ void write_pattern() { 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)); } @@ -41,7 +47,6 @@ int verify_pattern(char *buf, size_t len, uint64_t off) printf("error: offset %llu had %llu\n", (unsigned long long)expected, (unsigned long long)actual); exit(1); - return -1; } } return 0; @@ -57,13 +62,33 @@ void generate_pattern(void *buf, size_t len, uint64_t offset) 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); @@ -73,32 +98,50 @@ int read_direct(int buf_align, uint64_t offset, int len) 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); @@ -106,46 +149,47 @@ int write_direct(int buf_align, uint64_t offset, int len) 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) -- 2.47.3