From 30c47566d17d4f200f12a71b6d1c8295b76a0943 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 22 Jun 2011 12:37:24 -0700 Subject: [PATCH] librbd: track block_ofs instead of ofs in aio_sparse_read callback --- src/librbd.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/librbd.cc b/src/librbd.cc index 12674d26babc8..73dba632c9430 100644 --- a/src/librbd.cc +++ b/src/librbd.cc @@ -1242,24 +1242,27 @@ void AioBlockCompletion::complete(ssize_t r) map::iterator iter; uint64_t bl_ofs = 0, buf_bl_pos = 0; dout(10) << "ofs=" << ofs << " len=" << len << dendl; + uint64_t block_ofs = ofs; for (iter = m.begin(); iter != m.end(); ++iter) { uint64_t extent_ofs = iter->first; size_t extent_len = iter->second; dout(10) << "extent_ofs=" << extent_ofs << " extent_len=" << extent_len << dendl; + dout(10) << "block_ofs=" << block_ofs << dendl; /* a hole? */ - if (extent_ofs - ofs) { + if (extent_ofs - block_ofs) { dout(10) << "<1>zeroing " << buf_bl_pos << "~" << extent_ofs << dendl; dout(10) << "buf=" << (void *)(buf + buf_bl_pos) << "~" << (void *)(buf + extent_ofs - ofs - 1) << dendl; - memset(buf + buf_bl_pos, 0, extent_ofs - ofs); + memset(buf + buf_bl_pos, 0, extent_ofs - block_ofs); } if (bl_ofs + extent_len > len) { r = -EIO; break; } - buf_bl_pos += extent_ofs - ofs; + buf_bl_pos += extent_ofs - block_ofs; + block_ofs = extent_ofs; /* data */ dout(10) << "<2>copying " << buf_bl_pos << "~" << extent_len << " from ofs=" << bl_ofs << dendl; @@ -1267,6 +1270,7 @@ void AioBlockCompletion::complete(ssize_t r) memcpy(buf + buf_bl_pos, data_bl.c_str() + bl_ofs, extent_len); bl_ofs += extent_len; buf_bl_pos += extent_len; + block_ofs += extent_len; } /* last hole */ -- 2.39.5