From: Samuel Just Date: Wed, 16 Nov 2016 18:19:27 +0000 (-0800) Subject: ReplicatedPG: clamp SPARSE_READ to object size for ec pool X-Git-Tag: v11.1.0~245^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F11701%2Fhead;p=ceph.git ReplicatedPG: clamp SPARSE_READ to object size for ec pool Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index a159391608b..b69e90349d7 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4520,12 +4520,28 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) ++ctx->num_read; if (pool.info.ec_pool()) { // translate sparse read to a normal one if not supported - ctx->pending_async_reads.push_back( - make_pair( - boost::make_tuple(op.extent.offset, op.extent.length, op.flags), - make_pair(&osd_op.outdata, new ToSparseReadResult(osd_op.outdata, op.extent.offset, - op.extent.length)))); - dout(10) << " async_read (was sparse_read) noted for " << soid << dendl; + uint64_t offset = op.extent.offset; + uint64_t length = op.extent.length; + if (offset > oi.size) { + length = 0; + } else if (offset + length > oi.size) { + length = oi.size - offset; + } + if (length > 0) { + ctx->pending_async_reads.push_back( + make_pair( + boost::make_tuple(offset, length, op.flags), + make_pair( + &osd_op.outdata, + new ToSparseReadResult( + osd_op.outdata, offset, + op.extent.length /* updated by the callback */)))); + dout(10) << " async_read (was sparse_read) noted for " << soid << dendl; + } else { + dout(10) << " sparse read ended up empty for " << soid << dendl; + map extents; + ::encode(extents, osd_op.outdata); + } } else { // read into a buffer bufferlist bl;