[PATCH 01/14] PMFS: Move bitmap tracking into temporary data structure
Matthew Wilcox
matthew.r.wilcox at intel.com
Mon Oct 7 09:35:41 EDT 2013
From: Matthew Wilcox <willy at linux.intel.com>
The bitmaps are only used durig the mount process, so move the variables
used to track them from the pmfs_sb_info to a new data structure,
the scan_bitmap.
The bitmap is still largely useless; bits are only ever set in it,
never tested.
Signed-off-by: Matthew Wilcox <matthew.r.wilcox at intel.com>
---
fs/pmfs/bbuild.c | 89 ++++++++++++++++++++++++++-----------------------
include/linux/pmfs_sb.h | 7 ----
2 files changed, 48 insertions(+), 48 deletions(-)
diff --git a/fs/pmfs/bbuild.c b/fs/pmfs/bbuild.c
index eb20546..0c18389 100644
--- a/fs/pmfs/bbuild.c
+++ b/fs/pmfs/bbuild.c
@@ -24,6 +24,15 @@
#include <linux/slab.h>
#include "pmfs.h"
+struct scan_bitmap {
+ unsigned long bitmap_4k_size;
+ unsigned long bitmap_2M_size;
+ unsigned long bitmap_1G_size;
+ unsigned long *bitmap_4k;
+ unsigned long *bitmap_2M;
+ unsigned long *bitmap_1G;
+};
+
static void pmfs_clear_datablock_inode(struct super_block *sb)
{
struct pmfs_inode *pi = pmfs_get_inode(sb, PMFS_BLOCKNODE_IN0);
@@ -223,47 +232,47 @@ void pmfs_save_blocknode_mappings(struct super_block *sb)
}
static void pmfs_inode_crawl_recursive(struct super_block *sb,
- unsigned long block, u32 height,
- u32 btype)
+ struct scan_bitmap *bm, unsigned long block,
+ u32 height, u32 btype)
{
u64 *node;
unsigned int i;
- struct pmfs_sb_info *sbi = PMFS_SB(sb);
-
+
if (height == 0) {
/* This is the data block */
if (btype == cpu_to_le16(PMFS_BLOCK_TYPE_4K)) {
- set_bit(block >> PAGE_SHIFT, sbi->bitmap_4k);
+ set_bit(block >> PAGE_SHIFT, bm->bitmap_4k);
} else if (btype == cpu_to_le16(PMFS_BLOCK_TYPE_2M)) {
- set_bit(block >> PAGE_SHIFT_2M, sbi->bitmap_2M);
+ set_bit(block >> PAGE_SHIFT_2M, bm->bitmap_2M);
} else {
- set_bit(block >> PAGE_SHIFT_1G, sbi->bitmap_1G);
+ set_bit(block >> PAGE_SHIFT_1G, bm->bitmap_1G);
}
return;
}
node = pmfs_get_block(sb, block);
- set_bit(block >> PAGE_SHIFT, sbi->bitmap_4k);
+ set_bit(block >> PAGE_SHIFT, bm->bitmap_4k);
for (i = 0; i < (1 << META_BLK_SHIFT); i++) {
if (node[i] == 0)
continue;
- pmfs_inode_crawl_recursive(sb,
+ pmfs_inode_crawl_recursive(sb, bm,
le64_to_cpu(node[i]), height - 1, btype);
}
}
static inline void pmfs_inode_crawl(struct super_block *sb,
- struct pmfs_inode *pi)
+ struct scan_bitmap *bm, struct pmfs_inode *pi)
{
if (pi->root == 0)
return;
- pmfs_inode_crawl_recursive(sb, le64_to_cpu(pi->root), pi->height,
- pi->i_blk_type);
+ pmfs_inode_crawl_recursive(sb, bm, le64_to_cpu(pi->root), pi->height,
+ pi->i_blk_type);
}
static void pmfs_inode_table_crawl_recursive(struct super_block *sb,
- unsigned long block, u32 height, u32 btype)
+ struct scan_bitmap *bm, unsigned long block,
+ u32 height, u32 btype)
{
u64 *node;
unsigned int i;
@@ -275,9 +284,9 @@ static void pmfs_inode_table_crawl_recursive(struct super_block *sb,
if (height == 0) {
unsigned int inodes_per_block = INODES_PER_BLOCK(btype);
if (likely(btype == PMFS_BLOCK_TYPE_2M))
- set_bit(block >> PAGE_SHIFT_2M, sbi->bitmap_2M);
+ set_bit(block >> PAGE_SHIFT_2M, bm->bitmap_2M);
else
- set_bit(block >> PAGE_SHIFT, sbi->bitmap_4k);
+ set_bit(block >> PAGE_SHIFT, bm->bitmap_4k);
sbi->s_inodes_count += inodes_per_block;
for (i = 0; i < inodes_per_block; i++) {
@@ -290,16 +299,16 @@ static void pmfs_inode_table_crawl_recursive(struct super_block *sb,
continue;
}
sbi->s_inodes_used_count++;
- pmfs_inode_crawl(sb, pi);
+ pmfs_inode_crawl(sb, bm, pi);
}
- return;
+ return;
}
- set_bit(block >> PAGE_SHIFT , sbi->bitmap_4k);
+ set_bit(block >> PAGE_SHIFT, bm->bitmap_4k);
for (i = 0; i < (1 << META_BLK_SHIFT); i++) {
if (node[i] == 0)
continue;
- pmfs_inode_table_crawl_recursive(sb,
+ pmfs_inode_table_crawl_recursive(sb, bm,
le64_to_cpu(node[i]), height - 1, btype);
}
}
@@ -440,18 +449,15 @@ static int __pmfs_build_blocknode_map(struct super_block *sb,
return 0;
}
-static int pmfs_build_blocknode_map(struct super_block *sb)
+static void pmfs_build_blocknode_map(struct super_block *sb,
+ struct scan_bitmap *bm)
{
- struct pmfs_sb_info *sbi = PMFS_SB(sb);
-
- __pmfs_build_blocknode_map(sb, sbi->bitmap_4k, sbi->bitmap_4k_size * 8,
+ __pmfs_build_blocknode_map(sb, bm->bitmap_4k, bm->bitmap_4k_size * 8,
PAGE_SHIFT - 12);
- __pmfs_build_blocknode_map(sb, sbi->bitmap_2M, sbi->bitmap_2M_size * 8,
+ __pmfs_build_blocknode_map(sb, bm->bitmap_2M, bm->bitmap_2M_size * 8,
PAGE_SHIFT_2M - 12);
- __pmfs_build_blocknode_map(sb, sbi->bitmap_1G, sbi->bitmap_1G_size * 8,
+ __pmfs_build_blocknode_map(sb, bm->bitmap_1G, bm->bitmap_1G_size * 8,
PAGE_SHIFT_1G - 12);
-
- return 0;
}
int pmfs_setup_blocknode_map(struct super_block *sb)
@@ -460,6 +466,7 @@ int pmfs_setup_blocknode_map(struct super_block *sb)
struct pmfs_inode *pi = pmfs_get_inode_table(sb);
pmfs_journal_t *journal = pmfs_get_journal(sb);
struct pmfs_sb_info *sbi = PMFS_SB(sb);
+ struct scan_bitmap bm;
unsigned long initsize = le64_to_cpu(super->s_size);
bool value = false;
@@ -473,23 +480,23 @@ int pmfs_setup_blocknode_map(struct super_block *sb)
return 0;
}
- sbi->bitmap_4k_size = (initsize >> (PAGE_SHIFT + 0x3)) + 1;
- sbi->bitmap_2M_size = (initsize >> (PAGE_SHIFT_2M + 0x3)) + 1;
- sbi->bitmap_1G_size = (initsize >> (PAGE_SHIFT_1G + 0x3)) + 1;
+ bm.bitmap_4k_size = (initsize >> (PAGE_SHIFT + 0x3)) + 1;
+ bm.bitmap_2M_size = (initsize >> (PAGE_SHIFT_2M + 0x3)) + 1;
+ bm.bitmap_1G_size = (initsize >> (PAGE_SHIFT_1G + 0x3)) + 1;
/* Alloc memory to hold the block alloc bitmap */
- sbi->bitmap_4k = kzalloc(sbi->bitmap_4k_size, GFP_KERNEL);
- sbi->bitmap_2M = kzalloc(sbi->bitmap_2M_size, GFP_KERNEL);
- sbi->bitmap_1G = kzalloc(sbi->bitmap_1G_size, GFP_KERNEL);
- if (!sbi->bitmap_4k || !sbi->bitmap_2M || !sbi->bitmap_1G) {
+ bm.bitmap_4k = kzalloc(bm.bitmap_4k_size, GFP_KERNEL);
+ bm.bitmap_2M = kzalloc(bm.bitmap_2M_size, GFP_KERNEL);
+ bm.bitmap_1G = kzalloc(bm.bitmap_1G_size, GFP_KERNEL);
+
+ if (!bm.bitmap_4k || !bm.bitmap_2M || !bm.bitmap_1G)
goto skip;
- }
/* Clearing the datablock inode */
pmfs_clear_datablock_inode(sb);
- pmfs_inode_table_crawl_recursive(sb, le64_to_cpu(pi->root), pi->height,
- pi->i_blk_type);
+ pmfs_inode_table_crawl_recursive(sb, &bm, le64_to_cpu(pi->root),
+ pi->height, pi->i_blk_type);
/* Reserving tow inodes - Inode 0 and Inode for datablock */
sbi->s_free_inodes_count = sbi->s_inodes_count -
@@ -502,13 +509,13 @@ int pmfs_setup_blocknode_map(struct super_block *sb)
sbi->num_free_blocks = ((unsigned long)(initsize) >> PAGE_SHIFT);
pmfs_init_blockmap(sb, le64_to_cpu(journal->base) + sbi->jsize);
- pmfs_build_blocknode_map(sb);
+ pmfs_build_blocknode_map(sb, &bm);
skip:
- kfree(sbi->bitmap_4k);
- kfree(sbi->bitmap_2M);
- kfree(sbi->bitmap_1G);
+ kfree(bm.bitmap_4k);
+ kfree(bm.bitmap_2M);
+ kfree(bm.bitmap_1G);
return 0;
}
diff --git a/include/linux/pmfs_sb.h b/include/linux/pmfs_sb.h
index bea9f11..eb5dc4f 100644
--- a/include/linux/pmfs_sb.h
+++ b/include/linux/pmfs_sb.h
@@ -57,14 +57,7 @@ struct pmfs_sb_info {
unsigned int s_inodes_used_count;
unsigned int s_free_inode_hint;
- /* temp bitmap space */
unsigned long num_blocknode_allocated;
- unsigned long bitmap_4k_size;
- unsigned long bitmap_2M_size;
- unsigned long bitmap_1G_size;
- unsigned long *bitmap_4k;
- unsigned long *bitmap_2M;
- unsigned long *bitmap_1G;
/* Journaling related structures */
uint32_t next_transaction_id;
--
1.8.4.rc3
More information about the Linux-pmfs
mailing list