diff options
Diffstat (limited to 'src/rgw/rgw_rados.cc')
-rw-r--r-- | src/rgw/rgw_rados.cc | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 31332b5993e..a520bafa730 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2639,31 +2639,31 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, state->io_ctx.locator_set_key(key); + read_len = len; + if (reading_from_head) { /* only when reading from the head object do we need to do the atomic test */ r = append_atomic_test(rctx, read_obj, op, &astate); if (r < 0) goto done_ret; - } - - read_len = len; - if (astate) { - if (!ofs && astate->data.length() >= len) { - bl = astate->data; - goto done; - } + if (astate) { + if (!ofs && astate->data.length() >= len) { + bl = astate->data; + goto done; + } - if (ofs < astate->data.length()) { - unsigned copy_len = min((uint64_t)astate->data.length(), len); - astate->data.copy(ofs, copy_len, bl); - read_len -= copy_len; - read_ofs += copy_len; - if (!read_len) - goto done; + if (ofs < astate->data.length()) { + unsigned copy_len = min((uint64_t)astate->data.length() - ofs, len); + astate->data.copy(ofs, copy_len, bl); + read_len -= copy_len; + read_ofs += copy_len; + if (!read_len) + goto done; - merge_bl = true; - pbl = &read_bl; + merge_bl = true; + pbl = &read_bl; + } } } |