]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test_sync_io.c: add error handling 59/head
authorDanny Al-Gaaf <danny.al-gaaf@bisect.de>
Tue, 12 Feb 2013 15:48:15 +0000 (16:48 +0100)
committerDanny Al-Gaaf <danny.al-gaaf@bisect.de>
Fri, 15 Feb 2013 09:22:49 +0000 (10:22 +0100)
Add error handling for open(), posix_memalign() and malloc().
Reuse code for read_* and write_* functions.

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
qa/workunits/direct_io/test_sync_io.c

index 613631e5fcfd105d2d87b2c180ad24e44d1e5d6d..59d32cf972a9c3dfc279056be4cad68186c2a016 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sys/ioctl.h>
+#include <errno.h>
 
 //#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)