diff options
author | Sage Weil <sage@inktank.com> | 2013-09-16 22:52:21 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-17 06:27:35 -0700 |
commit | 7422bcafa3e4910c5f2cf0728b5d1aff2059ca50 (patch) | |
tree | 024223483b1d6c8632f917547e4b489b03b7d55e | |
parent | d66eaddeeea9624db165d19ce4bf86a42ad45c92 (diff) | |
download | ceph-7422bcafa3e4910c5f2cf0728b5d1aff2059ca50.tar.gz |
client: write inline data path
-rw-r--r-- | src/client/Client.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index c4a22455223..926a45a4bb6 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6095,6 +6095,29 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf) ldout(cct, 10) << " snaprealm " << *in->snaprealm << dendl; + if (in->inline_version < CEPH_INLINE_DISABLED) { + if (endoff > CEPH_INLINE_SIZE || !(have & CEPH_CAP_FILE_BUFFER)) { + r = migration_inline_data(in); + if (r < 0) + goto done; + } else { + uint32_t len = in->inline_data.length(); + + if (endoff < len) + in->inline_data.copy(endoff, len - endoff, bl); + + if (offset < len) + in->inline_data.splice(offset, len - offset); + else if (offset > len) + in->inline_data.append_zero(offset - len); + + in->inline_data.append(bl); + in->inline_version++; + + goto success; + } + } + if (cct->_conf->client_oc && (have & CEPH_CAP_FILE_BUFFER)) { // do buffered write if (!in->oset.dirty_or_tx) @@ -6145,7 +6168,7 @@ int Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf) } // if we get here, write was successful, update client metadata - +success: // time lat = ceph_clock_now(cct); lat -= start; |