diff options
author | Sage Weil <sage@inktank.com> | 2013-09-16 22:52:10 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-17 06:27:35 -0700 |
commit | d66eaddeeea9624db165d19ce4bf86a42ad45c92 (patch) | |
tree | d9f83b5c18ef00f20d39616c8526aeac43636573 | |
parent | 7f1e521879e46cc77c773441a9a5731832c267ca (diff) | |
download | ceph-d66eaddeeea9624db165d19ce4bf86a42ad45c92.tar.gz |
client: read inline data path
-rw-r--r-- | src/client/Client.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index f48862d9ca1..c4a22455223 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5762,6 +5762,30 @@ int Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl) movepos = true; } + if (in->inline_version < CEPH_INLINE_DISABLED) { + if (!(have & CEPH_CAP_FILE_CACHE)) { + r = migration_inline_data(in); + if (r < 0) + goto done; + } else { + uint32_t len = in->inline_data.length(); + + uint64_t endoff = offset + size; + if (endoff > in->size) + endoff = in->size; + + if (endoff > len) { + if (offset < len) + bl->substr_of(in->inline_data, offset, len - offset); + bl->append_zero(endoff - len); + } else if (endoff > (uint64_t)offset) { + bl->substr_of(in->inline_data, offset, endoff - offset); + } + + goto success; + } + } + if (!conf->client_debug_force_sync_read && (cct->_conf->client_oc && (have & CEPH_CAP_FILE_CACHE))) { @@ -5778,6 +5802,8 @@ int Client::_read(Fh *f, int64_t offset, uint64_t size, bufferlist *bl) goto done; } +success: + if (movepos) { // adjust fd pos f->pos = offset+bl->length(); |