From 9dfd60d11f7c9f12d3c0efa5e6fb0e2b1a67c4d3 Mon Sep 17 00:00:00 2001 From: Tomohiro Kusumi Date: Sun, 6 Nov 2016 23:29:54 +0900 Subject: [PATCH] sbin/hammer: Split alloc_bigblock() into two functions [2/2] This function is currently only used by zone-3, but it's actually only usable by zone-3 from the way it's implemented, so rename it to alloc_undo_bigblock() and get rid of zone argument. The way blockmap offsets (in root volume) get updated for zone-3 differs from other zones like 8/9/10/11, and this function which doesn't update blockmap offsets on allocation only works against zone-3. --- sbin/hammer/blockmap.c | 23 ++++++++++++++--------- sbin/hammer/hammer_util.h | 2 +- sbin/hammer/ondisk.c | 3 +-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/sbin/hammer/blockmap.c b/sbin/hammer/blockmap.c index 74d8981b19..ccb0910bdc 100644 --- a/sbin/hammer/blockmap.c +++ b/sbin/hammer/blockmap.c @@ -56,13 +56,11 @@ bootstrap_bigblock(struct volume_info *volume) } /* - * Directly allocate a whole big-block. - * This is actually only needed by zone-3 for UNDO/REDO FIFO. + * Allocate a big-block for zone-3 for UNDO/REDO FIFO. */ hammer_off_t -alloc_bigblock(struct volume_info *volume, int zone) +alloc_undo_bigblock(struct volume_info *volume) { - struct volume_info *root_vol; hammer_blockmap_t freemap; struct buffer_info *buffer1 = NULL; struct buffer_info *buffer2 = NULL; @@ -72,11 +70,15 @@ alloc_bigblock(struct volume_info *volume, int zone) hammer_off_t layer2_offset; hammer_off_t result_offset; - result_offset = bootstrap_bigblock(volume); + /* Only root volume needs formatting */ + assert(volume->vol_no == HAMMER_ROOT_VOLNO); - root_vol = get_root_volume(); - freemap = &root_vol->ondisk->vol0_blockmap[HAMMER_ZONE_FREEMAP_INDEX]; + result_offset = bootstrap_bigblock(volume); + freemap = &volume->ondisk->vol0_blockmap[HAMMER_ZONE_FREEMAP_INDEX]; + /* + * Dive layer 1. + */ layer1_offset = freemap->phys_offset + HAMMER_BLOCKMAP_LAYER1_OFFSET(result_offset); layer1 = get_buffer_data(layer1_offset, &buffer1, 0); @@ -85,17 +87,20 @@ alloc_bigblock(struct volume_info *volume, int zone) hammer_crc_set_layer1(layer1); buffer1->cache.modified = 1; + /* + * Dive layer 2, each entry represents a big-block. + */ layer2_offset = layer1->phys_offset + HAMMER_BLOCKMAP_LAYER2_OFFSET(result_offset); layer2 = get_buffer_data(layer2_offset, &buffer2, 0); assert(layer2->zone == 0); - layer2->zone = zone; + layer2->zone = HAMMER_ZONE_UNDO_INDEX; layer2->append_off = HAMMER_BIGBLOCK_SIZE; layer2->bytes_free = 0; hammer_crc_set_layer2(layer2); buffer2->cache.modified = 1; - --root_vol->ondisk->vol0_stat_freebigblocks; + --volume->ondisk->vol0_stat_freebigblocks; rel_buffer(buffer1); rel_buffer(buffer2); diff --git a/sbin/hammer/hammer_util.h b/sbin/hammer/hammer_util.h index 3b4afcbed2..b12dc45333 100644 --- a/sbin/hammer/hammer_util.h +++ b/sbin/hammer/hammer_util.h @@ -128,7 +128,7 @@ void *get_buffer_data(hammer_off_t buf_offset, struct buffer_info **bufferp, void rel_buffer(struct buffer_info *buffer); hammer_off_t bootstrap_bigblock(struct volume_info *volume); -hammer_off_t alloc_bigblock(struct volume_info *volume, int zone); +hammer_off_t alloc_undo_bigblock(struct volume_info *volume); void *alloc_blockmap(int zone, int bytes, hammer_off_t *result_offp, struct buffer_info **bufferp); hammer_off_t blockmap_lookup(hammer_off_t bmap_off, diff --git a/sbin/hammer/ondisk.c b/sbin/hammer/ondisk.c index 133d879f28..2c4ea5af2f 100644 --- a/sbin/hammer/ondisk.c +++ b/sbin/hammer/ondisk.c @@ -713,8 +713,7 @@ format_undomap(struct volume_info *root_vol, int64_t *undo_buffer_size) assert(limit_index <= HAMMER_MAX_UNDO_BIGBLOCKS); for (n = 0; n < limit_index; ++n) { - ondisk->vol0_undo_array[n] = alloc_bigblock(root_vol, - HAMMER_ZONE_UNDO_INDEX); + ondisk->vol0_undo_array[n] = alloc_undo_bigblock(root_vol); } while (n < HAMMER_MAX_UNDO_BIGBLOCKS) { ondisk->vol0_undo_array[n++] = HAMMER_BLOCKMAP_UNAVAIL; -- 2.11.4.GIT