[PATCH v2 07/14] libmultipath: io_err_stat: fix error handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Martin Wilck <mwilck@xxxxxxxx>

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 <mwilck@xxxxxxxx>
---
 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





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux