Fix bug.
authorRobert Haas <rhaas@postgresql.org>
Tue, 29 Apr 2014 15:38:36 +0000 (11:38 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 29 Apr 2014 15:38:36 +0000 (11:38 -0400)
src/backend/utils/mmgr/sb_map.c
src/backend/utils/mmgr/sb_region.c
src/include/utils/sb_map.h

index e66c2c076bde7a69663d52d25e692c6644bccd54..7c629dfe0f1387d633a3a7ea7344b98264f2a9eb 100644 (file)
@@ -41,6 +41,7 @@ const uint64 maxpages_4b = UINT64CONST(0x100000000) / FPM_PAGE_SIZE;
 struct sb_map
 {
        relptr(sb_map) self;
+       Size    offset;
        Size    npages;
        bool    use64;
 };
@@ -89,9 +90,10 @@ sb_map_size(char *base, Size npages)
  * been set.
  */
 void
-sb_map_initialize(sb_map *m, char *base, Size npages)
+sb_map_initialize(sb_map *m, char *base, Size offset, Size npages)
 {
        relptr_store(base, m->self, m);
+       m->offset = offset;
        m->npages = npages;
        if (sizeof(Size) <= 4 || (base != NULL && npages < maxpages_4b))
                m->use64 = false;
@@ -106,6 +108,8 @@ void
 sb_map_set(sb_map *m, Size pageno, void *ptr)
 {
        char   *base = sb_map_base(m);
+       Assert(pageno >= m->offset);
+       pageno -= m->offset;
        Assert(pageno < m->npages);
 
        if (m->use64)
@@ -122,6 +126,8 @@ void *
 sb_map_get(sb_map *m, Size pageno)
 {
        char   *base = sb_map_base(m);
+       Assert(pageno >= m->offset);
+       pageno -= m->offset;
        Assert(pageno < m->npages);
 
        if (m->use64)
index 974091b34cbe09352328624f282f5746e2415715..47ad11c266d5f5e85ea53091aa5566b60d65b242 100644 (file)
@@ -394,7 +394,8 @@ sb_private_region_for_allocator(Size npages)
        FreePageManagerInitialize(region->fpm, region->region_start, NULL, false);
        FreePageManagerPut(region->fpm, metadata_bytes / FPM_PAGE_SIZE,
                                           new_region_net_pages);
-       sb_map_initialize(region->pagemap, NULL, new_region_net_pages);
+       sb_map_initialize(region->pagemap, NULL, metadata_bytes / FPM_PAGE_SIZE,
+                                         new_region_net_pages);
        region->contiguous_pages = new_region_net_pages; /* Now fix the value. */
        freelist = Min(fls(new_region_net_pages), NUM_PRIVATE_FREELISTS);
        dlist_push_head(&private_freelist[freelist], &region->fl_node);
index a0683537c47aee9083899ae2b7eb9a136a027714..519bf52290d95e76e422f51197a50321b4501486 100644 (file)
@@ -17,7 +17,7 @@
 typedef struct sb_map sb_map;
 
 extern Size sb_map_size(char *base, Size npages);
-extern void sb_map_initialize(sb_map *, char *base, Size npages);
+extern void sb_map_initialize(sb_map *, char *base, Size offset, Size npages);
 extern void sb_map_set(sb_map *, Size pageno, void *ptr);
 extern void *sb_map_get(sb_map *, Size pageno);