Re: [PATCH 05/32] xfs: ensure we copy buffer type in da btree root splits

Eric Sandeen
2013-10-08T23:07:02Z

On 9/29/13 10:15 PM, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> When splitting the root of the da btree, we shuffled data between
> buffers and the structures that track them. At one point, we copy
> data and state from one buffer to another, including the ops
> associated with the buffer. When we do this, we also need to copy
> the buffer type associated with the buf log item so that the buffer
> is logged correctly. If we don't do that, log recovery won't
> recognise it and hence it won't recalculate the CRC on the buffer
> after recovery. This leads to a directory block that can't be read
> after recovery has run.
>
> Found by inspection after finding the same problem with remote
> symlink buffers.

Makes sense, matches kernel commit 0a4edc8f0b54cd5f613e7fda7dc8106cb9869bc9

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> libxfs/xfs_da_btree.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c
> index b7b6705..f106e06 100644
> --- a/libxfs/xfs_da_btree.c
> +++ b/libxfs/xfs_da_btree.c
> @@ -612,6 +612,7 @@ xfs_da3_root_split(
> xfs_trans_log_buf(tp, bp, 0, size - 1);
>
> bp->b_ops = blk1->bp->b_ops;
> + xfs_trans_buf_copy_type(bp, blk1->bp);
> blk1->bp = bp;
> blk1->blkno = blkno;
>
>