From 8a7a52dd9317d269b9cba00d20da15a3f204d4d0 Mon Sep 17 00:00:00 2001 From: mingyuez Date: Fri, 31 Jul 2015 12:06:05 +0800 Subject: [PATCH] rbd:'rbd purge image' will return failure without removing any snaps if the image has a protected snap Signed-off-by: mingyuez --- src/rbd.cc | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/rbd.cc b/src/rbd.cc index ee30e03ea14e..2df2e7c6aa5c 100644 --- a/src/rbd.cc +++ b/src/rbd.cc @@ -771,23 +771,37 @@ static int do_purge_snaps(librbd::Image& image) { MyProgressContext pc("Removing all snapshots"); std::vector snaps; + bool is_protected = false; int r = image.snap_list(snaps); if (r < 0) { pc.fail(); return r; - } - - for (size_t i = 0; i < snaps.size(); ++i) { - r = image.snap_remove(snaps[i].name.c_str()); - if (r < 0) { - pc.fail(); - return r; + } else if (0 == snaps.size()) { + return 0; + } else { + for (size_t i = 0; i < snaps.size(); ++i) { + r = image.snap_is_protected(snaps[i].name.c_str(), &is_protected); + if (r < 0) { + pc.fail(); + return r; + } else if (is_protected == true) { + pc.fail(); + cerr << "\r" <