summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-16 22:52:10 -0700
committerSage Weil <sage@inktank.com>2013-09-17 06:27:35 -0700
commitd66eaddeeea9624db165d19ce4bf86a42ad45c92 (patch)
treed9f83b5c18ef00f20d39616c8526aeac43636573
parent7f1e521879e46cc77c773441a9a5731832c267ca (diff)
downloadceph-d66eaddeeea9624db165d19ce4bf86a42ad45c92.tar.gz
client: read inline data path
-rw-r--r--src/client/Client.cc26
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();