Imported Upstream version 0.7.0
[platform/upstream/multipath-tools.git] / libmultipath / checkers / directio.c
index b517039..ce60e4c 100644 (file)
@@ -12,7 +12,7 @@
 #include <sys/ioctl.h>
 #include <linux/fs.h>
 #include <errno.h>
-#include <asm/unistd.h>
+#include <unistd.h>
 #include <libaio.h>
 
 #include "checkers.h"
@@ -82,7 +82,7 @@ int libcheck_init (struct checker * c)
        ct->ptr = (unsigned char *) (((unsigned long)ct->buf + pgsize - 1) &
                  (~(pgsize - 1)));
 
-       /* Sucessfully initialized, return the context. */
+       /* Successfully initialized, return the context. */
        c->context = (void *) ct;
        return 0;
 
@@ -104,9 +104,11 @@ void libcheck_free (struct checker * c)
 
        if (ct->reset_flags) {
                if ((flags = fcntl(c->fd, F_GETFL)) >= 0) {
+                       int ret __attribute__ ((unused));
+
                        flags &= ~O_DIRECT;
                        /* No point in checking for errors */
-                       fcntl(c->fd, F_SETFL, flags);
+                       ret = fcntl(c->fd, F_SETFL, flags);
                }
        }
 
@@ -116,6 +118,11 @@ void libcheck_free (struct checker * c)
        free(ct);
 }
 
+void libcheck_repair (struct checker * c)
+{
+       return;
+}
+
 static int
 check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
 {
@@ -153,10 +160,22 @@ check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
        if (r < 0 ) {
                LOG(3, "async io getevents returned %li (errno=%s)", r,
                    strerror(errno));
+               ct->running = 0;
                rc = PATH_UNCHECKED;
        } else if (r < 1L) {
                if (ct->running > timeout_secs || sync) {
+                       struct iocb *ios[1] = { &ct->io };
+
                        LOG(3, "abort check on timeout");
+                       r = io_cancel(ct->ioctx, ios[0], &event);
+                       /*
+                        * Only reset ct->running if we really
+                        * could abort the pending I/O
+                        */
+                       if (r)
+                               LOG(3, "io_cancel error %i", errno);
+                       else
+                               ct->running = 0;
                        rc = PATH_DOWN;
                } else {
                        LOG(3, "async io pending");