diff options
author | Sage Weil <sage@inktank.com> | 2013-08-23 15:11:49 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-23 15:12:18 -0700 |
commit | cc3249b44a8f860ed06f627d68e8cd02b9bc1dc8 (patch) | |
tree | 1870e443dde964f4342a73591b8c6fa89fc7a451 | |
parent | 14a1e6ecd467320edcd8b2b70c538102e66d3a83 (diff) | |
download | ceph-cc3249b44a8f860ed06f627d68e8cd02b9bc1dc8.tar.gz |
osd/ReplicatedPG: require write payload match length
Hopefully this won't break old clients; I can't think of any. We *should*
be picky about our requests.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index a2a40058ac1..bca49024c0b 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2594,7 +2594,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops) case CEPH_OSD_OP_WRITE: ++ctx->num_write; { // write - if (op.extent.length > osd_op.indata.length()) { + if (op.extent.length != osd_op.indata.length()) { result = -EINVAL; break; } @@ -2629,9 +2629,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops) result = check_offset_and_length(op.extent.offset, op.extent.length); if (result < 0) break; - bufferlist nbl; - bp.copy(op.extent.length, nbl); - t.write(coll, soid, op.extent.offset, op.extent.length, nbl); + t.write(coll, soid, op.extent.offset, op.extent.length, osd_op.indata); write_update_size_and_usage(ctx->delta_stats, oi, ssc->snapset, ctx->modified_ranges, op.extent.offset, op.extent.length, true); if (!obs.exists) { @@ -2644,22 +2642,20 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops) case CEPH_OSD_OP_WRITEFULL: ++ctx->num_write; { // write full object - if (op.extent.length > osd_op.indata.length()) { + if (op.extent.length != osd_op.indata.length()) { result = -EINVAL; break; } result = check_offset_and_length(op.extent.offset, op.extent.length); if (result < 0) break; - bufferlist nbl; - bp.copy(op.extent.length, nbl); if (obs.exists) { t.truncate(coll, soid, 0); } else { ctx->delta_stats.num_objects++; obs.exists = true; } - t.write(coll, soid, op.extent.offset, op.extent.length, nbl); + t.write(coll, soid, op.extent.offset, op.extent.length, osd_op.indata); interval_set<uint64_t> ch; if (oi.size > 0) ch.insert(0, oi.size); |