libmultipath: cleanup old issues with directio checker
authorBenjamin Marzinski <bmarzins@redhat.com>
Wed, 19 Feb 2020 20:21:45 +0000 (14:21 -0600)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 2 Mar 2020 10:03:54 +0000 (11:03 +0100)
The directio checker manually aligns its directio buffer, instead of
using posix_memalign(). It also defaults the block size for the read to
512, which may be too small for 4k devices, and it only waits for 5 ns
for IO completion before giving up and setting the path to pending,
which means that in will virtually always set the path to pending on the
check when the IO is issued.

Reviewed-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/checkers/directio.c
tests/directio.c

index 649961a..503519e 100644 (file)
@@ -38,7 +38,6 @@ struct async_req {
        struct iocb io;
        unsigned int blksize;
        unsigned char * buf;
-       unsigned char * ptr;
        struct list_head node;
        int state; /* PATH_REMOVED means this is an orphan */
 };
@@ -174,7 +173,7 @@ int libcheck_init (struct checker * c)
 
        if (ioctl(c->fd, BLKBSZGET, &req->blksize) < 0) {
                c->msgid = MSG_DIRECTIO_BLOCKSIZE;
-               req->blksize = 512;
+               req->blksize = 4096;
        }
        if (req->blksize > 4096) {
                /*
@@ -185,8 +184,7 @@ int libcheck_init (struct checker * c)
        if (!req->blksize)
                goto out;
 
-       req->buf = (unsigned char *)malloc(req->blksize + pgsize);
-       if (!req->buf)
+       if (posix_memalign((void **)&req->buf, pgsize, req->blksize) != 0)
                goto out;
 
        flags = fcntl(c->fd, F_GETFL);
@@ -199,9 +197,6 @@ int libcheck_init (struct checker * c)
                ct->reset_flags = 1;
        }
 
-       req->ptr = (unsigned char *) (((unsigned long)req->buf + pgsize - 1) &
-                 (~(pgsize - 1)));
-
        /* Successfully initialized, return the context. */
        ct->req = req;
        c->context = (void *) ct;
@@ -298,7 +293,7 @@ get_events(struct aio_group *aio_grp, struct timespec *timeout)
 static int
 check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
 {
-       struct timespec timeout = { .tv_nsec = 5 };
+       struct timespec timeout = { .tv_nsec = 1000 };
        struct stat     sb;
        int             rc;
        long            r;
@@ -323,7 +318,7 @@ check_state(int fd, struct directio_context *ct, int sync, int timeout_secs)
 
                LOG(3, "starting new request");
                memset(&ct->req->io, 0, sizeof(struct iocb));
-               io_prep_pread(&ct->req->io, fd, ct->req->ptr,
+               io_prep_pread(&ct->req->io, fd, ct->req->buf,
                              ct->req->blksize, 0);
                ct->req->state = PATH_PENDING;
                if (io_submit(ct->aio_grp->ioctx, 1, ios) != 1) {
index 23fd2da..3cd7a52 100644 (file)
@@ -23,7 +23,6 @@
 #include <stddef.h>
 #include <setjmp.h>
 #include <stdlib.h>
-#define UNIT_TESTING /* enable memory testing in directio.c */
 #include <cmocka.h>
 #include "globals.c"
 #include "../libmultipath/checkers/directio.c"