summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-16 22:52:21 -0700
committerSage Weil <sage@inktank.com>2013-09-17 06:27:35 -0700
commit7422bcafa3e4910c5f2cf0728b5d1aff2059ca50 (patch)
tree024223483b1d6c8632f917547e4b489b03b7d55e
parentd66eaddeeea9624db165d19ce4bf86a42ad45c92 (diff)
downloadceph-7422bcafa3e4910c5f2cf0728b5d1aff2059ca50.tar.gz
client: write inline data path
-rw-r--r--src/client/Client.cc25
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;