\
/* ESX/SCSI */ \
f(WRITESAME, __CEPH_OSD_OP(WR, DATA, 38), "write-same") \
+ f(CMPEXT, __CEPH_OSD_OP(RD, DATA, 32), "cmpext") \
\
/** attrs **/ \
/* read */ \
case CEPH_OSD_OP_ZERO:
case CEPH_OSD_OP_APPEND:
case CEPH_OSD_OP_TRIMTRUNC:
+ case CEPH_OSD_OP_CMPEXT:
return true;
default:
return false;
}
}
+int PrimaryLogPG::do_extent_cmp(OpContext *ctx, OSDOp& osd_op)
+{
+ ceph_osd_op& op = osd_op.op;
+ vector<OSDOp> read_ops(1);
+ OSDOp& read_op = read_ops[0];
+ int result = 0;
+
+ read_op.op.op = CEPH_OSD_OP_SYNC_READ;
+ read_op.op.extent.offset = op.extent.offset;
+ read_op.op.extent.length = op.extent.length;
+ read_op.op.extent.truncate_seq = op.extent.truncate_seq;
+ read_op.op.extent.truncate_size = op.extent.truncate_size;
+
+ result = do_osd_ops(ctx, read_ops);
+ if (result < 0) {
+ derr << "do_extent_cmp do_osd_ops failed " << result << dendl;
+ return result;
+ }
+
+ if (read_op.outdata.length() != osd_op.indata.length())
+ return -EINVAL;
+
+ for (uint64_t p = 0; p < osd_op.indata.length(); p++) {
+ if (read_op.outdata[p] != osd_op.indata[p]) {
+ return (-MAX_ERRNO - p);
+ }
+ }
+
+ return result;
+}
+
int PrimaryLogPG::do_writesame(OpContext *ctx, OSDOp& osd_op)
{
ceph_osd_op& op = osd_op.op;
// --- READS ---
+ case CEPH_OSD_OP_CMPEXT:
+ ++ctx->num_read;
+ tracepoint(osd, do_osd_op_pre_extent_cmp, soid.oid.name.c_str(), soid.snap.val, oi.size, oi.truncate_seq, op.extent.offset, op.extent.length, op.extent.truncate_size, op.extent.truncate_seq);
+ result = do_extent_cmp(ctx, osd_op);
+ break;
+
case CEPH_OSD_OP_SYNC_READ:
if (pool.info.require_rollback()) {
result = -EOPNOTSUPP;
friend class C_ChecksumRead;
+ int do_extent_cmp(OpContext *ctx, OSDOp& osd_op);
int do_writesame(OpContext *ctx, OSDOp& osd_op);
bool pgls_filter(PGLSFilter *filter, hobject_t& sobj, bufferlist& outdata);
)
)
+TRACEPOINT_EVENT(osd, do_osd_op_pre_extent_cmp,
+ TP_ARGS(
+ const char*, oid,
+ uint64_t, snap,
+ uint64_t, osize,
+ uint32_t, oseq,
+ uint64_t, offset,
+ uint64_t, length,
+ uint64_t, truncate_size,
+ uint32_t, truncate_seq),
+ TP_FIELDS(
+ ctf_string(oid, oid)
+ ctf_integer(uint64_t, snap, snap)
+ ctf_integer(uint64_t, osize, osize)
+ ctf_integer(uint32_t, oseq, oseq)
+ ctf_integer(uint64_t, offset, offset)
+ ctf_integer(uint64_t, length, length)
+ ctf_integer(uint64_t, truncate_size, truncate_size)
+ ctf_integer(uint32_t, truncate_seq, truncate_seq)
+ )
+)
+
TRACEPOINT_EVENT(osd, do_osd_op_pre_read,
TP_ARGS(
const char*, oid,