diff options
Diffstat (limited to 'fs/ocfs2/resize.c')
| -rw-r--r-- | fs/ocfs2/resize.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/fs/ocfs2/resize.c b/fs/ocfs2/resize.c index d5da6f624142..79b8021302b3 100644 --- a/fs/ocfs2/resize.c +++ b/fs/ocfs2/resize.c @@ -54,11 +54,12 @@  static u16 ocfs2_calc_new_backup_super(struct inode *inode,  				       struct ocfs2_group_desc *gd,  				       u16 cl_cpg, +				       u16 old_bg_clusters,  				       int set)  {  	int i;  	u16 backups = 0; -	u32 cluster; +	u32 cluster, lgd_cluster;  	u64 blkno, gd_blkno, lgd_blkno = le64_to_cpu(gd->bg_blkno);  	for (i = 0; i < OCFS2_MAX_BACKUP_SUPERBLOCKS; i++) { @@ -71,6 +72,12 @@ static u16 ocfs2_calc_new_backup_super(struct inode *inode,  		else if (gd_blkno > lgd_blkno)  			break; +		/* check if already done backup super */ +		lgd_cluster = ocfs2_blocks_to_clusters(inode->i_sb, lgd_blkno); +		lgd_cluster += old_bg_clusters; +		if (lgd_cluster >= cluster) +			continue; +  		if (set)  			ocfs2_set_bit(cluster % cl_cpg,  				      (unsigned long *)gd->bg_bitmap); @@ -99,6 +106,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,  	u16 chain, num_bits, backups = 0;  	u16 cl_bpc = le16_to_cpu(cl->cl_bpc);  	u16 cl_cpg = le16_to_cpu(cl->cl_cpg); +	u16 old_bg_clusters;  	trace_ocfs2_update_last_group_and_inode(new_clusters,  						first_new_cluster); @@ -112,6 +120,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,  	group = (struct ocfs2_group_desc *)group_bh->b_data; +	old_bg_clusters = le16_to_cpu(group->bg_bits) / cl_bpc;  	/* update the group first. */  	num_bits = new_clusters * cl_bpc;  	le16_add_cpu(&group->bg_bits, num_bits); @@ -125,7 +134,7 @@ static int ocfs2_update_last_group_and_inode(handle_t *handle,  				     OCFS2_FEATURE_COMPAT_BACKUP_SB)) {  		backups = ocfs2_calc_new_backup_super(bm_inode,  						     group, -						     cl_cpg, 1); +						     cl_cpg, old_bg_clusters, 1);  		le16_add_cpu(&group->bg_free_bits_count, -1 * backups);  	} @@ -163,7 +172,7 @@ out_rollback:  	if (ret < 0) {  		ocfs2_calc_new_backup_super(bm_inode,  					    group, -					    cl_cpg, 0); +					    cl_cpg, old_bg_clusters, 0);  		le16_add_cpu(&group->bg_free_bits_count, backups);  		le16_add_cpu(&group->bg_bits, -1 * num_bits);  		le16_add_cpu(&group->bg_free_bits_count, -1 * num_bits);  | 
