Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: split xfs_da3_node_read

Split xfs_da3_node_read into one variant that always looks up the daddr
and doesn't accept holes, and one that already has a daddr at hand.
This is in preparation of splitting up xfs_da_read_buf in a similar way.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

authored by

Christoph Hellwig and committed by
Darrick J. Wong
02c57f0a f3fcb314

+82 -63
+6 -8
fs/xfs/libxfs/xfs_attr.c
··· 1266 1266 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1267 1267 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1268 1268 if (blk->disk_blkno) { 1269 - error = xfs_da3_node_read(state->args->trans, 1270 - state->args->dp, 1271 - blk->blkno, blk->disk_blkno, 1272 - &blk->bp, XFS_ATTR_FORK); 1269 + error = xfs_da3_node_read_mapped(state->args->trans, 1270 + state->args->dp, blk->disk_blkno, 1271 + &blk->bp, XFS_ATTR_FORK); 1273 1272 if (error) 1274 1273 return error; 1275 1274 } else { ··· 1284 1285 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1285 1286 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1286 1287 if (blk->disk_blkno) { 1287 - error = xfs_da3_node_read(state->args->trans, 1288 - state->args->dp, 1289 - blk->blkno, blk->disk_blkno, 1290 - &blk->bp, XFS_ATTR_FORK); 1288 + error = xfs_da3_node_read_mapped(state->args->trans, 1289 + state->args->dp, blk->disk_blkno, 1290 + &blk->bp, XFS_ATTR_FORK); 1291 1291 if (error) 1292 1292 return error; 1293 1293 } else {
+65 -46
fs/xfs/libxfs/xfs_da_btree.c
··· 331 331 .verify_struct = xfs_da3_node_verify_struct, 332 332 }; 333 333 334 + static int 335 + xfs_da3_node_set_type( 336 + struct xfs_trans *tp, 337 + struct xfs_buf *bp) 338 + { 339 + struct xfs_da_blkinfo *info = bp->b_addr; 340 + 341 + switch (be16_to_cpu(info->magic)) { 342 + case XFS_DA_NODE_MAGIC: 343 + case XFS_DA3_NODE_MAGIC: 344 + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DA_NODE_BUF); 345 + return 0; 346 + case XFS_ATTR_LEAF_MAGIC: 347 + case XFS_ATTR3_LEAF_MAGIC: 348 + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_ATTR_LEAF_BUF); 349 + return 0; 350 + case XFS_DIR2_LEAFN_MAGIC: 351 + case XFS_DIR3_LEAFN_MAGIC: 352 + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_LEAFN_BUF); 353 + return 0; 354 + default: 355 + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, tp->t_mountp, 356 + info, sizeof(*info)); 357 + xfs_trans_brelse(tp, bp); 358 + return -EFSCORRUPTED; 359 + } 360 + } 361 + 334 362 int 335 363 xfs_da3_node_read( 336 364 struct xfs_trans *tp, 337 365 struct xfs_inode *dp, 338 366 xfs_dablk_t bno, 367 + struct xfs_buf **bpp, 368 + int whichfork) 369 + { 370 + int error; 371 + 372 + error = xfs_da_read_buf(tp, dp, bno, -1, bpp, whichfork, 373 + &xfs_da3_node_buf_ops); 374 + if (error || !*bpp || !tp) 375 + return error; 376 + return xfs_da3_node_set_type(tp, *bpp); 377 + } 378 + 379 + int 380 + xfs_da3_node_read_mapped( 381 + struct xfs_trans *tp, 382 + struct xfs_inode *dp, 339 383 xfs_daddr_t mappedbno, 340 384 struct xfs_buf **bpp, 341 - int which_fork) 385 + int whichfork) 342 386 { 343 - int err; 387 + int error; 344 388 345 - err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, 346 - which_fork, &xfs_da3_node_buf_ops); 347 - if (!err && tp && *bpp) { 348 - struct xfs_da_blkinfo *info = (*bpp)->b_addr; 349 - int type; 350 - 351 - switch (be16_to_cpu(info->magic)) { 352 - case XFS_DA_NODE_MAGIC: 353 - case XFS_DA3_NODE_MAGIC: 354 - type = XFS_BLFT_DA_NODE_BUF; 355 - break; 356 - case XFS_ATTR_LEAF_MAGIC: 357 - case XFS_ATTR3_LEAF_MAGIC: 358 - type = XFS_BLFT_ATTR_LEAF_BUF; 359 - break; 360 - case XFS_DIR2_LEAFN_MAGIC: 361 - case XFS_DIR3_LEAFN_MAGIC: 362 - type = XFS_BLFT_DIR_LEAFN_BUF; 363 - break; 364 - default: 365 - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, 366 - tp->t_mountp, info, sizeof(*info)); 367 - xfs_trans_brelse(tp, *bpp); 368 - *bpp = NULL; 369 - return -EFSCORRUPTED; 370 - } 371 - xfs_trans_buf_set_type(tp, *bpp, type); 372 - } 373 - return err; 389 + error = xfs_da_read_buf(tp, dp, 0, mappedbno, bpp, whichfork, 390 + &xfs_da3_node_buf_ops); 391 + if (error || !*bpp || !tp) 392 + return error; 393 + return xfs_da3_node_set_type(tp, *bpp); 374 394 } 375 395 376 396 /*======================================================================== ··· 1186 1166 */ 1187 1167 child = be32_to_cpu(oldroothdr.btree[0].before); 1188 1168 ASSERT(child != 0); 1189 - error = xfs_da3_node_read(args->trans, dp, child, -1, &bp, 1190 - args->whichfork); 1169 + error = xfs_da3_node_read(args->trans, dp, child, &bp, args->whichfork); 1191 1170 if (error) 1192 1171 return error; 1193 1172 xfs_da_blkinfo_onlychild_validate(bp->b_addr, oldroothdr.level); ··· 1300 1281 blkno = nodehdr.back; 1301 1282 if (blkno == 0) 1302 1283 continue; 1303 - error = xfs_da3_node_read(state->args->trans, dp, 1304 - blkno, -1, &bp, state->args->whichfork); 1284 + error = xfs_da3_node_read(state->args->trans, dp, blkno, &bp, 1285 + state->args->whichfork); 1305 1286 if (error) 1306 1287 return error; 1307 1288 ··· 1589 1570 */ 1590 1571 blk->blkno = blkno; 1591 1572 error = xfs_da3_node_read(args->trans, args->dp, blkno, 1592 - -1, &blk->bp, args->whichfork); 1573 + &blk->bp, args->whichfork); 1593 1574 if (error) { 1594 1575 blk->blkno = 0; 1595 1576 state->path.active--; ··· 1823 1804 if (old_info->back) { 1824 1805 error = xfs_da3_node_read(args->trans, dp, 1825 1806 be32_to_cpu(old_info->back), 1826 - -1, &bp, args->whichfork); 1807 + &bp, args->whichfork); 1827 1808 if (error) 1828 1809 return error; 1829 1810 ASSERT(bp != NULL); ··· 1844 1825 if (old_info->forw) { 1845 1826 error = xfs_da3_node_read(args->trans, dp, 1846 1827 be32_to_cpu(old_info->forw), 1847 - -1, &bp, args->whichfork); 1828 + &bp, args->whichfork); 1848 1829 if (error) 1849 1830 return error; 1850 1831 ASSERT(bp != NULL); ··· 1903 1884 if (drop_info->back) { 1904 1885 error = xfs_da3_node_read(args->trans, args->dp, 1905 1886 be32_to_cpu(drop_info->back), 1906 - -1, &bp, args->whichfork); 1887 + &bp, args->whichfork); 1907 1888 if (error) 1908 1889 return error; 1909 1890 ASSERT(bp != NULL); ··· 1920 1901 if (drop_info->forw) { 1921 1902 error = xfs_da3_node_read(args->trans, args->dp, 1922 1903 be32_to_cpu(drop_info->forw), 1923 - -1, &bp, args->whichfork); 1904 + &bp, args->whichfork); 1924 1905 if (error) 1925 1906 return error; 1926 1907 ASSERT(bp != NULL); ··· 2004 1985 /* 2005 1986 * Read the next child block into a local buffer. 2006 1987 */ 2007 - error = xfs_da3_node_read(args->trans, dp, blkno, -1, &bp, 1988 + error = xfs_da3_node_read(args->trans, dp, blkno, &bp, 2008 1989 args->whichfork); 2009 1990 if (error) 2010 1991 return error; ··· 2282 2263 * Read the last block in the btree space. 2283 2264 */ 2284 2265 last_blkno = (xfs_dablk_t)lastoff - args->geo->fsbcount; 2285 - error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); 2266 + error = xfs_da3_node_read(tp, dp, last_blkno, &last_buf, w); 2286 2267 if (error) 2287 2268 return error; 2288 2269 /* ··· 2319 2300 * If the moved block has a left sibling, fix up the pointers. 2320 2301 */ 2321 2302 if ((sib_blkno = be32_to_cpu(dead_info->back))) { 2322 - error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w); 2303 + error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w); 2323 2304 if (error) 2324 2305 goto done; 2325 2306 sib_info = sib_buf->b_addr; ··· 2339 2320 * If the moved block has a right sibling, fix up the pointers. 2340 2321 */ 2341 2322 if ((sib_blkno = be32_to_cpu(dead_info->forw))) { 2342 - error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w); 2323 + error = xfs_da3_node_read(tp, dp, sib_blkno, &sib_buf, w); 2343 2324 if (error) 2344 2325 goto done; 2345 2326 sib_info = sib_buf->b_addr; ··· 2361 2342 * Walk down the tree looking for the parent of the moved block. 2362 2343 */ 2363 2344 for (;;) { 2364 - error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w); 2345 + error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w); 2365 2346 if (error) 2366 2347 goto done; 2367 2348 par_node = par_buf->b_addr; ··· 2407 2388 error = -EFSCORRUPTED; 2408 2389 goto done; 2409 2390 } 2410 - error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w); 2391 + error = xfs_da3_node_read(tp, dp, par_blkno, &par_buf, w); 2411 2392 if (error) 2412 2393 goto done; 2413 2394 par_node = par_buf->b_addr;
+4 -2
fs/xfs/libxfs/xfs_da_btree.h
··· 188 188 int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk, 189 189 xfs_da_state_blk_t *new_blk); 190 190 int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, 191 - xfs_dablk_t bno, xfs_daddr_t mappedbno, 192 - struct xfs_buf **bpp, int which_fork); 191 + xfs_dablk_t bno, struct xfs_buf **bpp, int whichfork); 192 + int xfs_da3_node_read_mapped(struct xfs_trans *tp, struct xfs_inode *dp, 193 + xfs_daddr_t mappedbno, struct xfs_buf **bpp, 194 + int whichfork); 193 195 194 196 /* 195 197 * Utility routines.
+4 -4
fs/xfs/xfs_attr_inactive.c
··· 233 233 * traversal of the tree so we may deal with many blocks 234 234 * before we come back to this one. 235 235 */ 236 - error = xfs_da3_node_read(*trans, dp, child_fsb, -1, &child_bp, 236 + error = xfs_da3_node_read(*trans, dp, child_fsb, &child_bp, 237 237 XFS_ATTR_FORK); 238 238 if (error) 239 239 return error; ··· 280 280 if (i + 1 < ichdr.count) { 281 281 struct xfs_da3_icnode_hdr phdr; 282 282 283 - error = xfs_da3_node_read(*trans, dp, 0, parent_blkno, 284 - &bp, XFS_ATTR_FORK); 283 + error = xfs_da3_node_read_mapped(*trans, dp, 284 + parent_blkno, &bp, XFS_ATTR_FORK); 285 285 if (error) 286 286 return error; 287 287 xfs_da3_node_hdr_from_disk(dp->i_mount, &phdr, ··· 322 322 * the extents in reverse order the extent containing 323 323 * block 0 must still be there. 324 324 */ 325 - error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK); 325 + error = xfs_da3_node_read(*trans, dp, 0, &bp, XFS_ATTR_FORK); 326 326 if (error) 327 327 return error; 328 328 blkno = bp->b_bn;
+3 -3
fs/xfs/xfs_attr_list.c
··· 223 223 ASSERT(*pbp == NULL); 224 224 cursor->blkno = 0; 225 225 for (;;) { 226 - error = xfs_da3_node_read(tp, dp, cursor->blkno, -1, &bp, 226 + error = xfs_da3_node_read(tp, dp, cursor->blkno, &bp, 227 227 XFS_ATTR_FORK); 228 228 if (error) 229 229 return error; ··· 309 309 */ 310 310 bp = NULL; 311 311 if (cursor->blkno > 0) { 312 - error = xfs_da3_node_read(context->tp, dp, cursor->blkno, -1, 313 - &bp, XFS_ATTR_FORK); 312 + error = xfs_da3_node_read(context->tp, dp, cursor->blkno, &bp, 313 + XFS_ATTR_FORK); 314 314 if ((error != 0) && (error != -EFSCORRUPTED)) 315 315 return error; 316 316 if (bp) {