]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: diff_iterate needs to handle holes in parent images 5843/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 8 Sep 2015 19:47:37 +0000 (15:47 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 8 Sep 2015 19:47:37 +0000 (15:47 -0400)
If a clone's parent image snapshot includes a discarded extent,
this was previously causing an assert failure.  Instead, ignore
any discard holes in the parent image.

Fixes: #12885
Backport: hammer
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/DiffIterate.cc

index 00a9ebae2b72991c57ad486296384530826d78ae..311758785a1bce507ab8138bd068daf7856d327a 100644 (file)
@@ -513,12 +513,11 @@ int DiffIterate::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id,
 
 int DiffIterate::simple_diff_cb(uint64_t off, size_t len, int exists,
                                 void *arg) {
-  // This reads the existing extents in a parent from the beginning
-  // of time.  Since images are thin-provisioned, the extents will
-  // always represent data, not holes.
-  assert(exists);
-  interval_set<uint64_t> *diff = static_cast<interval_set<uint64_t> *>(arg);
-  diff->insert(off, len);
+  // it's possible for a discard to create a hole in the parent image -- ignore
+  if (exists) {
+    interval_set<uint64_t> *diff = static_cast<interval_set<uint64_t> *>(arg);
+    diff->insert(off, len);
+  }
   return 0;
 }