From 3ccc3bb4bd35e57209852d460633e371b4d004e2 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 8 Sep 2015 15:47:37 -0400 Subject: [PATCH] librbd: diff_iterate needs to handle holes in parent images 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 --- src/librbd/DiffIterate.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/librbd/DiffIterate.cc b/src/librbd/DiffIterate.cc index 00a9ebae2b729..311758785a1bc 100644 --- a/src/librbd/DiffIterate.cc +++ b/src/librbd/DiffIterate.cc @@ -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 *diff = static_cast *>(arg); - diff->insert(off, len); + // it's possible for a discard to create a hole in the parent image -- ignore + if (exists) { + interval_set *diff = static_cast *>(arg); + diff->insert(off, len); + } return 0; } -- 2.39.5