From 0d414cea68b4ad5ab50df43332c3345a6dc669f5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 13 Sep 2016 13:39:35 -0400 Subject: [PATCH] os/bluestore: fix Extent leak on ExtentMap removal Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 6 +++--- src/os/bluestore/BlueStore.h | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 0263023161f61..deff326208804 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -1899,7 +1899,7 @@ int BlueStore::ExtentMap::compress_extent_map(uint64_t offset, uint64_t length) p->blob == n->blob && p->blob_offset + p->length == n->blob_offset) { p->length += n->length; - extent_map.erase(n++); + rm(n++); ++removed; } if (n == extent_map.end()) { @@ -1947,7 +1947,7 @@ void BlueStore::ExtentMap::punch_hole( // deref whole lextent old_extents->insert(*new Extent(p->logical_offset, p->blob_offset, p->length, p->blob)); - extent_map.erase(p++); + rm(p++); continue; } // deref head @@ -1956,7 +1956,7 @@ void BlueStore::ExtentMap::punch_hole( p->length - keep, p->blob)); extent_map.insert(*new Extent(end, p->blob_offset + p->length - keep, keep, p->blob)); - extent_map.erase(p); + rm(p); break; } } diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index d20601e59ba37..64e3831b62d38 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -598,6 +598,13 @@ public: /// seek to the first lextent including or after offset extent_map_t::iterator seek_lextent(uint64_t offset); + /// remove (and delete) an Extent + void rm(extent_map_t::iterator p) { + Extent *e = &*p; + extent_map.erase(p); + delete e; + } + bool has_any_lextents(uint64_t offset, uint64_t length); /// consolidate adjacent lextents in extent_map -- 2.39.5