From 3cbd6bb9f5cf5a2779e02e4612506de41aca8251 Mon Sep 17 00:00:00 2001 From: Dmitry Monakhov Date: Fri, 7 Apr 2017 07:56:49 +0300 Subject: [PATCH] engine: e4defrag fix error reporting IOC_MOVE_EXT returns 0 if the requested range is beyond i_size. In that case we currently set io_u->resid = io_u->xfer_buflen, but io_queue_event() interprets that as a zero read and fails with EIO. We definitely do not want this behaviour so set io_u->error explicitly to EINVAL so we fail with that instead when we are in this scenario. --- engines/e4defrag.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/e4defrag.c b/engines/e4defrag.c index 1e4996f1..4b444888 100644 --- a/engines/e4defrag.c +++ b/engines/e4defrag.c @@ -172,8 +172,13 @@ static int fio_e4defrag_queue(struct thread_data *td, struct io_u *io_u) len = io_u->xfer_buflen; if (len != io_u->xfer_buflen) { - io_u->resid = io_u->xfer_buflen - len; - io_u->error = 0; + if (len) { + io_u->resid = io_u->xfer_buflen - len; + io_u->error = 0; + } else { + /* access beyond i_size */ + io_u->error = EINVAL; + } } if (ret) io_u->error = errno; -- 2.25.1