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>
(cherry picked from commit
3ccc3bb4bd35e57209852d460633e371b4d004e2)
Conflicts:
src/librbd/DiffIterate.cc : file doesn't exist in hammer, logic is in internal.cc
int 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;
}