[Cluster-devel] [PATCH 2/3] gfs2_edit: Ensure all leaf blocks in per_node are saved

Steven Whitehouse swhiteho at redhat.com
Thu Jun 5 09:39:59 UTC 2014


Hi,

On 05/06/14 02:28, Andrew Price wrote:
> block_is_in_per_node() only checks the first leaf block when the
> per_node directory has been split (when the block size is small and/or
> the number of journals is large). This caused savemeta to treat the
> files in per_node as user data and so didn't save their metadata. Add an
> outer loop to iterate over the indirect blocks.
Why does it matter whether the block in the per_node subdir or not? Are 
we doing something special compared with other directories?

Steve.

> Signed-off-by: Andrew Price <anprice at redhat.com>
> ---
>   gfs2/edit/savemeta.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
> index a43045f..360b144 100644
> --- a/gfs2/edit/savemeta.c
> +++ b/gfs2/edit/savemeta.c
> @@ -75,7 +75,7 @@ static int block_is_a_journal(void)
>   
>   static int block_is_in_per_node(void)
>   {
> -	int d;
> +	int i;
>   	struct gfs2_inode *per_node_di;
>   
>   	if (sbd.gfs1)
> @@ -90,9 +90,12 @@ static int block_is_in_per_node(void)
>   	do_dinode_extended(&per_node_di->i_di, per_node_di->i_bh);
>   	inode_put(&per_node_di);
>   
> -	for (d = 0; d < indirect->ii[0].dirents; d++) {
> -		if (block == indirect->ii[0].dirent[d].block)
> -			return TRUE;
> +	for (i = 0; i < indirect_blocks; i++) {
> +		int d;
> +		for (d = 0; d < indirect->ii[i].dirents; d++) {
> +			if (block == indirect->ii[i].dirent[d].block)
> +				return TRUE;
> +		}
>   	}
>   	return FALSE;
>   }




More information about the Cluster-devel mailing list