From 58212b1245373b6f015cbff11844d33a900bf3cb Mon Sep 17 00:00:00 2001 From: Adam Crume Date: Tue, 17 Jun 2014 13:24:45 -0700 Subject: [PATCH] osd: Only normalize extent if op uses extent Code in ReplicatedPG was reading and modifying ceph_osd_op.extent, even though that is a member of a union and only valid for some ops. Signed-off-by: Adam Crume --- src/include/rados.h | 19 +++++++++++++++++++ src/osd/ReplicatedPG.cc | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/include/rados.h b/src/include/rados.h index 0c9791d9d565e..1ce5c2519cfbb 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -334,6 +334,25 @@ static inline int ceph_osd_op_mode_cache(int op) { return op & CEPH_OSD_OP_MODE_CACHE; } +static inline int ceph_osd_op_uses_extent(int op) +{ + switch(op) { + case CEPH_OSD_OP_READ: + case CEPH_OSD_OP_MAPEXT: + case CEPH_OSD_OP_MASKTRUNC: + case CEPH_OSD_OP_SPARSE_READ: + case CEPH_OSD_OP_SYNC_READ: + case CEPH_OSD_OP_WRITE: + case CEPH_OSD_OP_WRITEFULL: + case CEPH_OSD_OP_TRUNCATE: + case CEPH_OSD_OP_ZERO: + case CEPH_OSD_OP_APPEND: + case CEPH_OSD_OP_TRIMTRUNC: + return true; + default: + return false; + } +} /* * note that the following tmap stuff is also defined in the ceph librados.h diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 52e62986f3cdf..bad48726029fa 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2973,7 +2973,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } // munge -1 truncate to 0 truncate - if (op.extent.truncate_seq == 1 && op.extent.truncate_size == (-1ULL)) { + if (ceph_osd_op_uses_extent(op.op) && + op.extent.truncate_seq == 1 && + op.extent.truncate_size == (-1ULL)) { op.extent.truncate_size = 0; op.extent.truncate_seq = 0; } -- 2.39.5