[Ocfs2-tools-devel] [PATCH 3/3] O2image: Handle xattr btree for o2image.

Srinivas Eeda srinivas.eeda at oracle.com
Wed May 26 22:54:47 PDT 2010


Signed-off-by: Srinivas Eeda <srinivas.eeda at oracle.com>

On 5/24/2010 5:25 AM, Tristan Ye wrote:
> We do need to collect all bucket leaves of xattr btree if it exists
> in any inodes.
>
> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
> ---
>  o2image/o2image.c |   37 ++++++++++++++++++++++++++++++++++++-
>  1 files changed, 36 insertions(+), 1 deletions(-)
>
> diff --git a/o2image/o2image.c b/o2image/o2image.c
> index 9bac71a..456ad93 100644
> --- a/o2image/o2image.c
> +++ b/o2image/o2image.c
> @@ -168,6 +168,35 @@ out:
>  	return ret;
>  }
>  
> +static errcode_t traverse_xb(ocfs2_filesys *ofs, uint64_t blkno)
> +{
> +	errcode_t ret = 0;
> +	char *buf = NULL;
> +	struct ocfs2_xattr_block *xb;
> +
> +	ret = ocfs2_malloc_block(ofs->fs_io, &buf);
> +	if (ret)
> +		goto out;
> +
> +	ret = ocfs2_read_xattr_block(ofs, blkno, buf);
> +	if (ret)
> +		goto out;
> +
> +	xb = (struct ocfs2_xattr_block *)buf;
> +
> +	if (xb->xb_flags & OCFS2_XATTR_INDEXED)
> +		traverse_extents(ofs, &(xb->xb_attrs.xb_root.xt_list));
> +	else
> +		/* Direct xattr block should be handled by
> +		 * extent_alloc scans */
> +		goto out;
> +out:
> +	if (buf)
> +		ocfs2_free(&buf);
> +
> +	return ret;
> +}
> +
>  static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>  {
>  	struct ocfs2_super_block *super;
> @@ -198,8 +227,11 @@ static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>  	/*
>  	 * Do not scan inode if it's regular file. Extent blocks of regular
>  	 * files get backedup when scanning extent_alloc system files
> +	 *
> +	 * NOTE: we do need to handle its xattr btree if exists.
>  	 */
> -	if (!S_ISDIR(di->i_mode) && !(di->i_flags & OCFS2_SYSTEM_FL))
> +	if (!S_ISDIR(di->i_mode) && !(di->i_flags & OCFS2_SYSTEM_FL) &&
> +	    !(di->i_dyn_features & OCFS2_HAS_XATTR_FL))
>  		goto out;
>  
>  	/* Read and traverse group descriptors */
> @@ -233,6 +265,9 @@ static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>  		ret = traverse_chains(ofs, &(di->id2.i_chain), dump_type);
>  	else if (di->i_flags & OCFS2_DEALLOC_FL)
>  		ret = mark_dealloc_bits(ofs, &(di->id2.i_dealloc));
> +	else if ((di->i_dyn_features & OCFS2_HAS_XATTR_FL) && di->i_xattr_loc)
> +		/* Do need to traverse xattr btree to map bucket leaves */
> +		ret = traverse_xb(ofs, di->i_xattr_loc);
>  	else
>  		/* traverse extents for system files */
>  		ret = traverse_extents(ofs, &(di->id2.i_list));
>   



More information about the Ocfs2-tools-devel mailing list