From 03b0b03071f3e04754896664c69f73759ddb907a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 1 May 2017 21:06:19 -0400 Subject: [PATCH] cls_rbd: default initialize snapshot namespace for legacy clients Creating a snapshot on >=Kraken OSDs using <=Jewel clients can result in an improperly initialized snapshot namespace. As a result, attempting to remove the snapshot using a >=Kraken client will result in an -EINVAL error. Fixes: http://tracker.ceph.com/issues/19413 Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd.cc | 6 ++++++ src/cls/rbd/cls_rbd.h | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 206028c83ec63..c5dc0cf45ebad 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -1554,6 +1554,12 @@ int snapshot_add(cls_method_context_t hctx, bufferlist *in, bufferlist *out) return -EINVAL; } + if (boost::get( + &snap_meta.snapshot_namespace.snapshot_namespace) != nullptr) { + CLS_ERR("Unknown snapshot namespace provided"); + return -EINVAL; + } + CLS_LOG(20, "snapshot_add name=%s id=%llu", snap_meta.name.c_str(), (unsigned long long)snap_meta.id.val); diff --git a/src/cls/rbd/cls_rbd.h b/src/cls/rbd/cls_rbd.h index c1f17b845e5e5..f08fc1b1f0a65 100644 --- a/src/cls/rbd/cls_rbd.h +++ b/src/cls/rbd/cls_rbd.h @@ -66,7 +66,8 @@ struct cls_rbd_snap { cls_rbd_parent parent; uint64_t flags; utime_t timestamp; - cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace; + cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace = { + cls::rbd::UserSnapshotNamespace{}}; /// true if we have a parent bool has_parent() const { @@ -107,8 +108,6 @@ struct cls_rbd_snap { } if (struct_v >= 5) { ::decode(snapshot_namespace, p); - } else { - snapshot_namespace = cls::rbd::SnapshotNamespaceOnDisk(cls::rbd::UserSnapshotNamespace()); } if (struct_v >= 6) { ::decode(timestamp, p);