On Thu, Oct 26, 2023 at 07:41:46PM +0200, [email protected] wrote:
> From: Martin Wilck <[email protected]>
>
> libaio uses a different error return convention than glibc. The error code is
> not returned in errno, but as the negated return value of the function.
> Adapt the error handling code in io_err_stat.c. Don't print an error message
> for failure of io_cancel(), which always returns -EINPRPOGRESS.
>
> Signed-off-by: Martin Wilck <[email protected]>
Reviewed-by: Benjamin Marzinski <[email protected]>
> ---
> libmultipath/io_err_stat.c | 36 ++++++++++++++++--------------------
> 1 file changed, 16 insertions(+), 20 deletions(-)
>
> diff --git a/libmultipath/io_err_stat.c b/libmultipath/io_err_stat.c
> index 5749003..1c59445 100644
> --- a/libmultipath/io_err_stat.c
> +++ b/libmultipath/io_err_stat.c
> @@ -19,7 +19,6 @@
> #include <sys/ioctl.h>
> #include <linux/fs.h>
> #include <libaio.h>
> -#include <errno.h>
> #include <sys/mman.h>
> #include <sys/select.h>
>
> @@ -469,7 +468,7 @@ static void end_io_err_stat(struct io_err_stat_path *pp)
>
> static int send_each_async_io(struct dio_ctx *ct, int fd, char *dev)
> {
> - int rc = -1;
> + int rc;
>
> if (ct->io_starttime.tv_nsec == 0 &&
> ct->io_starttime.tv_sec == 0) {
> @@ -477,15 +476,15 @@ static int send_each_async_io(struct dio_ctx *ct, int
> fd, char *dev)
>
> get_monotonic_time(&ct->io_starttime);
> io_prep_pread(&ct->io, fd, ct->buf, ct->blksize, 0);
> - if (io_submit(ioctx, 1, ios) != 1) {
> - io_err_stat_log(2, "%s: io_submit error %i",
> - dev, errno);
> - return rc;
> + if ((rc = io_submit(ioctx, 1, ios)) != 1) {
> + io_err_stat_log(2, "%s: io_submit error %s",
> + dev, strerror(-rc));
> + return -1;
> }
> - rc = 0;
> + return 0;
> }
>
> - return rc;
> + return -1;
> }
>
> static void send_batch_async_ios(struct io_err_stat_path *pp)
> @@ -530,8 +529,8 @@ static int try_to_cancel_timeout_io(struct dio_ctx *ct,
> struct timespec *t,
> io_err_stat_log(5, "%s: abort check on timeout", dev);
> r = io_cancel(ioctx, ios[0], &event);
> if (r)
> - io_err_stat_log(5, "%s: io_cancel error %i",
> - dev, errno);
> + io_err_stat_log(5, "%s: io_cancel error %s",
> + dev, strerror(-r));
> rc = PATH_TIMEOUT;
> } else {
> rc = PATH_PENDING;
> @@ -560,7 +559,7 @@ static void poll_async_io_timeout(void)
> static void cancel_inflight_io(struct io_err_stat_path *pp)
> {
> struct io_event event;
> - int i, r;
> + int i;
>
> for (i = 0; i < CONCUR_NR_EVENT; i++) {
> struct dio_ctx *ct = pp->dio_ctx_array + i;
> @@ -571,10 +570,7 @@ static void cancel_inflight_io(struct io_err_stat_path
> *pp)
> continue;
> io_err_stat_log(5, "%s: abort infligh io",
> pp->devname);
> - r = io_cancel(ioctx, ios[0], &event);
> - if (r)
> - io_err_stat_log(5, "%s: io_cancel error %d, %i",
> - pp->devname, r, errno);
> + io_cancel(ioctx, ios[0], &event);
> }
> }
>
> @@ -610,12 +606,11 @@ static void process_async_ios_event(int timeout_nsecs,
> char *dev)
> int i, n;
> struct timespec timeout = { .tv_nsec = timeout_nsecs };
>
> - errno = 0;
> pthread_testcancel();
> n = io_getevents(ioctx, 1L, CONCUR_NR_EVENT, events, &timeout);
> if (n < 0) {
> - io_err_stat_log(3, "%s: async io events returned %d (errno=%s)",
> - dev, n, strerror(errno));
> + io_err_stat_log(3, "%s: io_getevents returned %s",
> + dev, strerror(-n));
> } else {
> for (i = 0; i < n; i++)
> handle_async_io_done_event(&events[i]);
> @@ -704,8 +699,9 @@ int start_io_err_stat_thread(void *data)
> if (uatomic_read(&io_err_thread_running) == 1)
> return 0;
>
> - if (io_setup(CONCUR_NR_EVENT * NR_IOSTAT_PATHS, &ioctx) != 0) {
> - io_err_stat_log(1, "io_setup failed - increase
> /proc/sys/fs/aio-nr ?");
> + if ((ret = io_setup(NR_IOSTAT_PATHS * CONCUR_NR_EVENT, &ioctx)) != 0) {
> + io_err_stat_log(1, "io_setup failed: %s, increase
> /proc/sys/fs/aio-nr ?",
> + strerror(-ret));
> return 1;
> }
>
> --
> 2.42.0