diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 2b9c7e778ef09..f6713d39972c5 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -892,6 +892,7 @@ OPTION(rbd_clone_copy_on_read, OPT_BOOL, false) OPTION(rbd_blacklist_on_break_lock, OPT_BOOL, true) // whether to blacklist clients whose lock was broken OPTION(rbd_blacklist_expire_seconds, OPT_INT, 0) // number of seconds to blacklist - set to 0 for OSD default OPTION(rbd_request_timed_out_seconds, OPT_INT, 30) // number of seconds before maint request times out +OPTION(rbd_skip_partial_discard, OPT_BOOL, false) // when trying to discard a range inside an object, set to true to skip zeroing the range. /* * The following options change the behavior for librbd's image creation methods that diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 2f1d8ca80943b..07f952a9f8af0 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -3576,9 +3576,13 @@ namespace librbd { req = new AioTruncate(ictx, p->oid.name, p->objectno, p->offset, objectx, object_overlap, snapc, snap_id, req_comp); } else { - req = new AioZero(ictx, p->oid.name, p->objectno, p->offset, p->length, - objectx, object_overlap, - snapc, snap_id, req_comp); + if(ictx->cct->_conf->rbd_skip_partial_discard) { + continue; + } else { + req = new AioZero(ictx, p->oid.name, p->objectno, p->offset, p->length, + objectx, object_overlap, + snapc, snap_id, req_comp); + } } r = req->send();