diff options
author | Dan Mick <dan.mick@inktank.com> | 2012-12-17 13:02:09 -0800 |
---|---|---|
committer | Dan Mick <dan.mick@inktank.com> | 2012-12-17 13:02:09 -0800 |
commit | 76b102e1966d848285018f2b3789a20387843424 (patch) | |
tree | 303137413a1a30089b060b300a0d70934e9f4e80 | |
parent | ada79ed0644f76fbc40d5bd8df2ddeb7ac77580d (diff) | |
download | ceph-76b102e1966d848285018f2b3789a20387843424.tar.gz |
librbd: read_iterate: handle partial buffers (by zero-padding)
-rw-r--r-- | src/librbd/internal.cc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 25f723b4b56..42852279891 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -2206,7 +2206,22 @@ reprotect_and_return_err: if (ret < 0) return ret; - r = cb(total_read, ret, bl.c_str(), arg); + // bl might be smaller than ret/requested length, or even + // 0-length. If 0, call back with NULL buffer. If less, zerofill + // here (because someone's going to have to). + // r = cb(total_read, ret, bl.c_str(), arg); + if (bl.length() == 0) { + ldout(ictx->cct, 20) << "read_iterate callback with NULL" << dendl; + r = cb(total_read, ret, NULL, arg); + } else { + if (bl.length() < read_len) { + ldout(ictx->cct, 20) << "read_iterate callback zero-padding " << read_len - bl.length() << dendl; + bl.append_zero(read_len - bl.length()); + assert(bl.length() == read_len); + } + ldout(ictx->cct, 20) << "read_iterate callback full " << read_len << dendl; + r = cb(total_read, ret, bl.c_str(), arg); + } if (r < 0) return r; |