diff options
Diffstat (limited to 'fs/xfs/xfs_da_btree.c')
-rw-r--r-- | fs/xfs/xfs_da_btree.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 779ecdcdbe02..5aebd9bd44d1 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c | |||
@@ -292,7 +292,6 @@ const struct xfs_buf_ops xfs_da3_node_buf_ops = { | |||
292 | .verify_write = xfs_da3_node_write_verify, | 292 | .verify_write = xfs_da3_node_write_verify, |
293 | }; | 293 | }; |
294 | 294 | ||
295 | |||
296 | int | 295 | int |
297 | xfs_da3_node_read( | 296 | xfs_da3_node_read( |
298 | struct xfs_trans *tp, | 297 | struct xfs_trans *tp, |
@@ -302,8 +301,35 @@ xfs_da3_node_read( | |||
302 | struct xfs_buf **bpp, | 301 | struct xfs_buf **bpp, |
303 | int which_fork) | 302 | int which_fork) |
304 | { | 303 | { |
305 | return xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, | 304 | int err; |
305 | |||
306 | err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, | ||
306 | which_fork, &xfs_da3_node_buf_ops); | 307 | which_fork, &xfs_da3_node_buf_ops); |
308 | if (!err && tp) { | ||
309 | struct xfs_da_blkinfo *info = (*bpp)->b_addr; | ||
310 | int type; | ||
311 | |||
312 | switch (be16_to_cpu(info->magic)) { | ||
313 | case XFS_DA3_NODE_MAGIC: | ||
314 | case XFS_DA_NODE_MAGIC: | ||
315 | type = XFS_BLF_DA_NODE_BUF; | ||
316 | break; | ||
317 | case XFS_ATTR_LEAF_MAGIC: | ||
318 | case XFS_ATTR3_LEAF_MAGIC: | ||
319 | type = XFS_BLF_ATTR_LEAF_BUF; | ||
320 | break; | ||
321 | case XFS_DIR2_LEAFN_MAGIC: | ||
322 | case XFS_DIR3_LEAFN_MAGIC: | ||
323 | type = XFS_BLF_DIR_LEAFN_BUF; | ||
324 | break; | ||
325 | default: | ||
326 | type = 0; | ||
327 | ASSERT(0); | ||
328 | break; | ||
329 | } | ||
330 | xfs_trans_buf_set_type(tp, *bpp, type); | ||
331 | } | ||
332 | return err; | ||
307 | } | 333 | } |
308 | 334 | ||
309 | /*======================================================================== | 335 | /*======================================================================== |
@@ -334,6 +360,8 @@ xfs_da3_node_create( | |||
334 | error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); | 360 | error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); |
335 | if (error) | 361 | if (error) |
336 | return(error); | 362 | return(error); |
363 | bp->b_ops = &xfs_da3_node_buf_ops; | ||
364 | xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); | ||
337 | node = bp->b_addr; | 365 | node = bp->b_addr; |
338 | 366 | ||
339 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | 367 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
@@ -352,7 +380,6 @@ xfs_da3_node_create( | |||
352 | xfs_trans_log_buf(tp, bp, | 380 | xfs_trans_log_buf(tp, bp, |
353 | XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); | 381 | XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); |
354 | 382 | ||
355 | bp->b_ops = &xfs_da3_node_buf_ops; | ||
356 | *bpp = bp; | 383 | *bpp = bp; |
357 | return(0); | 384 | return(0); |
358 | } | 385 | } |
@@ -565,6 +592,12 @@ xfs_da3_root_split( | |||
565 | btree = xfs_da3_node_tree_p(oldroot); | 592 | btree = xfs_da3_node_tree_p(oldroot); |
566 | size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); | 593 | size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); |
567 | level = nodehdr.level; | 594 | level = nodehdr.level; |
595 | |||
596 | /* | ||
597 | * we are about to copy oldroot to bp, so set up the type | ||
598 | * of bp while we know exactly what it will be. | ||
599 | */ | ||
600 | xfs_trans_buf_set_type(tp, bp, XFS_BLF_DA_NODE_BUF); | ||
568 | } else { | 601 | } else { |
569 | struct xfs_dir3_icleaf_hdr leafhdr; | 602 | struct xfs_dir3_icleaf_hdr leafhdr; |
570 | struct xfs_dir2_leaf_entry *ents; | 603 | struct xfs_dir2_leaf_entry *ents; |
@@ -577,6 +610,12 @@ xfs_da3_root_split( | |||
577 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); | 610 | leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); |
578 | size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); | 611 | size = (int)((char *)&ents[leafhdr.count] - (char *)leaf); |
579 | level = 0; | 612 | level = 0; |
613 | |||
614 | /* | ||
615 | * we are about to copy oldroot to bp, so set up the type | ||
616 | * of bp while we know exactly what it will be. | ||
617 | */ | ||
618 | xfs_trans_buf_set_type(tp, bp, XFS_BLF_DIR_LEAFN_BUF); | ||
580 | } | 619 | } |
581 | 620 | ||
582 | /* | 621 | /* |
@@ -1092,6 +1131,7 @@ xfs_da3_root_join( | |||
1092 | */ | 1131 | */ |
1093 | memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); | 1132 | memcpy(root_blk->bp->b_addr, bp->b_addr, state->blocksize); |
1094 | root_blk->bp->b_ops = bp->b_ops; | 1133 | root_blk->bp->b_ops = bp->b_ops; |
1134 | xfs_trans_buf_copy_type(root_blk->bp, bp); | ||
1095 | if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { | 1135 | if (oldroothdr.magic == XFS_DA3_NODE_MAGIC) { |
1096 | struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; | 1136 | struct xfs_da3_blkinfo *da3 = root_blk->bp->b_addr; |
1097 | da3->blkno = cpu_to_be64(root_blk->bp->b_bn); | 1137 | da3->blkno = cpu_to_be64(root_blk->bp->b_bn); |