]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd:'rbd purge image' will return failure without removing any snaps if the image... 5398/head
authormingyuez <zhao.mingyue@h3c.com>
Fri, 31 Jul 2015 04:06:05 +0000 (12:06 +0800)
committermingyuez <zhao.mingyue@h3c.com>
Fri, 31 Jul 2015 04:06:12 +0000 (12:06 +0800)
Signed-off-by: mingyuez <zhao.mingyue@h3c.com>
src/rbd.cc

index ee30e03ea14ee3230be1618673ebc7d3e6153d04..2df2e7c6aa5c1ac5c941eead52dbff96a951f88c 100644 (file)
@@ -771,23 +771,37 @@ static int do_purge_snaps(librbd::Image& image)
 {
   MyProgressContext pc("Removing all snapshots");
   std::vector<librbd::snap_info_t> 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" <<snaps[i].name.c_str()<< " is a protected snap."<< std::endl;
+        return -EBUSY;
+      }
+    }
+    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;
+      }
+      pc.update_progress(i + 1, snaps.size());
     }
-    pc.update_progress(i + 1, snaps.size());
-  }
 
-  pc.finish();
-  return 0;
+    pc.finish();
+    return 0;
+  }
 }
 
 static int do_protect_snap(librbd::Image& image, const char *snapname)