@@ -256,31 +256,60 @@ xfs_dir_init(
256256 return error ;
257257}
258258
259+ enum xfs_dir2_fmt
260+ xfs_dir2_format (
261+ struct xfs_da_args * args ,
262+ int * error )
263+ {
264+ struct xfs_inode * dp = args -> dp ;
265+ struct xfs_mount * mp = dp -> i_mount ;
266+ struct xfs_da_geometry * geo = mp -> m_dir_geo ;
267+ xfs_fileoff_t eof ;
268+
269+ xfs_assert_ilocked (dp , XFS_ILOCK_SHARED | XFS_ILOCK_EXCL );
270+
271+ * error = 0 ;
272+ if (dp -> i_df .if_format == XFS_DINODE_FMT_LOCAL )
273+ return XFS_DIR2_FMT_SF ;
274+
275+ * error = xfs_bmap_last_offset (dp , & eof , XFS_DATA_FORK );
276+ if (* error )
277+ return XFS_DIR2_FMT_ERROR ;
278+
279+ if (eof == XFS_B_TO_FSB (mp , geo -> blksize )) {
280+ if (XFS_IS_CORRUPT (mp , dp -> i_disk_size != geo -> blksize )) {
281+ xfs_da_mark_sick (args );
282+ * error = - EFSCORRUPTED ;
283+ return XFS_DIR2_FMT_ERROR ;
284+ }
285+ return XFS_DIR2_FMT_BLOCK ;
286+ }
287+ if (eof == geo -> leafblk + geo -> fsbcount )
288+ return XFS_DIR2_FMT_LEAF ;
289+ return XFS_DIR2_FMT_NODE ;
290+ }
291+
259292int
260293xfs_dir_createname_args (
261294 struct xfs_da_args * args )
262295{
263- bool is_block , is_leaf ;
264296 int error ;
265297
266298 if (!args -> inumber )
267299 args -> op_flags |= XFS_DA_OP_JUSTCHECK ;
268300
269- if (args -> dp -> i_df .if_format == XFS_DINODE_FMT_LOCAL )
301+ switch (xfs_dir2_format (args , & error )) {
302+ case XFS_DIR2_FMT_SF :
270303 return xfs_dir2_sf_addname (args );
271-
272- error = xfs_dir2_isblock (args , & is_block );
273- if (error )
274- return error ;
275- if (is_block )
304+ case XFS_DIR2_FMT_BLOCK :
276305 return xfs_dir2_block_addname (args );
277-
278- error = xfs_dir2_isleaf (args , & is_leaf );
279- if (error )
280- return error ;
281- if (is_leaf )
306+ case XFS_DIR2_FMT_LEAF :
282307 return xfs_dir2_leaf_addname (args );
283- return xfs_dir2_node_addname (args );
308+ case XFS_DIR2_FMT_NODE :
309+ return xfs_dir2_node_addname (args );
310+ default :
311+ return error ;
312+ }
284313}
285314
286315/*
@@ -359,36 +388,25 @@ int
359388xfs_dir_lookup_args (
360389 struct xfs_da_args * args )
361390{
362- bool is_block , is_leaf ;
363391 int error ;
364392
365- if (args -> dp -> i_df .if_format == XFS_DINODE_FMT_LOCAL ) {
393+ switch (xfs_dir2_format (args , & error )) {
394+ case XFS_DIR2_FMT_SF :
366395 error = xfs_dir2_sf_lookup (args );
367- goto out ;
368- }
369-
370- /* dir2 functions require that the data fork is loaded */
371- error = xfs_iread_extents (args -> trans , args -> dp , XFS_DATA_FORK );
372- if (error )
373- goto out ;
374-
375- error = xfs_dir2_isblock (args , & is_block );
376- if (error )
377- goto out ;
378-
379- if (is_block ) {
396+ break ;
397+ case XFS_DIR2_FMT_BLOCK :
380398 error = xfs_dir2_block_lookup (args );
381- goto out ;
382- }
383-
384- error = xfs_dir2_isleaf (args , & is_leaf );
385- if (error )
386- goto out ;
387- if (is_leaf )
399+ break ;
400+ case XFS_DIR2_FMT_LEAF :
388401 error = xfs_dir2_leaf_lookup (args );
389- else
402+ break ;
403+ case XFS_DIR2_FMT_NODE :
390404 error = xfs_dir2_node_lookup (args );
391- out :
405+ break ;
406+ default :
407+ break ;
408+ }
409+
392410 if (error != - EEXIST )
393411 return error ;
394412 return 0 ;
@@ -448,24 +466,20 @@ int
448466xfs_dir_removename_args (
449467 struct xfs_da_args * args )
450468{
451- bool is_block , is_leaf ;
452469 int error ;
453470
454- if (args -> dp -> i_df .if_format == XFS_DINODE_FMT_LOCAL )
471+ switch (xfs_dir2_format (args , & error )) {
472+ case XFS_DIR2_FMT_SF :
455473 return xfs_dir2_sf_removename (args );
456-
457- error = xfs_dir2_isblock (args , & is_block );
458- if (error )
459- return error ;
460- if (is_block )
474+ case XFS_DIR2_FMT_BLOCK :
461475 return xfs_dir2_block_removename (args );
462-
463- error = xfs_dir2_isleaf (args , & is_leaf );
464- if (error )
465- return error ;
466- if (is_leaf )
476+ case XFS_DIR2_FMT_LEAF :
467477 return xfs_dir2_leaf_removename (args );
468- return xfs_dir2_node_removename (args );
478+ case XFS_DIR2_FMT_NODE :
479+ return xfs_dir2_node_removename (args );
480+ default :
481+ return error ;
482+ }
469483}
470484
471485/*
@@ -509,25 +523,20 @@ int
509523xfs_dir_replace_args (
510524 struct xfs_da_args * args )
511525{
512- bool is_block , is_leaf ;
513526 int error ;
514527
515- if (args -> dp -> i_df .if_format == XFS_DINODE_FMT_LOCAL )
528+ switch (xfs_dir2_format (args , & error )) {
529+ case XFS_DIR2_FMT_SF :
516530 return xfs_dir2_sf_replace (args );
517-
518- error = xfs_dir2_isblock (args , & is_block );
519- if (error )
520- return error ;
521- if (is_block )
531+ case XFS_DIR2_FMT_BLOCK :
522532 return xfs_dir2_block_replace (args );
523-
524- error = xfs_dir2_isleaf (args , & is_leaf );
525- if (error )
526- return error ;
527- if (is_leaf )
533+ case XFS_DIR2_FMT_LEAF :
528534 return xfs_dir2_leaf_replace (args );
529-
530- return xfs_dir2_node_replace (args );
535+ case XFS_DIR2_FMT_NODE :
536+ return xfs_dir2_node_replace (args );
537+ default :
538+ return error ;
539+ }
531540}
532541
533542/*
@@ -633,57 +642,6 @@ xfs_dir2_grow_inode(
633642 return 0 ;
634643}
635644
636- /*
637- * See if the directory is a single-block form directory.
638- */
639- int
640- xfs_dir2_isblock (
641- struct xfs_da_args * args ,
642- bool * isblock )
643- {
644- struct xfs_mount * mp = args -> dp -> i_mount ;
645- xfs_fileoff_t eof ;
646- int error ;
647-
648- error = xfs_bmap_last_offset (args -> dp , & eof , XFS_DATA_FORK );
649- if (error )
650- return error ;
651-
652- * isblock = false;
653- if (XFS_FSB_TO_B (mp , eof ) != args -> geo -> blksize )
654- return 0 ;
655-
656- * isblock = true;
657- if (XFS_IS_CORRUPT (mp , args -> dp -> i_disk_size != args -> geo -> blksize )) {
658- xfs_da_mark_sick (args );
659- return - EFSCORRUPTED ;
660- }
661- return 0 ;
662- }
663-
664- /*
665- * See if the directory is a single-leaf form directory.
666- */
667- int
668- xfs_dir2_isleaf (
669- struct xfs_da_args * args ,
670- bool * isleaf )
671- {
672- xfs_fileoff_t eof ;
673- int error ;
674-
675- error = xfs_bmap_last_offset (args -> dp , & eof , XFS_DATA_FORK );
676- if (error )
677- return error ;
678-
679- * isleaf = false;
680- if (eof != args -> geo -> leafblk + args -> geo -> fsbcount )
681- return 0 ;
682-
683- * isleaf = true;
684- return 0 ;
685- }
686-
687645/*
688646 * Remove the given block from the directory.
689647 * This routine is used for data and free blocks, leaf/node are done
0 commit comments