[Ocfs2-tools-devel] [PATCH 2/2] libocfs2: Make allocating a specific cluster a clean API

Sunil Mushran sunil.mushran at oracle.com
Fri Nov 14 17:02:01 PST 2008


Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>

You may want to clean up these warnings though.

backup_super.c: In function ‘ocfs2_clear_backup_super_list’:
backup_super.c:63: warning: unused variable ‘loaded’
backup_super.c:62: warning: unused variable ‘bm_blk’
backup_super.c: In function ‘ocfs2_set_backup_super_list’:
backup_super.c:115: warning: unused variable ‘bm_blk’


Joel Becker wrote:
> The backup superblock code hand-builds the necessary operations to load
> the cluster allocator and set the backup superblock clusters.  Let's
> create clean APIs for this in libocfs2/alloc.c and have backup_super.c
> use them.
>
> While we're at it, set_backup_super() used to free the cluster allocator
> when it was done.  That doesn't fit with the library's standard "cache
> that allocator" behavior.  So don't free it.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  include/ocfs2/ocfs2.h   |    3 ++
>  libocfs2/alloc.c        |   39 +++++++++++++++++++++++++++
>  libocfs2/backup_super.c |   67 ++++++----------------------------------------
>  3 files changed, 51 insertions(+), 58 deletions(-)
>
> diff --git a/include/ocfs2/ocfs2.h b/include/ocfs2/ocfs2.h
> index 68ba4f5..e30d31d 100644
> --- a/include/ocfs2/ocfs2.h
> +++ b/include/ocfs2/ocfs2.h
> @@ -511,6 +511,9 @@ errcode_t ocfs2_new_clusters(ocfs2_filesys *fs,
>  			     uint32_t requested,
>  			     uint64_t *start_blkno,
>  			     uint32_t *clusters_found);
> +errcode_t ocfs2_test_cluster_allocated(ocfs2_filesys *fs, uint32_t cpos,
> +				       int *is_allocated);
> +errcode_t ocfs2_new_specific_cluster(ocfs2_filesys *fs, uint32_t cpos);
>  errcode_t ocfs2_free_clusters(ocfs2_filesys *fs,
>  			      uint32_t len,
>  			      uint64_t start_blkno);
> diff --git a/libocfs2/alloc.c b/libocfs2/alloc.c
> index 03b3091..2597c2f 100644
> --- a/libocfs2/alloc.c
> +++ b/libocfs2/alloc.c
> @@ -491,6 +491,45 @@ out:
>  	return ret;
>  }
>  
> +errcode_t ocfs2_test_cluster_allocated(ocfs2_filesys *fs, uint32_t cpos,
> +				       int *is_allocated)
> +{
> +	errcode_t ret;
> +	ret = ocfs2_load_allocator(fs, GLOBAL_BITMAP_SYSTEM_INODE,
> +				   0, &fs->fs_cluster_alloc);
> +	if (!ret) {
> +		ret = ocfs2_chain_test(fs, fs->fs_cluster_alloc, cpos,
> +				       is_allocated);
> +	}
> +
> +	return ret;
> +}
> +
> +errcode_t ocfs2_new_specific_cluster(ocfs2_filesys *fs, uint32_t cpos)
> +{
> +	errcode_t ret;
> +	int allocatedp = 0;
> +
> +	/* Loads the allocator if we need it */
> +	ret = ocfs2_test_cluster_allocated(fs, cpos, &allocatedp);
> +	if (ret)
> +		goto out;
> +
> +	if (allocatedp) {
> +		ret = OCFS2_ET_BIT_NOT_FOUND;
> +		goto out;
> +	}
> +
> +	ocfs2_chain_force_val(fs, fs->fs_cluster_alloc, cpos, 1, NULL);
> +	ret = ocfs2_write_chain_allocator(fs, fs->fs_cluster_alloc);
> +	if (ret)
> +		ocfs2_free_clusters(fs, 1,
> +				    ocfs2_blocks_to_clusters(fs, cpos));
> +
> +out:
> +	return ret;
> +}
> +
>  errcode_t ocfs2_free_clusters(ocfs2_filesys *fs,
>  			      uint32_t len,
>  			      uint64_t start_blkno)
> diff --git a/libocfs2/backup_super.c b/libocfs2/backup_super.c
> index 84b0449..4538b84 100644
> --- a/libocfs2/backup_super.c
> +++ b/libocfs2/backup_super.c
> @@ -76,49 +76,23 @@ errcode_t ocfs2_clear_backup_super_list(ocfs2_filesys *fs,
>  				      OCFS2_FEATURE_COMPAT_BACKUP_SB))
>  		goto bail;
>  
> -	if (!fs->fs_cluster_alloc) {
> -		loaded = 1;
> -		ret = ocfs2_lookup_system_inode(fs, GLOBAL_BITMAP_SYSTEM_INODE,
> -						0, &bm_blk);
> -		if (ret)
> -			goto bail;
> -
> -		ret = ocfs2_read_cached_inode(fs, bm_blk, &fs->fs_cluster_alloc);
> -		if (ret)
> -			goto bail;
> -
> -		ret = ocfs2_load_chain_allocator(fs, fs->fs_cluster_alloc);
> -		if (ret)
> -			goto bail;
> -	}
>  
>  	for (i = 0; i < len; i++) {
> -		ret = ocfs2_chain_free(fs,
> -				       fs->fs_cluster_alloc,
> -				       ocfs2_blocks_to_clusters(fs,
> -								blocks[i]));
> -		/* Ignore the 'bit was already free' error */
> -		if (ret &&
> -		    (ret != OCFS2_ET_FREEING_UNALLOCATED_REGION))
> -			goto bail;
> +		ret = ocfs2_free_clusters(fs, 1, blocks[i]);
> +		if (ret)
> +			break;
>  	}
>  
> -	ret = ocfs2_write_chain_allocator(fs, fs->fs_cluster_alloc);
> -
>  bail:
> -	if (fs->fs_cluster_alloc && loaded) {
> -		ocfs2_free_cached_inode(fs, fs->fs_cluster_alloc);
> -		fs->fs_cluster_alloc = NULL;
> -	}
>  	return ret;
>  }
>  
> -static errcode_t check_cluster(ocfs2_bitmap *bitmap, uint64_t bit)
> +static errcode_t check_cluster(ocfs2_filesys *fs, uint32_t cpos)
>  {
>  	errcode_t ret;
>  	int val;
>  
> -	ret = ocfs2_bitmap_test(bitmap, bit, &val);
> +	ret = ocfs2_test_cluster_allocated(fs, cpos, &val);
>  	if (ret)
>  		goto bail;
>  
> @@ -139,35 +113,18 @@ errcode_t ocfs2_set_backup_super_list(ocfs2_filesys *fs,
>  	errcode_t ret = 0;
>  	char *buf = NULL;
>  	uint64_t bm_blk, *blkno = blocks;
> -	int val, loaded = 0;
>  	uint32_t cluster, bpc = fs->fs_clustersize / fs->fs_blocksize;
>  
>  	if (!len || !blocks || !*blocks)
>  		goto bail;
>  	len = ocfs2_min(len,(size_t)OCFS2_MAX_BACKUP_SUPERBLOCKS);
>  
> -	if (!fs->fs_cluster_alloc) {
> -		loaded = 1;
> -		ret = ocfs2_lookup_system_inode(fs, GLOBAL_BITMAP_SYSTEM_INODE,
> -						0, &bm_blk);
> -		if (ret)
> -			goto bail;
> -
> -		ret = ocfs2_read_cached_inode(fs, bm_blk, &fs->fs_cluster_alloc);
> -		if (ret)
> -			goto bail;
> -
> -		ret = ocfs2_load_chain_allocator(fs, fs->fs_cluster_alloc);
> -		if (ret)
> -			goto bail;
> -	}
> -
>  	if (!OCFS2_HAS_COMPAT_FEATURE(OCFS2_RAW_SB(fs->fs_super),
>  				      OCFS2_FEATURE_COMPAT_BACKUP_SB)) {
>  		/* check all the blkno to see whether it is used. */
>  		for (i = 0; i < len; i++, blkno++) {
> -			ret = check_cluster(fs->fs_cluster_alloc->ci_chains,
> -					ocfs2_blocks_to_clusters(fs, *blkno));
> +			ret = check_cluster(fs,
> +					    ocfs2_blocks_to_clusters(fs, *blkno));
>  			if (ret)
>  				goto bail;
>  		}
> @@ -191,20 +148,14 @@ errcode_t ocfs2_set_backup_super_list(ocfs2_filesys *fs,
>  	if (ret)
>  		goto bail;
>  
> +	/* We just tested the clusters, so the allocation can't fail */
>  	blkno = blocks;
>  	for (i = 0; i < len; i++, blkno++)
> -		ocfs2_bitmap_set(fs->fs_cluster_alloc->ci_chains,
> -				 ocfs2_blocks_to_clusters(fs, *blkno), &val);
> -
> -	ret = ocfs2_write_chain_allocator(fs, fs->fs_cluster_alloc);
> +		ocfs2_new_specific_cluster(fs, ocfs2_blocks_to_clusters(fs, *blkno));
>  
>  bail:
>  	if (buf)
>  		ocfs2_free(&buf);
> -	if (fs->fs_cluster_alloc && loaded) {
> -		ocfs2_free_cached_inode(fs, fs->fs_cluster_alloc);
> -		fs->fs_cluster_alloc = NULL;
> -	}
>  	return ret;
>  }
>  
>   




More information about the Ocfs2-tools-devel mailing list