]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix Extent leak on ExtentMap removal
authorSage Weil <sage@redhat.com>
Tue, 13 Sep 2016 17:39:35 +0000 (13:39 -0400)
committerSage Weil <sage@redhat.com>
Wed, 14 Sep 2016 14:10:38 +0000 (10:10 -0400)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 0263023161f61e170db7eebb45513dc65130f8d7..deff326208804638dd8c053807263cb45bf7cc45 100644 (file)
@@ -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;
   }
 }
index d20601e59ba3793d97c133e8fd2808c16745b49b..64e3831b62d384c745514d12c6539205bff77ded 100644 (file)
@@ -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