[lvm-devel] master - bcache/sync io engine: handle short ios
Joe Thornber
thornber at sourceware.org
Fri May 11 04:41:00 UTC 2018
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5f780813f295cd927d92d669ab086063adb1534e
Commit: 5f780813f295cd927d92d669ab086063adb1534e
Parent: 39ce38eb8868e367fa796ddb12b1020647d14c63
Author: Joe Thornber <ejt at redhat.com>
AuthorDate: Fri May 11 05:37:47 2018 +0100
Committer: Joe Thornber <ejt at redhat.com>
CommitterDate: Fri May 11 05:37:47 2018 +0100
bcache/sync io engine: handle short ios
---
lib/device/bcache.c | 45 ++++++++++++++++++++++++++++++---------------
1 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/lib/device/bcache.c b/lib/device/bcache.c
index 7a221c5..9085d87 100644
--- a/lib/device/bcache.c
+++ b/lib/device/bcache.c
@@ -283,7 +283,6 @@ struct io_engine *create_async_io_engine(void)
struct sync_io {
struct dm_list list;
void *context;
- int err;
};
struct sync_engine {
@@ -306,30 +305,46 @@ static bool _sync_issue(struct io_engine *ioe, enum dir d, int fd,
sector_t sb, sector_t se, void *data, void *context)
{
int r;
- uint64_t len = (se - sb) * 512;
+ uint64_t len = (se - sb) * 512, where;
struct sync_engine *e = _to_sync(ioe);
struct sync_io *io = malloc(sizeof(*io));
- if (!io)
+ if (!io) {
+ log_warn("unable to allocate sync_io");
return false;
+ }
- r = lseek(fd, sb * 512, SEEK_SET);
- if (r < 0)
+ where = sb * 512;
+ r = lseek(fd, where, SEEK_SET);
+ if (r < 0) {
+ log_warn("unable to seek to position %llu", (unsigned long long) where);
return false;
+ }
- do {
- if (d == DIR_READ)
- r = read(fd, data, len);
- else
- r = write(fd, data, len);
+ while (len) {
+ do {
+ if (d == DIR_READ)
+ r = read(fd, data, len);
+ else
+ r = write(fd, data, len);
+
+ } while ((r < 0) && ((r == EINTR) || (r == EAGAIN)));
- } while (r == EINTR || r == EAGAIN);
+ if (r < 0) {
+ log_warn("io failed %d", r);
+ return false;
+ }
+
+ len -= r;
+ }
+
+ if (len) {
+ log_warn("short io %u bytes remaining", (unsigned) len);
+ return false;
+ }
- if (r != len)
- r = -EIO;
dm_list_add(&e->complete, &io->list);
io->context = context;
- io->err = r < 0 ? r : 0;
return true;
}
@@ -340,7 +355,7 @@ static bool _sync_wait(struct io_engine *ioe, io_complete_fn fn)
struct sync_engine *e = _to_sync(ioe);
dm_list_iterate_items_safe(io, tmp, &e->complete) {
- fn(io->context, io->err);
+ fn(io->context, 0);
dm_list_del(&io->list);
dm_free(io);
}
More information about the lvm-devel
mailing list