Skip to content

Commit

Permalink
ocfs2: ocfs2_group_bitmap_size has to handle old volume.
Browse files Browse the repository at this point in the history
ocfs2_group_bitmap_size has to handle the case when the
volume don't have discontiguous block group support. So
pass the feature_incompat in and check it.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
  • Loading branch information
Tao Ma committed Apr 13, 2010
1 parent 4711954 commit 8571882
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 17 deletions.
2 changes: 1 addition & 1 deletion fs/ocfs2/localalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ unsigned int ocfs2_la_default_mb(struct ocfs2_super *osb)
struct super_block *sb = osb->sb;

gd_mb = ocfs2_clusters_to_megabytes(osb->sb,
8 * ocfs2_group_bitmap_size(sb, 0));
8 * ocfs2_group_bitmap_size(sb, 0, osb->s_feature_incompat));

/*
* This takes care of files systems with very small group
Expand Down
37 changes: 25 additions & 12 deletions fs/ocfs2/ocfs2_fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1338,15 +1338,21 @@ static inline u16 ocfs2_local_alloc_size(struct super_block *sb)
}

static inline int ocfs2_group_bitmap_size(struct super_block *sb,
int suballocator)
int suballocator,
u32 feature_incompat)
{
int size;
int size = sb->s_blocksize -
offsetof(struct ocfs2_group_desc, bg_bitmap);

if (suballocator)
/*
* The cluster allocator uses the entire block. Suballocators have
* never used more than OCFS2_MAX_BG_BITMAP_SIZE. Unfortunately, older
* code expects bg_size set to the maximum. Thus we must keep
* bg_size as-is unless discontig_bg is enabled.
*/
if (suballocator &&
(feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
size = OCFS2_MAX_BG_BITMAP_SIZE;
else
size = sb->s_blocksize -
offsetof(struct ocfs2_group_desc, bg_bitmap);

return size;
}
Expand Down Expand Up @@ -1479,15 +1485,22 @@ static inline int ocfs2_local_alloc_size(int blocksize)
return size;
}

static inline int ocfs2_group_bitmap_size(int blocksize, int suballocator)
static inline int ocfs2_group_bitmap_size(int blocksize,
int suballocator,
uint32_t feature_incompat)
{
int size;
int size = sb->s_blocksize -
offsetof(struct ocfs2_group_desc, bg_bitmap);

if (suballocator)
/*
* The cluster allocator uses the entire block. Suballocators have
* never used more than OCFS2_MAX_BG_BITMAP_SIZE. Unfortunately, older
* code expects bg_size set to the maximum. Thus we must keep
* bg_size as-is unless discontig_bg is enabled.
*/
if (suballocator &&
(feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
size = OCFS2_MAX_BG_BITMAP_SIZE;
else
size = blocksize -
offsetof(struct ocfs2_group_desc, bg_bitmap);

return size;
}
Expand Down
6 changes: 4 additions & 2 deletions fs/ocfs2/resize.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,8 @@ int ocfs2_group_extend(struct inode * inode, int new_clusters)
BUG_ON(!OCFS2_IS_VALID_DINODE(fe));

if (le16_to_cpu(fe->id2.i_chain.cl_cpg) !=
ocfs2_group_bitmap_size(osb->sb, 0) * 8) {
ocfs2_group_bitmap_size(osb->sb, 0,
osb->s_feature_incompat) * 8) {
mlog(ML_ERROR, "The disk is too old and small. "
"Force to do offline resize.");
ret = -EINVAL;
Expand Down Expand Up @@ -496,7 +497,8 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
fe = (struct ocfs2_dinode *)main_bm_bh->b_data;

if (le16_to_cpu(fe->id2.i_chain.cl_cpg) !=
ocfs2_group_bitmap_size(osb->sb, 0) * 8) {
ocfs2_group_bitmap_size(osb->sb, 0,
osb->s_feature_incompat) * 8) {
mlog(ML_ERROR, "The disk is too old and small."
" Force to do offline resize.");
ret = -EINVAL;
Expand Down
3 changes: 2 additions & 1 deletion fs/ocfs2/suballoc.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,8 @@ static int ocfs2_block_group_fill(handle_t *handle,
memset(bg, 0, sb->s_blocksize);
strcpy(bg->bg_signature, OCFS2_GROUP_DESC_SIGNATURE);
bg->bg_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation);
bg->bg_size = cpu_to_le16(ocfs2_group_bitmap_size(sb, 1));
bg->bg_size = cpu_to_le16(ocfs2_group_bitmap_size(sb, 1,
osb->s_feature_incompat));
bg->bg_chain = cpu_to_le16(my_chain);
bg->bg_next_group = cl->cl_recs[my_chain].c_blkno;
bg->bg_parent_dinode = cpu_to_le64(OCFS2_I(alloc_inode)->ip_blkno);
Expand Down
3 changes: 2 additions & 1 deletion fs/ocfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -2277,7 +2277,8 @@ static int ocfs2_initialize_super(struct super_block *sb,
osb->osb_clusters_at_boot = OCFS2_I(inode)->ip_clusters;
iput(inode);

osb->bitmap_cpg = ocfs2_group_bitmap_size(sb, 0) * 8;
osb->bitmap_cpg = ocfs2_group_bitmap_size(sb, 0,
osb->s_feature_incompat) * 8;

status = ocfs2_init_slot_info(osb);
if (status < 0) {
Expand Down

0 comments on commit 8571882

Please sign in to comment.