Re: [PATCH 09/48] xfs: add CRC checks to block format directory blocks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jun 07, 2013 at 10:25:32AM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> Now that directory buffers are made from a single struct xfs_buf, we
> can add CRC calculation and checking callbacks. While there, add all
> the fields to the on disk structures for future functionality such
> as d_type support, uuids, block numbers, owner inode, etc.
> 
> To distinguish between the different on disk formats, change the
> magic numbers for the new format directory blocks.
> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>

corresponds to commit f5f3d9b016

> ---
>  include/xfs_dir2_format.h |  155 +++++++++++++++++++++++++++++++++++++++++--
>  libxfs/xfs_dir2_block.c   |  126 +++++++++++++++++++++++++----------
>  libxfs/xfs_dir2_data.c    |  160 ++++++++++++++++++++++++++++-----------------
>  libxfs/xfs_dir2_leaf.c    |    6 +-
>  libxfs/xfs_dir2_node.c    |    2 +-
>  libxfs/xfs_dir2_priv.h    |    4 +-
>  libxfs/xfs_dir2_sf.c      |    2 +-
>  7 files changed, 346 insertions(+), 109 deletions(-)
> 
> diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h
> index f5c264a..da928c7 100644
> --- a/include/xfs_dir2_format.h
> +++ b/include/xfs_dir2_format.h

...

> @@ -215,11 +247,43 @@ typedef struct xfs_dir2_data_free {
>   */
>  typedef struct xfs_dir2_data_hdr {
>  	__be32			magic;		/* XFS_DIR2_DATA_MAGIC or */
> -						/* XFS_DIR2_BLOCK_MAGIC */
> +	/* XFS_DIR2_BLOCK_MAGIC */

This change to remove some tabs does not match the kernel code.  Suggest you
remove it.  Maybe you have done that in one of the syncs later.

> @@ -287,7 +340,7 @@ xfs_dir2_block_addname(
>  	mp = dp->i_mount;
>  
>  	/* Read the (one and only) directory block into bp. */
> -	error = xfs_dir2_block_read(tp, dp, &bp);
> +	error = xfs_dir3_block_read(tp, dp, &bp);
>  	if (error)
>  		return error;
>  
> @@ -597,7 +650,7 @@ xfs_dir2_block_lookup_int(

It looks like there are a couple changes to xfs_dir2_block_getdents() that are
in the corresponding kernel commit but not reflected here.  Seems like this
function isn't called in the userspace code, so maybe it doesn't matter.

>  	tp = args->trans;
>  	mp = dp->i_mount;
>  
> -	error = xfs_dir2_block_read(tp, dp, &bp);
> +	error = xfs_dir3_block_read(tp, dp, &bp);
>  	if (error)
>  		return error;
>  
> @@ -860,9 +913,12 @@ xfs_dir2_leaf_to_block(

...

> diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c
> index eb86739..66aab07 100644
> --- a/libxfs/xfs_dir2_data.c
> +++ b/libxfs/xfs_dir2_data.c
> @@ -1,5 +1,6 @@
>  /*
>   * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
> + * Copyright (c) 2013 Red Hat, Inc.
>   * All Rights Reserved.
>   *
>   * This program is free software; you can redistribute it and/or
> @@ -49,11 +50,12 @@ __xfs_dir2_data_check(
>  
>  	mp = bp->b_target->bt_mount;
>  	hdr = bp->b_addr;
> -	bf = hdr->bestfree;
> -	p = (char *)(hdr + 1);
> +	bf = xfs_dir3_data_bestfree_p(hdr);
> +	p = (char *)xfs_dir3_data_entry_p(hdr);
>  
>  	switch (be32_to_cpu(hdr->magic)) {
>  	case XFS_DIR2_BLOCK_MAGIC:
> +	case XFS_DIR3_BLOCK_MAGIC:
	    ^^^^^

In the kernel the endian flip is done here, not in the switch parens.

>  		btp = xfs_dir2_block_tail_p(mp, hdr);
>  		lep = xfs_dir2_block_leaf_p(btp);
>  		endp = (char *)lep;
> @@ -132,7 +134,8 @@ __xfs_dir2_data_check(
>  					       (char *)dep - (char *)hdr);
>  		count++;
>  		lastfree = 0;
> -		if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) {
> +		if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) ||
> +		    hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) {
>  			addr = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk,
>  				(xfs_dir2_data_aoff_t)
>  				((char *)dep - (char *)hdr));
> @@ -152,7 +155,8 @@ __xfs_dir2_data_check(
>  	 * Need to have seen all the entries and all the bestfree slots.
>  	 */
>  	XFS_WANT_CORRUPTED_RETURN(freeseen == 7);
> -	if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC)) {
> +	if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) ||
> +	    hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) {
>  		for (i = stale = 0; i < be32_to_cpu(btp->count); i++) {
>  			if (lep[i].address ==
>  			    cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
> @@ -200,7 +204,8 @@ xfs_dir2_data_reada_verify(
>  
>  	switch (be32_to_cpu(hdr->magic)) {
>  	case XFS_DIR2_BLOCK_MAGIC:
> -		bp->b_ops = &xfs_dir2_block_buf_ops;
> +	case XFS_DIR3_BLOCK_MAGIC:

Also here the endian switch was done differently in the kernel.

Other than those nits this looks fine.

Reviewed-by: Ben Myers <bpm@xxxxxxx>

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs




[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux