summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Mick <dan.mick@inktank.com>2012-12-17 13:02:09 -0800
committerDan Mick <dan.mick@inktank.com>2012-12-17 13:02:09 -0800
commit76b102e1966d848285018f2b3789a20387843424 (patch)
tree303137413a1a30089b060b300a0d70934e9f4e80
parentada79ed0644f76fbc40d5bd8df2ddeb7ac77580d (diff)
downloadceph-76b102e1966d848285018f2b3789a20387843424.tar.gz
librbd: read_iterate: handle partial buffers (by zero-padding)
-rw-r--r--src/librbd/internal.cc17
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;