LCOV - code coverage report
Current view: top level - fs/xfs/libxfs - xfs_dir2_node.c (source / functions) Hit Total Coverage
Test: fstests of 6.5.0-rc3-djwa @ Mon Jul 31 20:08:17 PDT 2023 Lines: 938 1039 90.3 %
Date: 2023-07-31 20:08:17 Functions: 38 38 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
       4             :  * Copyright (c) 2013 Red Hat, Inc.
       5             :  * All Rights Reserved.
       6             :  */
       7             : #include "xfs.h"
       8             : #include "xfs_fs.h"
       9             : #include "xfs_shared.h"
      10             : #include "xfs_format.h"
      11             : #include "xfs_log_format.h"
      12             : #include "xfs_trans_resv.h"
      13             : #include "xfs_mount.h"
      14             : #include "xfs_inode.h"
      15             : #include "xfs_bmap.h"
      16             : #include "xfs_dir2.h"
      17             : #include "xfs_dir2_priv.h"
      18             : #include "xfs_error.h"
      19             : #include "xfs_trace.h"
      20             : #include "xfs_trans.h"
      21             : #include "xfs_buf_item.h"
      22             : #include "xfs_log.h"
      23             : 
      24             : /*
      25             :  * Function declarations.
      26             :  */
      27             : static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args,
      28             :                               int index);
      29             : static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state,
      30             :                                      xfs_da_state_blk_t *blk1,
      31             :                                      xfs_da_state_blk_t *blk2);
      32             : static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp,
      33             :                                  int index, xfs_da_state_blk_t *dblk,
      34             :                                  int *rval);
      35             : 
      36             : /*
      37             :  * Convert data space db to the corresponding free db.
      38             :  */
      39             : static xfs_dir2_db_t
      40    13027329 : xfs_dir2_db_to_fdb(struct xfs_da_geometry *geo, xfs_dir2_db_t db)
      41             : {
      42    13027329 :         return xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET) +
      43    13027329 :                         (db / geo->free_max_bests);
      44             : }
      45             : 
      46             : /*
      47             :  * Convert data space db to the corresponding index in a free db.
      48             :  */
      49             : static int
      50    13027250 : xfs_dir2_db_to_fdindex(struct xfs_da_geometry *geo, xfs_dir2_db_t db)
      51             : {
      52    13027250 :         return db % geo->free_max_bests;
      53             : }
      54             : 
      55             : /*
      56             :  * Check internal consistency of a leafn block.
      57             :  */
      58             : #ifdef DEBUG
      59             : static xfs_failaddr_t
      60   235766708 : xfs_dir3_leafn_check(
      61             :         struct xfs_inode        *dp,
      62             :         struct xfs_buf          *bp)
      63             : {
      64   235766708 :         struct xfs_dir2_leaf    *leaf = bp->b_addr;
      65   235766708 :         struct xfs_dir3_icleaf_hdr leafhdr;
      66             : 
      67   235766708 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
      68             : 
      69   235747722 :         if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) {
      70   235747722 :                 struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr;
      71   235747722 :                 if (be64_to_cpu(leaf3->info.blkno) != xfs_buf_daddr(bp))
      72           0 :                         return __this_address;
      73           0 :         } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC)
      74           0 :                 return __this_address;
      75             : 
      76   235747722 :         return xfs_dir3_leaf_check_int(dp->i_mount, &leafhdr, leaf, false);
      77             : }
      78             : 
      79             : static inline void
      80   235752764 : xfs_dir3_leaf_check(
      81             :         struct xfs_inode        *dp,
      82             :         struct xfs_buf          *bp)
      83             : {
      84   235752764 :         xfs_failaddr_t          fa;
      85             : 
      86   235752764 :         fa = xfs_dir3_leafn_check(dp, bp);
      87   235760551 :         if (!fa)
      88             :                 return;
      89           0 :         xfs_corruption_error(__func__, XFS_ERRLEVEL_LOW, dp->i_mount,
      90           0 :                         bp->b_addr, BBTOB(bp->b_length), __FILE__, __LINE__,
      91             :                         fa);
      92           0 :         ASSERT(0);
      93             : }
      94             : #else
      95             : #define xfs_dir3_leaf_check(dp, bp)
      96             : #endif
      97             : 
      98             : static xfs_failaddr_t
      99      213041 : xfs_dir3_free_verify(
     100             :         struct xfs_buf          *bp)
     101             : {
     102      213041 :         struct xfs_mount        *mp = bp->b_mount;
     103      213041 :         struct xfs_dir2_free_hdr *hdr = bp->b_addr;
     104             : 
     105      213041 :         if (!xfs_verify_magic(bp, hdr->magic))
     106           0 :                 return __this_address;
     107             : 
     108      213041 :         if (xfs_has_crc(mp)) {
     109      213041 :                 struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
     110             : 
     111      213041 :                 if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid))
     112           0 :                         return __this_address;
     113      213041 :                 if (be64_to_cpu(hdr3->blkno) != xfs_buf_daddr(bp))
     114           0 :                         return __this_address;
     115      213041 :                 if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn)))
     116           0 :                         return __this_address;
     117             :         }
     118             : 
     119             :         /* XXX: should bounds check the xfs_dir3_icfree_hdr here */
     120             : 
     121             :         return NULL;
     122             : }
     123             : 
     124             : static void
     125       40058 : xfs_dir3_free_read_verify(
     126             :         struct xfs_buf  *bp)
     127             : {
     128       40058 :         struct xfs_mount        *mp = bp->b_mount;
     129       40058 :         xfs_failaddr_t          fa;
     130             : 
     131       80116 :         if (xfs_has_crc(mp) &&
     132             :             !xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF))
     133           2 :                 xfs_verifier_error(bp, -EFSBADCRC, __this_address);
     134             :         else {
     135       40056 :                 fa = xfs_dir3_free_verify(bp);
     136       40056 :                 if (fa)
     137           0 :                         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
     138             :         }
     139       40058 : }
     140             : 
     141             : static void
     142      132533 : xfs_dir3_free_write_verify(
     143             :         struct xfs_buf  *bp)
     144             : {
     145      132533 :         struct xfs_mount        *mp = bp->b_mount;
     146      132533 :         struct xfs_buf_log_item *bip = bp->b_log_item;
     147      132533 :         struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr;
     148      132533 :         xfs_failaddr_t          fa;
     149             : 
     150      132533 :         fa = xfs_dir3_free_verify(bp);
     151      132533 :         if (fa) {
     152           0 :                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
     153           0 :                 return;
     154             :         }
     155             : 
     156      132533 :         if (!xfs_has_crc(mp))
     157             :                 return;
     158             : 
     159      132533 :         if (bip)
     160      132533 :                 hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn);
     161             : 
     162      132533 :         xfs_buf_update_cksum(bp, XFS_DIR3_FREE_CRC_OFF);
     163             : }
     164             : 
     165             : const struct xfs_buf_ops xfs_dir3_free_buf_ops = {
     166             :         .name = "xfs_dir3_free",
     167             :         .magic = { cpu_to_be32(XFS_DIR2_FREE_MAGIC),
     168             :                    cpu_to_be32(XFS_DIR3_FREE_MAGIC) },
     169             :         .verify_read = xfs_dir3_free_read_verify,
     170             :         .verify_write = xfs_dir3_free_write_verify,
     171             :         .verify_struct = xfs_dir3_free_verify,
     172             : };
     173             : 
     174             : /* Everything ok in the free block header? */
     175             : static xfs_failaddr_t
     176    40089474 : xfs_dir3_free_header_check(
     177             :         struct xfs_inode        *dp,
     178             :         xfs_dablk_t             fbno,
     179             :         struct xfs_buf          *bp)
     180             : {
     181    40089474 :         struct xfs_mount        *mp = dp->i_mount;
     182    40089474 :         int                     maxbests = mp->m_dir_geo->free_max_bests;
     183    40089474 :         unsigned int            firstdb;
     184             : 
     185    40089474 :         firstdb = (xfs_dir2_da_to_db(mp->m_dir_geo, fbno) -
     186    40092702 :                    xfs_dir2_byte_to_db(mp->m_dir_geo, XFS_DIR2_FREE_OFFSET)) *
     187             :                         maxbests;
     188    40091757 :         if (xfs_has_crc(mp)) {
     189    40091757 :                 struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;
     190             : 
     191    80183514 :                 if (be32_to_cpu(hdr3->firstdb) != firstdb)
     192         612 :                         return __this_address;
     193    80182324 :                 if (be32_to_cpu(hdr3->nvalid) > maxbests)
     194           0 :                         return __this_address;
     195    80182324 :                 if (be32_to_cpu(hdr3->nvalid) < be32_to_cpu(hdr3->nused))
     196           0 :                         return __this_address;
     197    40091162 :                 if (be64_to_cpu(hdr3->hdr.owner) != dp->i_ino)
     198           2 :                         return __this_address;
     199             :         } else {
     200           0 :                 struct xfs_dir2_free_hdr *hdr = bp->b_addr;
     201             : 
     202           0 :                 if (be32_to_cpu(hdr->firstdb) != firstdb)
     203           0 :                         return __this_address;
     204           0 :                 if (be32_to_cpu(hdr->nvalid) > maxbests)
     205           0 :                         return __this_address;
     206           0 :                 if (be32_to_cpu(hdr->nvalid) < be32_to_cpu(hdr->nused))
     207           0 :                         return __this_address;
     208             :         }
     209             :         return NULL;
     210             : }
     211             : 
     212             : static int
     213    40087415 : __xfs_dir3_free_read(
     214             :         struct xfs_trans        *tp,
     215             :         struct xfs_inode        *dp,
     216             :         xfs_dablk_t             fbno,
     217             :         unsigned int            flags,
     218             :         struct xfs_buf          **bpp)
     219             : {
     220    40087415 :         xfs_failaddr_t          fa;
     221    40087415 :         int                     err;
     222             : 
     223    40087415 :         err = xfs_da_read_buf(tp, dp, fbno, flags, bpp, XFS_DATA_FORK,
     224             :                         &xfs_dir3_free_buf_ops);
     225    40092835 :         if (err || !*bpp)
     226             :                 return err;
     227             : 
     228             :         /* Check things that we can't do in the verifier. */
     229    40092633 :         fa = xfs_dir3_free_header_check(dp, fbno, *bpp);
     230    40092089 :         if (fa) {
     231           0 :                 __xfs_buf_mark_corrupt(*bpp, fa);
     232           0 :                 xfs_trans_brelse(tp, *bpp);
     233           0 :                 *bpp = NULL;
     234           0 :                 return -EFSCORRUPTED;
     235             :         }
     236             : 
     237             :         /* try read returns without an error or *bpp if it lands in a hole */
     238    40092089 :         if (tp)
     239    40092089 :                 xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_FREE_BUF);
     240             : 
     241             :         return 0;
     242             : }
     243             : 
     244             : void
     245    53341419 : xfs_dir2_free_hdr_from_disk(
     246             :         struct xfs_mount                *mp,
     247             :         struct xfs_dir3_icfree_hdr      *to,
     248             :         struct xfs_dir2_free            *from)
     249             : {
     250    53341419 :         if (xfs_has_crc(mp)) {
     251    53341419 :                 struct xfs_dir3_free    *from3 = (struct xfs_dir3_free *)from;
     252             : 
     253    53341419 :                 to->magic = be32_to_cpu(from3->hdr.hdr.magic);
     254    53341419 :                 to->firstdb = be32_to_cpu(from3->hdr.firstdb);
     255    53341419 :                 to->nvalid = be32_to_cpu(from3->hdr.nvalid);
     256    53341419 :                 to->nused = be32_to_cpu(from3->hdr.nused);
     257    53341419 :                 to->bests = from3->bests;
     258             : 
     259    53341419 :                 ASSERT(to->magic == XFS_DIR3_FREE_MAGIC);
     260             :         } else {
     261           0 :                 to->magic = be32_to_cpu(from->hdr.magic);
     262           0 :                 to->firstdb = be32_to_cpu(from->hdr.firstdb);
     263           0 :                 to->nvalid = be32_to_cpu(from->hdr.nvalid);
     264           0 :                 to->nused = be32_to_cpu(from->hdr.nused);
     265           0 :                 to->bests = from->bests;
     266             : 
     267           0 :                 ASSERT(to->magic == XFS_DIR2_FREE_MAGIC);
     268             :         }
     269    53341419 : }
     270             : 
     271             : static void
     272       48487 : xfs_dir2_free_hdr_to_disk(
     273             :         struct xfs_mount                *mp,
     274             :         struct xfs_dir2_free            *to,
     275             :         struct xfs_dir3_icfree_hdr      *from)
     276             : {
     277       48487 :         if (xfs_has_crc(mp)) {
     278       48487 :                 struct xfs_dir3_free    *to3 = (struct xfs_dir3_free *)to;
     279             : 
     280       48487 :                 ASSERT(from->magic == XFS_DIR3_FREE_MAGIC);
     281             : 
     282       48487 :                 to3->hdr.hdr.magic = cpu_to_be32(from->magic);
     283       48487 :                 to3->hdr.firstdb = cpu_to_be32(from->firstdb);
     284       48487 :                 to3->hdr.nvalid = cpu_to_be32(from->nvalid);
     285       96974 :                 to3->hdr.nused = cpu_to_be32(from->nused);
     286             :         } else {
     287           0 :                 ASSERT(from->magic == XFS_DIR2_FREE_MAGIC);
     288             : 
     289           0 :                 to->hdr.magic = cpu_to_be32(from->magic);
     290           0 :                 to->hdr.firstdb = cpu_to_be32(from->firstdb);
     291           0 :                 to->hdr.nvalid = cpu_to_be32(from->nvalid);
     292           0 :                 to->hdr.nused = cpu_to_be32(from->nused);
     293             :         }
     294       48487 : }
     295             : 
     296             : int
     297       41853 : xfs_dir2_free_read(
     298             :         struct xfs_trans        *tp,
     299             :         struct xfs_inode        *dp,
     300             :         xfs_dablk_t             fbno,
     301             :         struct xfs_buf          **bpp)
     302             : {
     303    11640219 :         return __xfs_dir3_free_read(tp, dp, fbno, 0, bpp);
     304             : }
     305             : 
     306             : static int
     307             : xfs_dir2_free_try_read(
     308             :         struct xfs_trans        *tp,
     309             :         struct xfs_inode        *dp,
     310             :         xfs_dablk_t             fbno,
     311             :         struct xfs_buf          **bpp)
     312             : {
     313    28450255 :         return __xfs_dir3_free_read(tp, dp, fbno, XFS_DABUF_MAP_HOLE_OK, bpp);
     314             : }
     315             : 
     316             : static int
     317        1726 : xfs_dir3_free_get_buf(
     318             :         xfs_da_args_t           *args,
     319             :         xfs_dir2_db_t           fbno,
     320             :         struct xfs_buf          **bpp)
     321             : {
     322        1726 :         struct xfs_trans        *tp = args->trans;
     323        1726 :         struct xfs_inode        *dp = args->dp;
     324        1726 :         struct xfs_mount        *mp = dp->i_mount;
     325        1726 :         struct xfs_buf          *bp;
     326        1726 :         int                     error;
     327        1726 :         struct xfs_dir3_icfree_hdr hdr;
     328             : 
     329        1726 :         error = xfs_da_get_buf(tp, dp, xfs_dir2_db_to_da(args->geo, fbno),
     330             :                         &bp, XFS_DATA_FORK);
     331        1726 :         if (error)
     332             :                 return error;
     333             : 
     334        1726 :         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_FREE_BUF);
     335        1726 :         bp->b_ops = &xfs_dir3_free_buf_ops;
     336             : 
     337             :         /*
     338             :          * Initialize the new block to be empty, and remember
     339             :          * its first slot as our empty slot.
     340             :          */
     341        1726 :         memset(bp->b_addr, 0, sizeof(struct xfs_dir3_free_hdr));
     342        1726 :         memset(&hdr, 0, sizeof(hdr));
     343             : 
     344        1726 :         if (xfs_has_crc(mp)) {
     345        1726 :                 struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;
     346             : 
     347        1726 :                 hdr.magic = XFS_DIR3_FREE_MAGIC;
     348             : 
     349        1726 :                 hdr3->hdr.blkno = cpu_to_be64(xfs_buf_daddr(bp));
     350        1726 :                 hdr3->hdr.owner = cpu_to_be64(dp->i_ino);
     351        1726 :                 uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_meta_uuid);
     352             :         } else
     353           0 :                 hdr.magic = XFS_DIR2_FREE_MAGIC;
     354        1726 :         xfs_dir2_free_hdr_to_disk(mp, bp->b_addr, &hdr);
     355        1726 :         *bpp = bp;
     356        1726 :         return 0;
     357             : }
     358             : 
     359             : /*
     360             :  * Log entries from a freespace block.
     361             :  */
     362             : STATIC void
     363    25341125 : xfs_dir2_free_log_bests(
     364             :         struct xfs_da_args      *args,
     365             :         struct xfs_dir3_icfree_hdr *hdr,
     366             :         struct xfs_buf          *bp,
     367             :         int                     first,          /* first entry to log */
     368             :         int                     last)           /* last entry to log */
     369             : {
     370    25341125 :         struct xfs_dir2_free    *free = bp->b_addr;
     371             : 
     372    25341125 :         ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
     373             :                free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
     374    25341125 :         xfs_trans_log_buf(args->trans, bp,
     375    25341125 :                           (char *)&hdr->bests[first] - (char *)free,
     376    25341125 :                           (char *)&hdr->bests[last] - (char *)free +
     377             :                            sizeof(hdr->bests[0]) - 1);
     378    25340531 : }
     379             : 
     380             : /*
     381             :  * Log header from a freespace block.
     382             :  */
     383             : static void
     384       46761 : xfs_dir2_free_log_header(
     385             :         struct xfs_da_args      *args,
     386             :         struct xfs_buf          *bp)
     387             : {
     388             : #ifdef DEBUG
     389       46761 :         xfs_dir2_free_t         *free;          /* freespace structure */
     390             : 
     391       46761 :         free = bp->b_addr;
     392       46761 :         ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
     393             :                free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
     394             : #endif
     395       46761 :         xfs_trans_log_buf(args->trans, bp, 0,
     396       46761 :                           args->geo->free_hdr_size - 1);
     397       46761 : }
     398             : 
     399             : /*
     400             :  * Convert a leaf-format directory to a node-format directory.
     401             :  * We need to change the magic number of the leaf block, and copy
     402             :  * the freespace table out of the leaf block into its own block.
     403             :  */
     404             : int                                             /* error */
     405        1725 : xfs_dir2_leaf_to_node(
     406             :         xfs_da_args_t           *args,          /* operation arguments */
     407             :         struct xfs_buf          *lbp)           /* leaf buffer */
     408             : {
     409        1725 :         xfs_inode_t             *dp;            /* incore directory inode */
     410        1725 :         int                     error;          /* error return value */
     411        1725 :         struct xfs_buf          *fbp;           /* freespace buffer */
     412        1725 :         xfs_dir2_db_t           fdb;            /* freespace block number */
     413        1725 :         __be16                  *from;          /* pointer to freespace entry */
     414        1725 :         int                     i;              /* leaf freespace index */
     415        1725 :         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
     416        1725 :         xfs_dir2_leaf_tail_t    *ltp;           /* leaf tail structure */
     417        1725 :         int                     n;              /* count of live freespc ents */
     418        1725 :         xfs_dir2_data_off_t     off;            /* freespace entry value */
     419        1725 :         xfs_trans_t             *tp;            /* transaction pointer */
     420        1725 :         struct xfs_dir3_icfree_hdr freehdr;
     421             : 
     422        1725 :         trace_xfs_dir2_leaf_to_node(args);
     423             : 
     424        1725 :         dp = args->dp;
     425        1725 :         tp = args->trans;
     426             :         /*
     427             :          * Add a freespace block to the directory.
     428             :          */
     429        1725 :         if ((error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fdb))) {
     430             :                 return error;
     431             :         }
     432        1723 :         ASSERT(fdb == xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET));
     433             :         /*
     434             :          * Get the buffer for the new freespace block.
     435             :          */
     436        1723 :         error = xfs_dir3_free_get_buf(args, fdb, &fbp);
     437        1723 :         if (error)
     438             :                 return error;
     439             : 
     440        1723 :         xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, fbp->b_addr);
     441        1723 :         leaf = lbp->b_addr;
     442        1723 :         ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);
     443        1723 :         if (be32_to_cpu(ltp->bestcount) >
     444        3446 :                                 (uint)dp->i_disk_size / args->geo->blksize) {
     445           0 :                 xfs_buf_mark_corrupt(lbp);
     446           0 :                 return -EFSCORRUPTED;
     447             :         }
     448             : 
     449             :         /*
     450             :          * Copy freespace entries from the leaf block to the new block.
     451             :          * Count active entries.
     452             :          */
     453        1723 :         from = xfs_dir2_leaf_bests_p(ltp);
     454       14062 :         for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++) {
     455        5308 :                 off = be16_to_cpu(*from);
     456        5308 :                 if (off != NULLDATAOFF)
     457        5305 :                         n++;
     458       10616 :                 freehdr.bests[i] = cpu_to_be16(off);
     459             :         }
     460             : 
     461             :         /*
     462             :          * Now initialize the freespace block header.
     463             :          */
     464        1723 :         freehdr.nused = n;
     465        1723 :         freehdr.nvalid = be32_to_cpu(ltp->bestcount);
     466             : 
     467        1723 :         xfs_dir2_free_hdr_to_disk(dp->i_mount, fbp->b_addr, &freehdr);
     468        1723 :         xfs_dir2_free_log_bests(args, &freehdr, fbp, 0, freehdr.nvalid - 1);
     469        1723 :         xfs_dir2_free_log_header(args, fbp);
     470             : 
     471             :         /*
     472             :          * Converting the leaf to a leafnode is just a matter of changing the
     473             :          * magic number and the ops. Do the change directly to the buffer as
     474             :          * it's less work (and less code) than decoding the header to host
     475             :          * format and back again.
     476             :          */
     477        1723 :         if (leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC))
     478           0 :                 leaf->hdr.info.magic = cpu_to_be16(XFS_DIR2_LEAFN_MAGIC);
     479             :         else
     480        1723 :                 leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC);
     481        1723 :         lbp->b_ops = &xfs_dir3_leafn_buf_ops;
     482        1723 :         xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF);
     483        1723 :         xfs_dir3_leaf_log_header(args, lbp);
     484        1723 :         xfs_dir3_leaf_check(dp, lbp);
     485        1723 :         return 0;
     486             : }
     487             : 
     488             : /*
     489             :  * Add a leaf entry to a leaf block in a node-form directory.
     490             :  * The other work necessary is done from the caller.
     491             :  */
     492             : static int                                      /* error */
     493    28240995 : xfs_dir2_leafn_add(
     494             :         struct xfs_buf          *bp,            /* leaf buffer */
     495             :         struct xfs_da_args      *args,          /* operation arguments */
     496             :         int                     index)          /* insertion pt for new entry */
     497             : {
     498    28240995 :         struct xfs_dir3_icleaf_hdr leafhdr;
     499    28240995 :         struct xfs_inode        *dp = args->dp;
     500    28240995 :         struct xfs_dir2_leaf    *leaf = bp->b_addr;
     501    28240995 :         struct xfs_dir2_leaf_entry *lep;
     502    28240995 :         struct xfs_dir2_leaf_entry *ents;
     503    28240995 :         int                     compact;        /* compacting stale leaves */
     504    28240995 :         int                     highstale = 0;  /* next stale entry */
     505    28240995 :         int                     lfloghigh;      /* high leaf entry logging */
     506    28240995 :         int                     lfloglow;       /* low leaf entry logging */
     507    28240995 :         int                     lowstale = 0;   /* previous stale entry */
     508             : 
     509    28240995 :         trace_xfs_dir2_leafn_add(args, index);
     510             : 
     511    28243342 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
     512    28243489 :         ents = leafhdr.ents;
     513             : 
     514             :         /*
     515             :          * Quick check just to make sure we are not going to index
     516             :          * into other peoples memory
     517             :          */
     518    28243489 :         if (index < 0) {
     519           0 :                 xfs_buf_mark_corrupt(bp);
     520           0 :                 return -EFSCORRUPTED;
     521             :         }
     522             : 
     523             :         /*
     524             :          * If there are already the maximum number of leaf entries in
     525             :          * the block, if there are no stale entries it won't fit.
     526             :          * Caller will do a split.  If there are stale entries we'll do
     527             :          * a compact.
     528             :          */
     529             : 
     530    28243489 :         if (leafhdr.count == args->geo->leaf_max_ents) {
     531       32242 :                 if (!leafhdr.stale)
     532             :                         return -ENOSPC;
     533        7843 :                 compact = leafhdr.stale > 1;
     534             :         } else
     535             :                 compact = 0;
     536    56423292 :         ASSERT(index == 0 || be32_to_cpu(ents[index - 1].hashval) <= args->hashval);
     537    54468385 :         ASSERT(index == leafhdr.count ||
     538             :                be32_to_cpu(ents[index].hashval) >= args->hashval);
     539             : 
     540    28219090 :         if (args->op_flags & XFS_DA_OP_JUSTCHECK)
     541             :                 return 0;
     542             : 
     543             :         /*
     544             :          * Compact out all but one stale leaf entry.  Leaves behind
     545             :          * the entry closest to index.
     546             :          */
     547    28219090 :         if (compact)
     548        3155 :                 xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale,
     549             :                                          &highstale, &lfloglow, &lfloghigh);
     550    28215935 :         else if (leafhdr.stale) {
     551             :                 /*
     552             :                  * Set impossible logging indices for this case.
     553             :                  */
     554    20786905 :                 lfloglow = leafhdr.count;
     555    20786905 :                 lfloghigh = -1;
     556             :         }
     557             : 
     558             :         /*
     559             :          * Insert the new entry, log everything.
     560             :          */
     561    28219090 :         lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale,
     562             :                                        highstale, &lfloglow, &lfloghigh);
     563             : 
     564    28216794 :         lep->hashval = cpu_to_be32(args->hashval);
     565    28216794 :         lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(args->geo,
     566             :                                 args->blkno, args->index));
     567             : 
     568    28218557 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
     569    28218609 :         xfs_dir3_leaf_log_header(args, bp);
     570    28218403 :         xfs_dir3_leaf_log_ents(args, &leafhdr, bp, lfloglow, lfloghigh);
     571    28219009 :         xfs_dir3_leaf_check(dp, bp);
     572    28219009 :         return 0;
     573             : }
     574             : 
     575             : #ifdef DEBUG
     576             : static void
     577      254511 : xfs_dir2_free_hdr_check(
     578             :         struct xfs_inode *dp,
     579             :         struct xfs_buf  *bp,
     580             :         xfs_dir2_db_t   db)
     581             : {
     582      254511 :         struct xfs_dir3_icfree_hdr hdr;
     583             : 
     584      254511 :         xfs_dir2_free_hdr_from_disk(dp->i_mount, &hdr, bp->b_addr);
     585             : 
     586      254511 :         ASSERT((hdr.firstdb % dp->i_mount->m_dir_geo->free_max_bests) == 0);
     587      254511 :         ASSERT(hdr.firstdb <= db);
     588      254511 :         ASSERT(db < hdr.firstdb + hdr.nvalid);
     589      254511 : }
     590             : #else
     591             : #define xfs_dir2_free_hdr_check(dp, bp, db)
     592             : #endif  /* DEBUG */
     593             : 
     594             : /*
     595             :  * Return the last hash value in the leaf.
     596             :  * Stale entries are ok.
     597             :  */
     598             : xfs_dahash_t                                    /* hash value */
     599   235266041 : xfs_dir2_leaf_lasthash(
     600             :         struct xfs_inode *dp,
     601             :         struct xfs_buf  *bp,                    /* leaf buffer */
     602             :         int             *count)                 /* count of entries in leaf */
     603             : {
     604   235266041 :         struct xfs_dir3_icleaf_hdr leafhdr;
     605             : 
     606   235266041 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, bp->b_addr);
     607             : 
     608   235267533 :         ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
     609             :                leafhdr.magic == XFS_DIR3_LEAFN_MAGIC ||
     610             :                leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||
     611             :                leafhdr.magic == XFS_DIR3_LEAF1_MAGIC);
     612             : 
     613   235267533 :         if (count)
     614    55368664 :                 *count = leafhdr.count;
     615   235267533 :         if (!leafhdr.count)
     616             :                 return 0;
     617   235267533 :         return be32_to_cpu(leafhdr.ents[leafhdr.count - 1].hashval);
     618             : }
     619             : 
     620             : /*
     621             :  * Look up a leaf entry for space to add a name in a node-format leaf block.
     622             :  * The extrablk in state is a freespace block.
     623             :  */
     624             : STATIC int
     625    28374075 : xfs_dir2_leafn_lookup_for_addname(
     626             :         struct xfs_buf          *bp,            /* leaf buffer */
     627             :         xfs_da_args_t           *args,          /* operation arguments */
     628             :         int                     *indexp,        /* out: leaf entry index */
     629             :         xfs_da_state_t          *state)         /* state to fill in */
     630             : {
     631    28374075 :         struct xfs_buf          *curbp = NULL;  /* current data/free buffer */
     632    28374075 :         xfs_dir2_db_t           curdb = -1;     /* current data block number */
     633    28374075 :         xfs_dir2_db_t           curfdb = -1;    /* current free block number */
     634    28374075 :         xfs_inode_t             *dp;            /* incore directory inode */
     635    28374075 :         int                     error;          /* error return value */
     636    28374075 :         int                     fi;             /* free entry index */
     637    28374075 :         xfs_dir2_free_t         *free = NULL;   /* free block structure */
     638    28374075 :         int                     index;          /* leaf entry index */
     639    28374075 :         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
     640    28374075 :         int                     length;         /* length of new data entry */
     641    28374075 :         xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
     642    28374075 :         xfs_mount_t             *mp;            /* filesystem mount point */
     643    28374075 :         xfs_dir2_db_t           newdb;          /* new data block number */
     644    28374075 :         xfs_dir2_db_t           newfdb;         /* new free block number */
     645    28374075 :         xfs_trans_t             *tp;            /* transaction pointer */
     646    28374075 :         struct xfs_dir3_icleaf_hdr leafhdr;
     647             : 
     648    28374075 :         dp = args->dp;
     649    28374075 :         tp = args->trans;
     650    28374075 :         mp = dp->i_mount;
     651    28374075 :         leaf = bp->b_addr;
     652    28374075 :         xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
     653             : 
     654    28376031 :         xfs_dir3_leaf_check(dp, bp);
     655    28375192 :         ASSERT(leafhdr.count > 0);
     656             : 
     657             :         /*
     658             :          * Look up the hash value in the leaf entries.
     659             :          */
     660    28375192 :         index = xfs_dir2_leaf_search_hash(args, bp);
     661             :         /*
     662             :          * Do we have a buffer coming in?
     663             :          */
     664    28375488 :         if (state->extravalid) {
     665             :                 /* If so, it's a free block buffer, get the block number. */
     666      156154 :                 curbp = state->extrablk.bp;
     667      156154 :                 curfdb = state->extrablk.blkno;
     668      156154 :                 free = curbp->b_addr;
     669      156154 :                 ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
     670             :                        free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
     671             :         }
     672    28375488 :         length = xfs_dir2_data_entsize(mp, args->namelen);
     673             :         /*
     674             :          * Loop over leaf entries with the right hash value.
     675             :          */
     676    28375488 :         for (lep = &leafhdr.ents[index];
     677   104096208 :              index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
     678    24673368 :              lep++, index++) {
     679             :                 /*
     680             :                  * Skip stale leaf entries.
     681             :                  */
     682    24854229 :                 if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
     683      251211 :                         continue;
     684             :                 /*
     685             :                  * Pull the data block number from the entry.
     686             :                  */
     687    24603018 :                 newdb = xfs_dir2_dataptr_to_db(args->geo,
     688           0 :                                                be32_to_cpu(lep->address));
     689             :                 /*
     690             :                  * For addname, we're looking for a place to put the new entry.
     691             :                  * We want to use a data block with an entry of equal
     692             :                  * hash value to ours if there is one with room.
     693             :                  *
     694             :                  * If this block isn't the data block we already have
     695             :                  * in hand, take a look at it.
     696             :                  */
     697    24603104 :                 if (newdb != curdb) {
     698     1653349 :                         struct xfs_dir3_icfree_hdr freehdr;
     699             : 
     700     1653349 :                         curdb = newdb;
     701             :                         /*
     702             :                          * Convert the data block to the free block
     703             :                          * holding its freespace information.
     704             :                          */
     705     1653349 :                         newfdb = xfs_dir2_db_to_fdb(args->geo, newdb);
     706             :                         /*
     707             :                          * If it's not the one we have in hand, read it in.
     708             :                          */
     709     1653349 :                         if (newfdb != curfdb) {
     710             :                                 /*
     711             :                                  * If we had one before, drop it.
     712             :                                  */
     713      254511 :                                 if (curbp)
     714           0 :                                         xfs_trans_brelse(tp, curbp);
     715             : 
     716      254511 :                                 error = xfs_dir2_free_read(tp, dp,
     717             :                                                 xfs_dir2_db_to_da(args->geo,
     718             :                                                                   newfdb),
     719             :                                                 &curbp);
     720      254511 :                                 if (error)
     721           0 :                                         return error;
     722      254511 :                                 free = curbp->b_addr;
     723             : 
     724      254511 :                                 xfs_dir2_free_hdr_check(dp, curbp, curdb);
     725             :                         }
     726             :                         /*
     727             :                          * Get the index for our entry.
     728             :                          */
     729     1653349 :                         fi = xfs_dir2_db_to_fdindex(args->geo, curdb);
     730             :                         /*
     731             :                          * If it has room, return it.
     732             :                          */
     733     1653349 :                         xfs_dir2_free_hdr_from_disk(mp, &freehdr, free);
     734     1653349 :                         if (XFS_IS_CORRUPT(mp,
     735             :                                            freehdr.bests[fi] ==
     736             :                                            cpu_to_be16(NULLDATAOFF))) {
     737           0 :                                 if (curfdb != newfdb)
     738           0 :                                         xfs_trans_brelse(tp, curbp);
     739           0 :                                 return -EFSCORRUPTED;
     740             :                         }
     741     1653349 :                         curfdb = newfdb;
     742     1653349 :                         if (be16_to_cpu(freehdr.bests[fi]) >= length)
     743      180939 :                                 goto out;
     744             :                 }
     745             :         }
     746             :         /* Didn't find any space */
     747             :         fi = -1;
     748    28375566 : out:
     749    28375566 :         ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
     750    28375566 :         if (curbp) {
     751             :                 /* Giving back a free block. */
     752      410665 :                 state->extravalid = 1;
     753      410665 :                 state->extrablk.bp = curbp;
     754      410665 :                 state->extrablk.index = fi;
     755      410665 :                 state->extrablk.blkno = curfdb;
     756             : 
     757             :                 /*
     758             :                  * Important: this magic number is not in the buffer - it's for
     759             :                  * buffer type information and therefore only the free/data type
     760             :                  * matters here, not whether CRCs are enabled or not.
     761             :                  */
     762      410665 :                 state->extrablk.magic = XFS_DIR2_FREE_MAGIC;
     763             :         } else {
     764    27964901 :                 state->extravalid = 0;
     765             :         }
     766             :         /*
     767             :          * Return the index, that will be the insertion point.
     768             :          */
     769    28375566 :         *indexp = index;
     770    28375566 :         return -ENOENT;
     771             : }
     772             : 
     773             : /*
     774             :  * Look up a leaf entry in a node-format leaf block.
     775             :  * The extrablk in state a data block.
     776             :  */
     777             : STATIC int
     778   150668223 : xfs_dir2_leafn_lookup_for_entry(
     779             :         struct xfs_buf          *bp,            /* leaf buffer */
     780             :         xfs_da_args_t           *args,          /* operation arguments */
     781             :         int                     *indexp,        /* out: leaf entry index */
     782             :         xfs_da_state_t          *state)         /* state to fill in */
     783             : {
     784   150668223 :         struct xfs_buf          *curbp = NULL;  /* current data/free buffer */
     785   150668223 :         xfs_dir2_db_t           curdb = -1;     /* current data block number */
     786   150668223 :         xfs_dir2_data_entry_t   *dep;           /* data block entry */
     787   150668223 :         xfs_inode_t             *dp;            /* incore directory inode */
     788   150668223 :         int                     error;          /* error return value */
     789   150668223 :         int                     index;          /* leaf entry index */
     790   150668223 :         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
     791   150668223 :         xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
     792   150668223 :         xfs_mount_t             *mp;            /* filesystem mount point */
     793   150668223 :         xfs_dir2_db_t           newdb;          /* new data block number */
     794   150668223 :         xfs_trans_t             *tp;            /* transaction pointer */
     795   150668223 :         enum xfs_dacmp          cmp;            /* comparison result */
     796   150668223 :         struct xfs_dir3_icleaf_hdr leafhdr;
     797             : 
     798   150668223 :         dp = args->dp;
     799   150668223 :         tp = args->trans;
     800   150668223 :         mp = dp->i_mount;
     801   150668223 :         leaf = bp->b_addr;
     802   150668223 :         xfs_dir2_leaf_hdr_from_disk(mp, &leafhdr, leaf);
     803             : 
     804   150666431 :         xfs_dir3_leaf_check(dp, bp);
     805   150673618 :         if (leafhdr.count <= 0) {
     806           0 :                 xfs_buf_mark_corrupt(bp);
     807           0 :                 return -EFSCORRUPTED;
     808             :         }
     809             : 
     810             :         /*
     811             :          * Look up the hash value in the leaf entries.
     812             :          */
     813   150673618 :         index = xfs_dir2_leaf_search_hash(args, bp);
     814             :         /*
     815             :          * Do we have a buffer coming in?
     816             :          */
     817   150672894 :         if (state->extravalid) {
     818      808609 :                 curbp = state->extrablk.bp;
     819      808609 :                 curdb = state->extrablk.blkno;
     820             :         }
     821             :         /*
     822             :          * Loop over leaf entries with the right hash value.
     823             :          */
     824   150672894 :         for (lep = &leafhdr.ents[index];
     825  1129213196 :              index < leafhdr.count && be32_to_cpu(lep->hashval) == args->hashval;
     826   414749949 :              lep++, index++) {
     827             :                 /*
     828             :                  * Skip stale leaf entries.
     829             :                  */
     830   556902424 :                 if (be32_to_cpu(lep->address) == XFS_DIR2_NULL_DATAPTR)
     831    77129015 :                         continue;
     832             :                 /*
     833             :                  * Pull the data block number from the entry.
     834             :                  */
     835   479773409 :                 newdb = xfs_dir2_dataptr_to_db(args->geo,
     836           0 :                                                be32_to_cpu(lep->address));
     837             :                 /*
     838             :                  * Not adding a new entry, so we really want to find
     839             :                  * the name given to us.
     840             :                  *
     841             :                  * If it's a different data block, go get it.
     842             :                  */
     843   479778038 :                 if (newdb != curdb) {
     844             :                         /*
     845             :                          * If we had a block before that we aren't saving
     846             :                          * for a CI name, drop it
     847             :                          */
     848   149659775 :                         if (curbp && (args->cmpresult == XFS_CMP_DIFFERENT ||
     849      709770 :                                                 curdb != state->extrablk.blkno))
     850     6991259 :                                 xfs_trans_brelse(tp, curbp);
     851             :                         /*
     852             :                          * If needing the block that is saved with a CI match,
     853             :                          * use it otherwise read in the new data block.
     854             :                          */
     855   149658850 :                         if (args->cmpresult != XFS_CMP_DIFFERENT &&
     856      709770 :                                         newdb == state->extrablk.blkno) {
     857        1199 :                                 ASSERT(state->extravalid);
     858        1199 :                                 curbp = state->extrablk.bp;
     859             :                         } else {
     860   149657651 :                                 error = xfs_dir3_data_read(tp, dp,
     861             :                                                 xfs_dir2_db_to_da(args->geo,
     862             :                                                                   newdb),
     863             :                                                 0, &curbp);
     864   149649058 :                                 if (error)
     865        2215 :                                         return error;
     866             :                         }
     867   149648042 :                         xfs_dir3_data_check(dp, curbp);
     868   149648042 :                         curdb = newdb;
     869             :                 }
     870             :                 /*
     871             :                  * Point to the data entry.
     872             :                  */
     873   959538002 :                 dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr +
     874   959538002 :                         xfs_dir2_dataptr_to_off(args->geo,
     875   479769001 :                                                 be32_to_cpu(lep->address)));
     876             :                 /*
     877             :                  * Compare the entry and if it's an exact match, return
     878             :                  * EEXIST immediately. If it's the first case-insensitive
     879             :                  * match, store the block & inode number and continue looking.
     880             :                  */
     881   479769001 :                 cmp = xfs_dir2_compname(args, dep->name, dep->namelen);
     882   479765009 :                 if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) {
     883             :                         /* If there is a CI match block, drop it */
     884   142205103 :                         if (args->cmpresult != XFS_CMP_DIFFERENT &&
     885           0 :                                                 curdb != state->extrablk.blkno)
     886           0 :                                 xfs_trans_brelse(tp, state->extrablk.bp);
     887   142205103 :                         args->cmpresult = cmp;
     888   142205103 :                         args->inumber = be64_to_cpu(dep->inumber);
     889   142205103 :                         args->filetype = xfs_dir2_data_get_ftype(mp, dep);
     890   142207832 :                         *indexp = index;
     891   142207832 :                         state->extravalid = 1;
     892   142207832 :                         state->extrablk.bp = curbp;
     893   142207832 :                         state->extrablk.blkno = curdb;
     894   142207832 :                         state->extrablk.index = (int)((char *)dep -
     895   142207832 :                                                         (char *)curbp->b_addr);
     896   142207832 :                         state->extrablk.magic = XFS_DIR2_DATA_MAGIC;
     897   142207832 :                         curbp->b_ops = &xfs_dir3_data_buf_ops;
     898   142207832 :                         xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF);
     899   142209165 :                         if (cmp == XFS_CMP_EXACT)
     900             :                                 return -EEXIST;
     901             :                 }
     902             :         }
     903     8517073 :         ASSERT(index == leafhdr.count || (args->op_flags & XFS_DA_OP_OKNOENT));
     904     8517073 :         if (curbp) {
     905     1158972 :                 if (args->cmpresult == XFS_CMP_DIFFERENT) {
     906             :                         /* Giving back last used data block. */
     907      980933 :                         state->extravalid = 1;
     908      980933 :                         state->extrablk.bp = curbp;
     909      980933 :                         state->extrablk.index = -1;
     910      980933 :                         state->extrablk.blkno = curdb;
     911      980933 :                         state->extrablk.magic = XFS_DIR2_DATA_MAGIC;
     912      980933 :                         curbp->b_ops = &xfs_dir3_data_buf_ops;
     913      980933 :                         xfs_trans_buf_set_type(tp, curbp, XFS_BLFT_DIR_DATA_BUF);
     914             :                 } else {
     915             :                         /* If the curbp is not the CI match block, drop it */
     916      178039 :                         if (state->extrablk.bp != curbp)
     917      161004 :                                 xfs_trans_brelse(tp, curbp);
     918             :                 }
     919             :         } else {
     920     7358101 :                 state->extravalid = 0;
     921             :         }
     922     8517073 :         *indexp = index;
     923     8517073 :         return -ENOENT;
     924             : }
     925             : 
     926             : /*
     927             :  * Look up a leaf entry in a node-format leaf block.
     928             :  * If this is an addname then the extrablk in state is a freespace block,
     929             :  * otherwise it's a data block.
     930             :  */
     931             : int
     932   179049863 : xfs_dir2_leafn_lookup_int(
     933             :         struct xfs_buf          *bp,            /* leaf buffer */
     934             :         xfs_da_args_t           *args,          /* operation arguments */
     935             :         int                     *indexp,        /* out: leaf entry index */
     936             :         xfs_da_state_t          *state)         /* state to fill in */
     937             : {
     938   179049863 :         if (args->op_flags & XFS_DA_OP_ADDNAME)
     939    28375998 :                 return xfs_dir2_leafn_lookup_for_addname(bp, args, indexp,
     940             :                                                         state);
     941   150673865 :         return xfs_dir2_leafn_lookup_for_entry(bp, args, indexp, state);
     942             : }
     943             : 
     944             : /*
     945             :  * Move count leaf entries from source to destination leaf.
     946             :  * Log entries and headers.  Stale entries are preserved.
     947             :  */
     948             : static void
     949       43517 : xfs_dir3_leafn_moveents(
     950             :         xfs_da_args_t                   *args,  /* operation arguments */
     951             :         struct xfs_buf                  *bp_s,  /* source */
     952             :         struct xfs_dir3_icleaf_hdr      *shdr,
     953             :         struct xfs_dir2_leaf_entry      *sents,
     954             :         int                             start_s,/* source leaf index */
     955             :         struct xfs_buf                  *bp_d,  /* destination */
     956             :         struct xfs_dir3_icleaf_hdr      *dhdr,
     957             :         struct xfs_dir2_leaf_entry      *dents,
     958             :         int                             start_d,/* destination leaf index */
     959             :         int                             count)  /* count of leaves to copy */
     960             : {
     961       43517 :         int                             stale;  /* count stale leaves copied */
     962             : 
     963       43517 :         trace_xfs_dir2_leafn_moveents(args, start_s, start_d, count);
     964             : 
     965             :         /*
     966             :          * Silently return if nothing to do.
     967             :          */
     968       43517 :         if (count == 0)
     969             :                 return;
     970             : 
     971             :         /*
     972             :          * If the destination index is not the end of the current
     973             :          * destination leaf entries, open up a hole in the destination
     974             :          * to hold the new entries.
     975             :          */
     976       43517 :         if (start_d < dhdr->count) {
     977        6050 :                 memmove(&dents[start_d + count], &dents[start_d],
     978             :                         (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t));
     979        3025 :                 xfs_dir3_leaf_log_ents(args, dhdr, bp_d, start_d + count,
     980        3025 :                                        count + dhdr->count - 1);
     981             :         }
     982             :         /*
     983             :          * If the source has stale leaves, count the ones in the copy range
     984             :          * so we can update the header correctly.
     985             :          */
     986       43517 :         if (shdr->stale) {
     987             :                 int     i;                      /* temp leaf index */
     988             : 
     989           0 :                 for (i = start_s, stale = 0; i < start_s + count; i++) {
     990           0 :                         if (sents[i].address ==
     991             :                                         cpu_to_be32(XFS_DIR2_NULL_DATAPTR))
     992           0 :                                 stale++;
     993             :                 }
     994             :         } else
     995             :                 stale = 0;
     996             :         /*
     997             :          * Copy the leaf entries from source to destination.
     998             :          */
     999       87034 :         memcpy(&dents[start_d], &sents[start_s],
    1000             :                 count * sizeof(xfs_dir2_leaf_entry_t));
    1001       43517 :         xfs_dir3_leaf_log_ents(args, dhdr, bp_d, start_d, start_d + count - 1);
    1002             : 
    1003             :         /*
    1004             :          * If there are source entries after the ones we copied,
    1005             :          * delete the ones we copied by sliding the next ones down.
    1006             :          */
    1007       43517 :         if (start_s + count < shdr->count) {
    1008           0 :                 memmove(&sents[start_s], &sents[start_s + count],
    1009             :                         count * sizeof(xfs_dir2_leaf_entry_t));
    1010           0 :                 xfs_dir3_leaf_log_ents(args, shdr, bp_s, start_s,
    1011             :                                        start_s + count - 1);
    1012             :         }
    1013             : 
    1014             :         /*
    1015             :          * Update the headers and log them.
    1016             :          */
    1017       43517 :         shdr->count -= count;
    1018       43517 :         shdr->stale -= stale;
    1019       43517 :         dhdr->count += count;
    1020       43517 :         dhdr->stale += stale;
    1021             : }
    1022             : 
    1023             : /*
    1024             :  * Determine the sort order of two leaf blocks.
    1025             :  * Returns 1 if both are valid and leaf2 should be before leaf1, else 0.
    1026             :  */
    1027             : int                                             /* sort order */
    1028       67916 : xfs_dir2_leafn_order(
    1029             :         struct xfs_inode        *dp,
    1030             :         struct xfs_buf          *leaf1_bp,              /* leaf1 buffer */
    1031             :         struct xfs_buf          *leaf2_bp)              /* leaf2 buffer */
    1032             : {
    1033       67916 :         struct xfs_dir2_leaf    *leaf1 = leaf1_bp->b_addr;
    1034       67916 :         struct xfs_dir2_leaf    *leaf2 = leaf2_bp->b_addr;
    1035       67916 :         struct xfs_dir2_leaf_entry *ents1;
    1036       67916 :         struct xfs_dir2_leaf_entry *ents2;
    1037       67916 :         struct xfs_dir3_icleaf_hdr hdr1;
    1038       67916 :         struct xfs_dir3_icleaf_hdr hdr2;
    1039             : 
    1040       67916 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr1, leaf1);
    1041       67916 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf2);
    1042       67916 :         ents1 = hdr1.ents;
    1043       67916 :         ents2 = hdr2.ents;
    1044             : 
    1045      111432 :         if (hdr1.count > 0 && hdr2.count > 0 &&
    1046      127523 :             (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) ||
    1047       40491 :              be32_to_cpu(ents2[hdr2.count - 1].hashval) <
    1048       40491 :                                 be32_to_cpu(ents1[hdr1.count - 1].hashval)))
    1049        3025 :                 return 1;
    1050             :         return 0;
    1051             : }
    1052             : 
    1053             : /*
    1054             :  * Rebalance leaf entries between two leaf blocks.
    1055             :  * This is actually only called when the second block is new,
    1056             :  * though the code deals with the general case.
    1057             :  * A new entry will be inserted in one of the blocks, and that
    1058             :  * entry is taken into account when balancing.
    1059             :  */
    1060             : static void
    1061       24399 : xfs_dir2_leafn_rebalance(
    1062             :         xfs_da_state_t          *state,         /* btree cursor */
    1063             :         xfs_da_state_blk_t      *blk1,          /* first btree block */
    1064             :         xfs_da_state_blk_t      *blk2)          /* second btree block */
    1065             : {
    1066       24399 :         xfs_da_args_t           *args;          /* operation arguments */
    1067       24399 :         int                     count;          /* count (& direction) leaves */
    1068       24399 :         int                     isleft;         /* new goes in left leaf */
    1069       24399 :         xfs_dir2_leaf_t         *leaf1;         /* first leaf structure */
    1070       24399 :         xfs_dir2_leaf_t         *leaf2;         /* second leaf structure */
    1071       24399 :         int                     mid;            /* midpoint leaf index */
    1072             : #if defined(DEBUG) || defined(XFS_WARN)
    1073       24399 :         int                     oldstale;       /* old count of stale leaves */
    1074             : #endif
    1075       24399 :         int                     oldsum;         /* old total leaf count */
    1076       24399 :         int                     swap_blocks;    /* swapped leaf blocks */
    1077       24399 :         struct xfs_dir2_leaf_entry *ents1;
    1078       24399 :         struct xfs_dir2_leaf_entry *ents2;
    1079       24399 :         struct xfs_dir3_icleaf_hdr hdr1;
    1080       24399 :         struct xfs_dir3_icleaf_hdr hdr2;
    1081       24399 :         struct xfs_inode        *dp = state->args->dp;
    1082             : 
    1083       24399 :         args = state->args;
    1084             :         /*
    1085             :          * If the block order is wrong, swap the arguments.
    1086             :          */
    1087       24399 :         swap_blocks = xfs_dir2_leafn_order(dp, blk1->bp, blk2->bp);
    1088       24399 :         if (swap_blocks)
    1089           0 :                 swap(blk1, blk2);
    1090             : 
    1091       24399 :         leaf1 = blk1->bp->b_addr;
    1092       24399 :         leaf2 = blk2->bp->b_addr;
    1093       24399 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr1, leaf1);
    1094       24399 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf2);
    1095       24399 :         ents1 = hdr1.ents;
    1096       24399 :         ents2 = hdr2.ents;
    1097             : 
    1098       24399 :         oldsum = hdr1.count + hdr2.count;
    1099             : #if defined(DEBUG) || defined(XFS_WARN)
    1100       24399 :         oldstale = hdr1.stale + hdr2.stale;
    1101             : #endif
    1102       24399 :         mid = oldsum >> 1;
    1103             : 
    1104             :         /*
    1105             :          * If the old leaf count was odd then the new one will be even,
    1106             :          * so we need to divide the new count evenly.
    1107             :          */
    1108       24399 :         if (oldsum & 1) {
    1109           0 :                 xfs_dahash_t    midhash;        /* middle entry hash value */
    1110             : 
    1111           0 :                 if (mid >= hdr1.count)
    1112           0 :                         midhash = be32_to_cpu(ents2[mid - hdr1.count].hashval);
    1113             :                 else
    1114           0 :                         midhash = be32_to_cpu(ents1[mid].hashval);
    1115           0 :                 isleft = args->hashval <= midhash;
    1116             :         }
    1117             :         /*
    1118             :          * If the old count is even then the new count is odd, so there's
    1119             :          * no preferred side for the new entry.
    1120             :          * Pick the left one.
    1121             :          */
    1122             :         else
    1123             :                 isleft = 1;
    1124             :         /*
    1125             :          * Calculate moved entry count.  Positive means left-to-right,
    1126             :          * negative means right-to-left.  Then move the entries.
    1127             :          */
    1128       24399 :         count = hdr1.count - mid + (isleft == 0);
    1129       24399 :         if (count > 0)
    1130       24399 :                 xfs_dir3_leafn_moveents(args, blk1->bp, &hdr1, ents1,
    1131             :                                         hdr1.count - count, blk2->bp,
    1132             :                                         &hdr2, ents2, 0, count);
    1133           0 :         else if (count < 0)
    1134           0 :                 xfs_dir3_leafn_moveents(args, blk2->bp, &hdr2, ents2, 0,
    1135             :                                         blk1->bp, &hdr1, ents1,
    1136             :                                         hdr1.count, count);
    1137             : 
    1138       24399 :         ASSERT(hdr1.count + hdr2.count == oldsum);
    1139       24399 :         ASSERT(hdr1.stale + hdr2.stale == oldstale);
    1140             : 
    1141             :         /* log the changes made when moving the entries */
    1142       24399 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf1, &hdr1);
    1143       24399 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf2, &hdr2);
    1144       24399 :         xfs_dir3_leaf_log_header(args, blk1->bp);
    1145       24399 :         xfs_dir3_leaf_log_header(args, blk2->bp);
    1146             : 
    1147       24399 :         xfs_dir3_leaf_check(dp, blk1->bp);
    1148       24399 :         xfs_dir3_leaf_check(dp, blk2->bp);
    1149             : 
    1150             :         /*
    1151             :          * Mark whether we're inserting into the old or new leaf.
    1152             :          */
    1153       24399 :         if (hdr1.count < hdr2.count)
    1154           0 :                 state->inleaf = swap_blocks;
    1155       24399 :         else if (hdr1.count > hdr2.count)
    1156           0 :                 state->inleaf = !swap_blocks;
    1157             :         else
    1158       24399 :                 state->inleaf = swap_blocks ^ (blk1->index <= hdr1.count);
    1159             :         /*
    1160             :          * Adjust the expected index for insertion.
    1161             :          */
    1162       24399 :         if (!state->inleaf)
    1163       18829 :                 blk2->index = blk1->index - hdr1.count;
    1164             : 
    1165             :         /*
    1166             :          * Finally sanity check just to make sure we are not returning a
    1167             :          * negative index
    1168             :          */
    1169       24399 :         if (blk2->index < 0) {
    1170           0 :                 state->inleaf = 1;
    1171           0 :                 blk2->index = 0;
    1172           0 :                 xfs_alert(dp->i_mount,
    1173             :         "%s: picked the wrong leaf? reverting original leaf: blk1->index %d",
    1174             :                         __func__, blk1->index);
    1175             :         }
    1176       24399 : }
    1177             : 
    1178             : static int
    1179    11343939 : xfs_dir3_data_block_free(
    1180             :         xfs_da_args_t           *args,
    1181             :         struct xfs_dir2_data_hdr *hdr,
    1182             :         struct xfs_dir2_free    *free,
    1183             :         xfs_dir2_db_t           fdb,
    1184             :         int                     findex,
    1185             :         struct xfs_buf          *fbp,
    1186             :         int                     longest)
    1187             : {
    1188    11343939 :         int                     logfree = 0;
    1189    11343939 :         struct xfs_dir3_icfree_hdr freehdr;
    1190    11343939 :         struct xfs_inode        *dp = args->dp;
    1191             : 
    1192    11343939 :         xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
    1193    11343980 :         if (hdr) {
    1194             :                 /*
    1195             :                  * Data block is not empty, just set the free entry to the new
    1196             :                  * value.
    1197             :                  */
    1198    11329084 :                 freehdr.bests[findex] = cpu_to_be16(longest);
    1199    11329084 :                 xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
    1200    11329084 :                 return 0;
    1201             :         }
    1202             : 
    1203             :         /* One less used entry in the free table. */
    1204       14896 :         freehdr.nused--;
    1205             : 
    1206             :         /*
    1207             :          * If this was the last entry in the table, we can trim the table size
    1208             :          * back.  There might be other entries at the end referring to
    1209             :          * non-existent data blocks, get those too.
    1210             :          */
    1211       14896 :         if (findex == freehdr.nvalid - 1) {
    1212         491 :                 int     i;              /* free entry index */
    1213             : 
    1214        8703 :                 for (i = findex - 1; i >= 0; i--) {
    1215        8701 :                         if (freehdr.bests[i] != cpu_to_be16(NULLDATAOFF))
    1216             :                                 break;
    1217             :                 }
    1218         491 :                 freehdr.nvalid = i + 1;
    1219         491 :                 logfree = 0;
    1220             :         } else {
    1221             :                 /* Not the last entry, just punch it out.  */
    1222       14405 :                 freehdr.bests[findex] = cpu_to_be16(NULLDATAOFF);
    1223       14405 :                 logfree = 1;
    1224             :         }
    1225             : 
    1226       14896 :         xfs_dir2_free_hdr_to_disk(dp->i_mount, free, &freehdr);
    1227       14896 :         xfs_dir2_free_log_header(args, fbp);
    1228             : 
    1229             :         /*
    1230             :          * If there are no useful entries left in the block, get rid of the
    1231             :          * block if we can.
    1232             :          */
    1233       14896 :         if (!freehdr.nused) {
    1234           2 :                 int error;
    1235             : 
    1236           2 :                 error = xfs_dir2_shrink_inode(args, fdb, fbp);
    1237           2 :                 if (error == 0) {
    1238             :                         fbp = NULL;
    1239             :                         logfree = 0;
    1240           0 :                 } else if (error != -ENOSPC || args->total != 0)
    1241             :                         return error;
    1242             :                 /*
    1243             :                  * It's possible to get ENOSPC if there is no
    1244             :                  * space reservation.  In this case some one
    1245             :                  * else will eventually get rid of this block.
    1246             :                  */
    1247             :         }
    1248             : 
    1249             :         /* Log the free entry that changed, unless we got rid of it.  */
    1250       14894 :         if (logfree)
    1251       14405 :                 xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
    1252             :         return 0;
    1253             : }
    1254             : 
    1255             : /*
    1256             :  * Remove an entry from a node directory.
    1257             :  * This removes the leaf entry and the data entry,
    1258             :  * and updates the free block if necessary.
    1259             :  */
    1260             : static int                                      /* error */
    1261    26758565 : xfs_dir2_leafn_remove(
    1262             :         xfs_da_args_t           *args,          /* operation arguments */
    1263             :         struct xfs_buf          *bp,            /* leaf buffer */
    1264             :         int                     index,          /* leaf entry index */
    1265             :         xfs_da_state_blk_t      *dblk,          /* data block */
    1266             :         int                     *rval)          /* resulting block needs join */
    1267             : {
    1268    26758565 :         struct xfs_da_geometry  *geo = args->geo;
    1269    26758565 :         xfs_dir2_data_hdr_t     *hdr;           /* data block header */
    1270    26758565 :         xfs_dir2_db_t           db;             /* data block number */
    1271    26758565 :         struct xfs_buf          *dbp;           /* data block buffer */
    1272    26758565 :         xfs_dir2_data_entry_t   *dep;           /* data block entry */
    1273    26758565 :         xfs_inode_t             *dp;            /* incore directory inode */
    1274    26758565 :         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
    1275    26758565 :         xfs_dir2_leaf_entry_t   *lep;           /* leaf entry */
    1276    26758565 :         int                     longest;        /* longest data free entry */
    1277    26758565 :         int                     off;            /* data block entry offset */
    1278    26758565 :         int                     needlog;        /* need to log data header */
    1279    26758565 :         int                     needscan;       /* need to rescan data frees */
    1280    26758565 :         xfs_trans_t             *tp;            /* transaction pointer */
    1281    26758565 :         struct xfs_dir2_data_free *bf;          /* bestfree table */
    1282    26758565 :         struct xfs_dir3_icleaf_hdr leafhdr;
    1283             : 
    1284    26758565 :         trace_xfs_dir2_leafn_remove(args, index);
    1285             : 
    1286    26758743 :         dp = args->dp;
    1287    26758743 :         tp = args->trans;
    1288    26758743 :         leaf = bp->b_addr;
    1289    26758743 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
    1290             : 
    1291             :         /*
    1292             :          * Point to the entry we're removing.
    1293             :          */
    1294    26758703 :         lep = &leafhdr.ents[index];
    1295             : 
    1296             :         /*
    1297             :          * Extract the data block and offset from the entry.
    1298             :          */
    1299    26758703 :         db = xfs_dir2_dataptr_to_db(geo, be32_to_cpu(lep->address));
    1300    26758477 :         ASSERT(dblk->blkno == db);
    1301    26758477 :         off = xfs_dir2_dataptr_to_off(geo, be32_to_cpu(lep->address));
    1302    26758477 :         ASSERT(dblk->index == off);
    1303             : 
    1304             :         /*
    1305             :          * Kill the leaf entry by marking it stale.
    1306             :          * Log the leaf block changes.
    1307             :          */
    1308    26758477 :         leafhdr.stale++;
    1309    26758477 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, leaf, &leafhdr);
    1310    26758774 :         xfs_dir3_leaf_log_header(args, bp);
    1311             : 
    1312    26758719 :         lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR);
    1313    26758719 :         xfs_dir3_leaf_log_ents(args, &leafhdr, bp, index, index);
    1314             : 
    1315             :         /*
    1316             :          * Make the data entry free.  Keep track of the longest freespace
    1317             :          * in the data block in case it changes.
    1318             :          */
    1319    26758903 :         dbp = dblk->bp;
    1320    26758903 :         hdr = dbp->b_addr;
    1321    26758903 :         dep = (xfs_dir2_data_entry_t *)((char *)hdr + off);
    1322    26758903 :         bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
    1323    26758877 :         longest = be16_to_cpu(bf[0].length);
    1324    26758877 :         needlog = needscan = 0;
    1325    26758877 :         xfs_dir2_data_make_free(args, dbp, off,
    1326    26758877 :                 xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
    1327             :                 &needscan);
    1328             :         /*
    1329             :          * Rescan the data block freespaces for bestfree.
    1330             :          * Log the data block header if needed.
    1331             :          */
    1332    26758529 :         if (needscan)
    1333     2594361 :                 xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
    1334    26758533 :         if (needlog)
    1335    16967494 :                 xfs_dir2_data_log_header(args, dbp);
    1336    26758320 :         xfs_dir3_data_check(dp, dbp);
    1337             :         /*
    1338             :          * If the longest data block freespace changes, need to update
    1339             :          * the corresponding freeblock entry.
    1340             :          */
    1341    26758879 :         if (longest < be16_to_cpu(bf[0].length)) {
    1342    11343517 :                 int             error;          /* error return value */
    1343    11343517 :                 struct xfs_buf  *fbp;           /* freeblock buffer */
    1344    11343517 :                 xfs_dir2_db_t   fdb;            /* freeblock block number */
    1345    11343517 :                 int             findex;         /* index in freeblock entries */
    1346    11343517 :                 xfs_dir2_free_t *free;          /* freeblock structure */
    1347             : 
    1348             :                 /*
    1349             :                  * Convert the data block number to a free block,
    1350             :                  * read in the free block.
    1351             :                  */
    1352    11343517 :                 fdb = xfs_dir2_db_to_fdb(geo, db);
    1353    11343853 :                 error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(geo, fdb),
    1354             :                                            &fbp);
    1355    11343957 :                 if (error)
    1356           2 :                         return error;
    1357    11343955 :                 free = fbp->b_addr;
    1358             : #ifdef DEBUG
    1359             :         {
    1360    11343955 :                 struct xfs_dir3_icfree_hdr freehdr;
    1361             : 
    1362    11343955 :                 xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
    1363    11343930 :                 ASSERT(freehdr.firstdb == geo->free_max_bests *
    1364             :                         (fdb - xfs_dir2_byte_to_db(geo, XFS_DIR2_FREE_OFFSET)));
    1365             :         }
    1366             : #endif
    1367             :                 /*
    1368             :                  * Calculate which entry we need to fix.
    1369             :                  */
    1370    11343981 :                 findex = xfs_dir2_db_to_fdindex(geo, db);
    1371    11343891 :                 longest = be16_to_cpu(bf[0].length);
    1372             :                 /*
    1373             :                  * If the data block is now empty we can get rid of it
    1374             :                  * (usually).
    1375             :                  */
    1376    11343891 :                 if (longest == geo->blksize - geo->data_entry_offset) {
    1377             :                         /*
    1378             :                          * Try to punch out the data block.
    1379             :                          */
    1380       14896 :                         error = xfs_dir2_shrink_inode(args, db, dbp);
    1381       14896 :                         if (error == 0) {
    1382       14896 :                                 dblk->bp = NULL;
    1383       14896 :                                 hdr = NULL;
    1384             :                         }
    1385             :                         /*
    1386             :                          * We can get ENOSPC if there's no space reservation.
    1387             :                          * In this case just drop the buffer and some one else
    1388             :                          * will eventually get rid of the empty block.
    1389             :                          */
    1390           0 :                         else if (!(error == -ENOSPC && args->total == 0))
    1391             :                                 return error;
    1392             :                 }
    1393             :                 /*
    1394             :                  * If we got rid of the data block, we can eliminate that entry
    1395             :                  * in the free block.
    1396             :                  */
    1397    11343891 :                 error = xfs_dir3_data_block_free(args, hdr, free,
    1398             :                                                  fdb, findex, fbp, longest);
    1399    11343953 :                 if (error)
    1400             :                         return error;
    1401             :         }
    1402             : 
    1403    26759315 :         xfs_dir3_leaf_check(dp, bp);
    1404             :         /*
    1405             :          * Return indication of whether this leaf block is empty enough
    1406             :          * to justify trying to join it with a neighbor.
    1407             :          */
    1408    26757883 :         *rval = (geo->leaf_hdr_size +
    1409    26757883 :                  (uint)sizeof(leafhdr.ents) * (leafhdr.count - leafhdr.stale)) <
    1410    26757883 :                 geo->magicpct;
    1411    26757883 :         return 0;
    1412             : }
    1413             : 
    1414             : /*
    1415             :  * Split the leaf entries in the old block into old and new blocks.
    1416             :  */
    1417             : int                                             /* error */
    1418       24399 : xfs_dir2_leafn_split(
    1419             :         xfs_da_state_t          *state,         /* btree cursor */
    1420             :         xfs_da_state_blk_t      *oldblk,        /* original block */
    1421             :         xfs_da_state_blk_t      *newblk)        /* newly created block */
    1422             : {
    1423       24399 :         xfs_da_args_t           *args;          /* operation arguments */
    1424       24399 :         xfs_dablk_t             blkno;          /* new leaf block number */
    1425       24399 :         int                     error;          /* error return value */
    1426       24399 :         struct xfs_inode        *dp;
    1427             : 
    1428             :         /*
    1429             :          * Allocate space for a new leaf node.
    1430             :          */
    1431       24399 :         args = state->args;
    1432       24399 :         dp = args->dp;
    1433       24399 :         ASSERT(oldblk->magic == XFS_DIR2_LEAFN_MAGIC);
    1434       24399 :         error = xfs_da_grow_inode(args, &blkno);
    1435       24399 :         if (error) {
    1436             :                 return error;
    1437             :         }
    1438             :         /*
    1439             :          * Initialize the new leaf block.
    1440             :          */
    1441       24399 :         error = xfs_dir3_leaf_get_buf(args, xfs_dir2_da_to_db(args->geo, blkno),
    1442             :                                       &newblk->bp, XFS_DIR2_LEAFN_MAGIC);
    1443       24399 :         if (error)
    1444             :                 return error;
    1445             : 
    1446       24399 :         newblk->blkno = blkno;
    1447       24399 :         newblk->magic = XFS_DIR2_LEAFN_MAGIC;
    1448             :         /*
    1449             :          * Rebalance the entries across the two leaves, link the new
    1450             :          * block into the leaves.
    1451             :          */
    1452       24399 :         xfs_dir2_leafn_rebalance(state, oldblk, newblk);
    1453       24399 :         error = xfs_da3_blk_link(state, oldblk, newblk);
    1454       24399 :         if (error) {
    1455             :                 return error;
    1456             :         }
    1457             :         /*
    1458             :          * Insert the new entry in the correct block.
    1459             :          */
    1460       24399 :         if (state->inleaf)
    1461        5570 :                 error = xfs_dir2_leafn_add(oldblk->bp, args, oldblk->index);
    1462             :         else
    1463       18829 :                 error = xfs_dir2_leafn_add(newblk->bp, args, newblk->index);
    1464             :         /*
    1465             :          * Update last hashval in each block since we added the name.
    1466             :          */
    1467       24399 :         oldblk->hashval = xfs_dir2_leaf_lasthash(dp, oldblk->bp, NULL);
    1468       24399 :         newblk->hashval = xfs_dir2_leaf_lasthash(dp, newblk->bp, NULL);
    1469       24399 :         xfs_dir3_leaf_check(dp, oldblk->bp);
    1470       24399 :         xfs_dir3_leaf_check(dp, newblk->bp);
    1471       24399 :         return error;
    1472             : }
    1473             : 
    1474             : /*
    1475             :  * Check a leaf block and its neighbors to see if the block should be
    1476             :  * collapsed into one or the other neighbor.  Always keep the block
    1477             :  * with the smaller block number.
    1478             :  * If the current block is over 50% full, don't try to join it, return 0.
    1479             :  * If the block is empty, fill in the state structure and return 2.
    1480             :  * If it can be collapsed, fill in the state structure and return 1.
    1481             :  * If nothing can be done, return 0.
    1482             :  */
    1483             : int                                             /* error */
    1484     1654145 : xfs_dir2_leafn_toosmall(
    1485             :         xfs_da_state_t          *state,         /* btree cursor */
    1486             :         int                     *action)        /* resulting action to take */
    1487             : {
    1488     1654145 :         xfs_da_state_blk_t      *blk;           /* leaf block */
    1489     1654145 :         xfs_dablk_t             blkno;          /* leaf block number */
    1490     1654145 :         struct xfs_buf          *bp;            /* leaf buffer */
    1491     1654145 :         int                     bytes;          /* bytes in use */
    1492     1654145 :         int                     count;          /* leaf live entry count */
    1493     1654145 :         int                     error;          /* error return value */
    1494     1654145 :         int                     forward;        /* sibling block direction */
    1495     1654145 :         int                     i;              /* sibling counter */
    1496     1654145 :         xfs_dir2_leaf_t         *leaf;          /* leaf structure */
    1497     1654145 :         int                     rval;           /* result from path_shift */
    1498     1654145 :         struct xfs_dir3_icleaf_hdr leafhdr;
    1499     1654145 :         struct xfs_dir2_leaf_entry *ents;
    1500     1654145 :         struct xfs_inode        *dp = state->args->dp;
    1501             : 
    1502             :         /*
    1503             :          * Check for the degenerate case of the block being over 50% full.
    1504             :          * If so, it's not worth even looking to see if we might be able
    1505             :          * to coalesce with a sibling.
    1506             :          */
    1507     1654145 :         blk = &state->path.blk[state->path.active - 1];
    1508     1654145 :         leaf = blk->bp->b_addr;
    1509     1654145 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
    1510     1654146 :         ents = leafhdr.ents;
    1511     1654146 :         xfs_dir3_leaf_check(dp, blk->bp);
    1512             : 
    1513     1654147 :         count = leafhdr.count - leafhdr.stale;
    1514     1654147 :         bytes = state->args->geo->leaf_hdr_size + count * sizeof(ents[0]);
    1515     1654147 :         if (bytes > (state->args->geo->blksize >> 1)) {
    1516             :                 /*
    1517             :                  * Blk over 50%, don't try to join.
    1518             :                  */
    1519           0 :                 *action = 0;
    1520           0 :                 return 0;
    1521             :         }
    1522             :         /*
    1523             :          * Check for the degenerate case of the block being empty.
    1524             :          * If the block is empty, we'll simply delete it, no need to
    1525             :          * coalesce it with a sibling block.  We choose (arbitrarily)
    1526             :          * to merge with the forward block unless it is NULL.
    1527             :          */
    1528     1654147 :         if (count == 0) {
    1529             :                 /*
    1530             :                  * Make altpath point to the block we want to keep and
    1531             :                  * path point to the block we want to drop (this one).
    1532             :                  */
    1533           1 :                 forward = (leafhdr.forw != 0);
    1534           2 :                 memcpy(&state->altpath, &state->path, sizeof(state->path));
    1535           1 :                 error = xfs_da3_path_shift(state, &state->altpath, forward, 0,
    1536             :                         &rval);
    1537           1 :                 if (error)
    1538             :                         return error;
    1539           1 :                 *action = rval ? 2 : 0;
    1540           1 :                 return 0;
    1541             :         }
    1542             :         /*
    1543             :          * Examine each sibling block to see if we can coalesce with
    1544             :          * at least 25% free space to spare.  We need to figure out
    1545             :          * whether to merge with the forward or the backward block.
    1546             :          * We prefer coalescing with the lower numbered sibling so as
    1547             :          * to shrink a directory over time.
    1548             :          */
    1549     1654146 :         forward = leafhdr.forw < leafhdr.back;
    1550     4938100 :         for (i = 0, bp = NULL; i < 2; forward = !forward, i++) {
    1551     3303069 :                 struct xfs_dir3_icleaf_hdr hdr2;
    1552             : 
    1553     3303069 :                 blkno = forward ? leafhdr.forw : leafhdr.back;
    1554     3303069 :                 if (blkno == 0)
    1555     1437017 :                         continue;
    1556             :                 /*
    1557             :                  * Read the sibling leaf block.
    1558             :                  */
    1559     1866052 :                 error = xfs_dir3_leafn_read(state->args->trans, dp, blkno, &bp);
    1560     1866055 :                 if (error)
    1561           0 :                         return error;
    1562             : 
    1563             :                 /*
    1564             :                  * Count bytes in the two blocks combined.
    1565             :                  */
    1566     1866055 :                 count = leafhdr.count - leafhdr.stale;
    1567     1866055 :                 bytes = state->args->geo->blksize -
    1568     1866055 :                         (state->args->geo->blksize >> 2);
    1569             : 
    1570     1866055 :                 leaf = bp->b_addr;
    1571     1866055 :                 xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &hdr2, leaf);
    1572     1866055 :                 ents = hdr2.ents;
    1573     1866055 :                 count += hdr2.count - hdr2.stale;
    1574     1866055 :                 bytes -= count * sizeof(ents[0]);
    1575             : 
    1576             :                 /*
    1577             :                  * Fits with at least 25% to spare.
    1578             :                  */
    1579     1866055 :                 if (bytes >= 0)
    1580             :                         break;
    1581     1846937 :                 xfs_trans_brelse(state->args->trans, bp);
    1582             :         }
    1583             :         /*
    1584             :          * Didn't like either block, give up.
    1585             :          */
    1586     1654149 :         if (i >= 2) {
    1587     1635031 :                 *action = 0;
    1588     1635031 :                 return 0;
    1589             :         }
    1590             : 
    1591             :         /*
    1592             :          * Make altpath point to the block we want to keep (the lower
    1593             :          * numbered block) and path point to the block we want to drop.
    1594             :          */
    1595       38236 :         memcpy(&state->altpath, &state->path, sizeof(state->path));
    1596       19118 :         if (blkno < blk->blkno)
    1597        6107 :                 error = xfs_da3_path_shift(state, &state->altpath, forward, 0,
    1598             :                         &rval);
    1599             :         else
    1600       13011 :                 error = xfs_da3_path_shift(state, &state->path, forward, 0,
    1601             :                         &rval);
    1602       19118 :         if (error) {
    1603             :                 return error;
    1604             :         }
    1605       19118 :         *action = rval ? 0 : 1;
    1606       19118 :         return 0;
    1607             : }
    1608             : 
    1609             : /*
    1610             :  * Move all the leaf entries from drop_blk to save_blk.
    1611             :  * This is done as part of a join operation.
    1612             :  */
    1613             : void
    1614       19118 : xfs_dir2_leafn_unbalance(
    1615             :         xfs_da_state_t          *state,         /* cursor */
    1616             :         xfs_da_state_blk_t      *drop_blk,      /* dead block */
    1617             :         xfs_da_state_blk_t      *save_blk)      /* surviving block */
    1618             : {
    1619       19118 :         xfs_da_args_t           *args;          /* operation arguments */
    1620       19118 :         xfs_dir2_leaf_t         *drop_leaf;     /* dead leaf structure */
    1621       19118 :         xfs_dir2_leaf_t         *save_leaf;     /* surviving leaf structure */
    1622       19118 :         struct xfs_dir3_icleaf_hdr savehdr;
    1623       19118 :         struct xfs_dir3_icleaf_hdr drophdr;
    1624       19118 :         struct xfs_dir2_leaf_entry *sents;
    1625       19118 :         struct xfs_dir2_leaf_entry *dents;
    1626       19118 :         struct xfs_inode        *dp = state->args->dp;
    1627             : 
    1628       19118 :         args = state->args;
    1629       19118 :         ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);
    1630       19118 :         ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC);
    1631       19118 :         drop_leaf = drop_blk->bp->b_addr;
    1632       19118 :         save_leaf = save_blk->bp->b_addr;
    1633             : 
    1634       19118 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &savehdr, save_leaf);
    1635       19118 :         xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &drophdr, drop_leaf);
    1636       19118 :         sents = savehdr.ents;
    1637       19118 :         dents = drophdr.ents;
    1638             : 
    1639             :         /*
    1640             :          * If there are any stale leaf entries, take this opportunity
    1641             :          * to purge them.
    1642             :          */
    1643       19118 :         if (drophdr.stale)
    1644       16836 :                 xfs_dir3_leaf_compact(args, &drophdr, drop_blk->bp);
    1645       19118 :         if (savehdr.stale)
    1646       19044 :                 xfs_dir3_leaf_compact(args, &savehdr, save_blk->bp);
    1647             : 
    1648             :         /*
    1649             :          * Move the entries from drop to the appropriate end of save.
    1650             :          */
    1651       19118 :         drop_blk->hashval = be32_to_cpu(dents[drophdr.count - 1].hashval);
    1652       19118 :         if (xfs_dir2_leafn_order(dp, save_blk->bp, drop_blk->bp))
    1653        3025 :                 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0,
    1654             :                                         save_blk->bp, &savehdr, sents, 0,
    1655        3025 :                                         drophdr.count);
    1656             :         else
    1657       16093 :                 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0,
    1658             :                                         save_blk->bp, &savehdr, sents,
    1659       16093 :                                         savehdr.count, drophdr.count);
    1660       19118 :         save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval);
    1661             : 
    1662             :         /* log the changes made when moving the entries */
    1663       19118 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, save_leaf, &savehdr);
    1664       19118 :         xfs_dir2_leaf_hdr_to_disk(dp->i_mount, drop_leaf, &drophdr);
    1665       19118 :         xfs_dir3_leaf_log_header(args, save_blk->bp);
    1666       19118 :         xfs_dir3_leaf_log_header(args, drop_blk->bp);
    1667             : 
    1668       19118 :         xfs_dir3_leaf_check(dp, save_blk->bp);
    1669       19118 :         xfs_dir3_leaf_check(dp, drop_blk->bp);
    1670       19118 : }
    1671             : 
    1672             : /*
    1673             :  * Add a new data block to the directory at the free space index that the caller
    1674             :  * has specified.
    1675             :  */
    1676             : static int
    1677       30142 : xfs_dir2_node_add_datablk(
    1678             :         struct xfs_da_args      *args,
    1679             :         struct xfs_da_state_blk *fblk,
    1680             :         xfs_dir2_db_t           *dbno,
    1681             :         struct xfs_buf          **dbpp,
    1682             :         struct xfs_buf          **fbpp,
    1683             :         struct xfs_dir3_icfree_hdr *hdr,
    1684             :         int                     *findex)
    1685             : {
    1686       30142 :         struct xfs_inode        *dp = args->dp;
    1687       30142 :         struct xfs_trans        *tp = args->trans;
    1688       30142 :         struct xfs_mount        *mp = dp->i_mount;
    1689       30142 :         struct xfs_dir2_data_free *bf;
    1690       30142 :         xfs_dir2_db_t           fbno;
    1691       30142 :         struct xfs_buf          *fbp;
    1692       30142 :         struct xfs_buf          *dbp;
    1693       30142 :         int                     error;
    1694             : 
    1695             :         /* Not allowed to allocate, return failure. */
    1696       30142 :         if (args->total == 0)
    1697             :                 return -ENOSPC;
    1698             : 
    1699             :         /* Allocate and initialize the new data block.  */
    1700       30142 :         error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, dbno);
    1701       30142 :         if (error)
    1702             :                 return error;
    1703       30142 :         error = xfs_dir3_data_init(args, *dbno, &dbp);
    1704       30142 :         if (error)
    1705             :                 return error;
    1706             : 
    1707             :         /*
    1708             :          * Get the freespace block corresponding to the data block
    1709             :          * that was just allocated.
    1710             :          */
    1711       30142 :         fbno = xfs_dir2_db_to_fdb(args->geo, *dbno);
    1712       30142 :         error = xfs_dir2_free_try_read(tp, dp,
    1713             :                                xfs_dir2_db_to_da(args->geo, fbno), &fbp);
    1714       30142 :         if (error)
    1715             :                 return error;
    1716             : 
    1717             :         /*
    1718             :          * If there wasn't a freespace block, the read will
    1719             :          * return a NULL fbp.  Allocate and initialize a new one.
    1720             :          */
    1721       30142 :         if (!fbp) {
    1722           3 :                 error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fbno);
    1723           3 :                 if (error)
    1724             :                         return error;
    1725             : 
    1726           3 :                 if (XFS_IS_CORRUPT(mp,
    1727             :                                    xfs_dir2_db_to_fdb(args->geo, *dbno) !=
    1728             :                                    fbno)) {
    1729           0 :                         xfs_alert(mp,
    1730             : "%s: dir ino %llu needed freesp block %lld for data block %lld, got %lld",
    1731             :                                 __func__, (unsigned long long)dp->i_ino,
    1732             :                                 (long long)xfs_dir2_db_to_fdb(args->geo, *dbno),
    1733             :                                 (long long)*dbno, (long long)fbno);
    1734           0 :                         if (fblk) {
    1735           0 :                                 xfs_alert(mp,
    1736             :                         " fblk "PTR_FMT" blkno %llu index %d magic 0x%x",
    1737             :                                         fblk, (unsigned long long)fblk->blkno,
    1738             :                                         fblk->index, fblk->magic);
    1739             :                         } else {
    1740           0 :                                 xfs_alert(mp, " ... fblk is NULL");
    1741             :                         }
    1742           0 :                         return -EFSCORRUPTED;
    1743             :                 }
    1744             : 
    1745             :                 /* Get a buffer for the new block. */
    1746           3 :                 error = xfs_dir3_free_get_buf(args, fbno, &fbp);
    1747           3 :                 if (error)
    1748             :                         return error;
    1749           3 :                 xfs_dir2_free_hdr_from_disk(mp, hdr, fbp->b_addr);
    1750             : 
    1751             :                 /* Remember the first slot as our empty slot. */
    1752           3 :                 hdr->firstdb = (fbno - xfs_dir2_byte_to_db(args->geo,
    1753           3 :                                                         XFS_DIR2_FREE_OFFSET)) *
    1754           3 :                                 args->geo->free_max_bests;
    1755             :         } else {
    1756       30139 :                 xfs_dir2_free_hdr_from_disk(mp, hdr, fbp->b_addr);
    1757             :         }
    1758             : 
    1759             :         /* Set the freespace block index from the data block number. */
    1760       30142 :         *findex = xfs_dir2_db_to_fdindex(args->geo, *dbno);
    1761             : 
    1762             :         /* Extend the freespace table if the new data block is off the end. */
    1763       30142 :         if (*findex >= hdr->nvalid) {
    1764       29769 :                 ASSERT(*findex < args->geo->free_max_bests);
    1765       29769 :                 hdr->nvalid = *findex + 1;
    1766       29769 :                 hdr->bests[*findex] = cpu_to_be16(NULLDATAOFF);
    1767             :         }
    1768             : 
    1769             :         /*
    1770             :          * If this entry was for an empty data block (this should always be
    1771             :          * true) then update the header.
    1772             :          */
    1773       30142 :         if (hdr->bests[*findex] == cpu_to_be16(NULLDATAOFF)) {
    1774       30142 :                 hdr->nused++;
    1775       30142 :                 xfs_dir2_free_hdr_to_disk(mp, fbp->b_addr, hdr);
    1776       30142 :                 xfs_dir2_free_log_header(args, fbp);
    1777             :         }
    1778             : 
    1779             :         /* Update the freespace value for the new block in the table. */
    1780       30142 :         bf = xfs_dir2_data_bestfree_p(mp, dbp->b_addr);
    1781       30142 :         hdr->bests[*findex] = bf[0].length;
    1782             : 
    1783       30142 :         *dbpp = dbp;
    1784       30142 :         *fbpp = fbp;
    1785       30142 :         return 0;
    1786             : }
    1787             : 
    1788             : static int
    1789    28218083 : xfs_dir2_node_find_freeblk(
    1790             :         struct xfs_da_args      *args,
    1791             :         struct xfs_da_state_blk *fblk,
    1792             :         xfs_dir2_db_t           *dbnop,
    1793             :         struct xfs_buf          **fbpp,
    1794             :         struct xfs_dir3_icfree_hdr *hdr,
    1795             :         int                     *findexp,
    1796             :         int                     length)
    1797             : {
    1798    28218083 :         struct xfs_inode        *dp = args->dp;
    1799    28218083 :         struct xfs_trans        *tp = args->trans;
    1800    28218083 :         struct xfs_buf          *fbp = NULL;
    1801    28218083 :         xfs_dir2_db_t           firstfbno;
    1802    28218083 :         xfs_dir2_db_t           lastfbno;
    1803    28218083 :         xfs_dir2_db_t           ifbno = -1;
    1804    28218083 :         xfs_dir2_db_t           dbno = -1;
    1805    28218083 :         xfs_dir2_db_t           fbno;
    1806    28218083 :         xfs_fileoff_t           fo;
    1807    28218083 :         int                     findex = 0;
    1808    28218083 :         int                     error;
    1809             : 
    1810             :         /*
    1811             :          * If we came in with a freespace block that means that lookup
    1812             :          * found an entry with our hash value.  This is the freespace
    1813             :          * block for that data entry.
    1814             :          */
    1815    28218083 :         if (fblk) {
    1816      254511 :                 fbp = fblk->bp;
    1817      254511 :                 findex = fblk->index;
    1818      254511 :                 xfs_dir2_free_hdr_from_disk(dp->i_mount, hdr, fbp->b_addr);
    1819      254511 :                 if (findex >= 0) {
    1820             :                         /* caller already found the freespace for us. */
    1821       56944 :                         ASSERT(findex < hdr->nvalid);
    1822       56944 :                         ASSERT(be16_to_cpu(hdr->bests[findex]) != NULLDATAOFF);
    1823       56944 :                         ASSERT(be16_to_cpu(hdr->bests[findex]) >= length);
    1824       56944 :                         dbno = hdr->firstdb + findex;
    1825       56944 :                         goto found_block;
    1826             :                 }
    1827             : 
    1828             :                 /*
    1829             :                  * The data block looked at didn't have enough room.
    1830             :                  * We'll start at the beginning of the freespace entries.
    1831             :                  */
    1832      197567 :                 ifbno = fblk->blkno;
    1833      197567 :                 xfs_trans_brelse(tp, fbp);
    1834      197567 :                 fbp = NULL;
    1835      197567 :                 fblk->bp = NULL;
    1836             :         }
    1837             : 
    1838             :         /*
    1839             :          * If we don't have a data block yet, we're going to scan the freespace
    1840             :          * data for a data block with enough free space in it.
    1841             :          */
    1842    28161139 :         error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK);
    1843    28161003 :         if (error)
    1844             :                 return error;
    1845    28162659 :         lastfbno = xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo);
    1846    28163131 :         firstfbno = xfs_dir2_byte_to_db(args->geo, XFS_DIR2_FREE_OFFSET);
    1847             : 
    1848    28576377 :         for (fbno = lastfbno - 1; fbno >= firstfbno; fbno--) {
    1849             :                 /* If it's ifbno we already looked at it. */
    1850    28546235 :                 if (fbno == ifbno)
    1851      126492 :                         continue;
    1852             : 
    1853             :                 /*
    1854             :                  * Read the block.  There can be holes in the freespace blocks,
    1855             :                  * so this might not succeed.  This should be really rare, so
    1856             :                  * there's no reason to avoid it.
    1857             :                  */
    1858    28419743 :                 error = xfs_dir2_free_try_read(tp, dp,
    1859             :                                 xfs_dir2_db_to_da(args->geo, fbno),
    1860             :                                 &fbp);
    1861    28419558 :                 if (error)
    1862         197 :                         return error;
    1863    28419361 :                 if (!fbp)
    1864           0 :                         continue;
    1865             : 
    1866    28419361 :                 xfs_dir2_free_hdr_from_disk(dp->i_mount, hdr, fbp->b_addr);
    1867             : 
    1868             :                 /* Scan the free entry array for a large enough free space. */
    1869   476899798 :                 for (findex = hdr->nvalid - 1; findex >= 0; findex--) {
    1870   950934632 :                         if (be16_to_cpu(hdr->bests[findex]) != NULLDATAOFF &&
    1871   474322124 :                             be16_to_cpu(hdr->bests[findex]) >= length) {
    1872    28132540 :                                 dbno = hdr->firstdb + findex;
    1873    28132540 :                                 goto found_block;
    1874             :                         }
    1875             :                 }
    1876             : 
    1877             :                 /* Didn't find free space, go on to next free block */
    1878      287290 :                 xfs_trans_brelse(tp, fbp);
    1879             :         }
    1880             : 
    1881       30142 : found_block:
    1882    28219626 :         *dbnop = dbno;
    1883    28219626 :         *fbpp = fbp;
    1884    28219626 :         *findexp = findex;
    1885    28219626 :         return 0;
    1886             : }
    1887             : 
    1888             : /*
    1889             :  * Add the data entry for a node-format directory name addition.
    1890             :  * The leaf entry is added in xfs_dir2_leafn_add.
    1891             :  * We may enter with a freespace block that the lookup found.
    1892             :  */
    1893             : static int
    1894    28218657 : xfs_dir2_node_addname_int(
    1895             :         struct xfs_da_args      *args,          /* operation arguments */
    1896             :         struct xfs_da_state_blk *fblk)          /* optional freespace block */
    1897             : {
    1898    28218657 :         struct xfs_dir2_data_unused *dup;       /* data unused entry pointer */
    1899    28218657 :         struct xfs_dir2_data_entry *dep;        /* data entry pointer */
    1900    28218657 :         struct xfs_dir2_data_hdr *hdr;          /* data block header */
    1901    28218657 :         struct xfs_dir2_data_free *bf;
    1902    28218657 :         struct xfs_trans        *tp = args->trans;
    1903    28218657 :         struct xfs_inode        *dp = args->dp;
    1904    28218657 :         struct xfs_dir3_icfree_hdr freehdr;
    1905    28218657 :         struct xfs_buf          *dbp;           /* data block buffer */
    1906    28218657 :         struct xfs_buf          *fbp;           /* freespace buffer */
    1907    28218657 :         xfs_dir2_data_aoff_t    aoff;
    1908    28218657 :         xfs_dir2_db_t           dbno;           /* data block number */
    1909    28218657 :         int                     error;          /* error return value */
    1910    28218657 :         int                     findex;         /* freespace entry index */
    1911    28218657 :         int                     length;         /* length of the new entry */
    1912    28218657 :         int                     logfree = 0;    /* need to log free entry */
    1913    28218657 :         int                     needlog = 0;    /* need to log data header */
    1914    28218657 :         int                     needscan = 0;   /* need to rescan data frees */
    1915    28218657 :         __be16                  *tagp;          /* data entry tag pointer */
    1916             : 
    1917    28218657 :         length = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
    1918    28218657 :         error = xfs_dir2_node_find_freeblk(args, fblk, &dbno, &fbp, &freehdr,
    1919             :                                            &findex, length);
    1920    28219400 :         if (error)
    1921             :                 return error;
    1922             : 
    1923             :         /*
    1924             :          * Now we know if we must allocate blocks, so if we are checking whether
    1925             :          * we can insert without allocation then we can return now.
    1926             :          */
    1927    28219203 :         if (args->op_flags & XFS_DA_OP_JUSTCHECK) {
    1928           0 :                 if (dbno == -1)
    1929             :                         return -ENOSPC;
    1930           0 :                 return 0;
    1931             :         }
    1932             : 
    1933             :         /*
    1934             :          * If we don't have a data block, we need to allocate one and make
    1935             :          * the freespace entries refer to it.
    1936             :          */
    1937    28219203 :         if (dbno == -1) {
    1938             :                 /* we're going to have to log the free block index later */
    1939       30142 :                 logfree = 1;
    1940       30142 :                 error = xfs_dir2_node_add_datablk(args, fblk, &dbno, &dbp, &fbp,
    1941             :                                                   &freehdr, &findex);
    1942             :         } else {
    1943             :                 /* Read the data block in. */
    1944    28189061 :                 error = xfs_dir3_data_read(tp, dp,
    1945             :                                            xfs_dir2_db_to_da(args->geo, dbno),
    1946             :                                            0, &dbp);
    1947             :         }
    1948    28219813 :         if (error)
    1949             :                 return error;
    1950             : 
    1951             :         /* setup for data block up now */
    1952    28219682 :         hdr = dbp->b_addr;
    1953    28219682 :         bf = xfs_dir2_data_bestfree_p(dp->i_mount, hdr);
    1954    28219622 :         ASSERT(be16_to_cpu(bf[0].length) >= length);
    1955             : 
    1956             :         /* Point to the existing unused space. */
    1957    56439244 :         dup = (xfs_dir2_data_unused_t *)
    1958    28219622 :               ((char *)hdr + be16_to_cpu(bf[0].offset));
    1959             : 
    1960             :         /* Mark the first part of the unused space, inuse for us. */
    1961    28219622 :         aoff = (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr);
    1962    28219622 :         error = xfs_dir2_data_use_free(args, dbp, dup, aoff, length,
    1963             :                         &needlog, &needscan);
    1964    28217535 :         if (error) {
    1965           0 :                 xfs_trans_brelse(tp, dbp);
    1966           0 :                 return error;
    1967             :         }
    1968             : 
    1969             :         /* Fill in the new entry and log it. */
    1970    28217535 :         dep = (xfs_dir2_data_entry_t *)dup;
    1971    28217535 :         dep->inumber = cpu_to_be64(args->inumber);
    1972    28217535 :         dep->namelen = args->namelen;
    1973    56435070 :         memcpy(dep->name, args->name, dep->namelen);
    1974    28217535 :         xfs_dir2_data_put_ftype(dp->i_mount, dep, args->filetype);
    1975    28217794 :         tagp = xfs_dir2_data_entry_tag_p(dp->i_mount, dep);
    1976    28218772 :         *tagp = cpu_to_be16((char *)dep - (char *)hdr);
    1977    28218772 :         xfs_dir2_data_log_entry(args, dbp, dep);
    1978             : 
    1979             :         /* Rescan the freespace and log the data block if needed. */
    1980    28219115 :         if (needscan)
    1981    13305660 :                 xfs_dir2_data_freescan(dp->i_mount, hdr, &needlog);
    1982    28219341 :         if (needlog)
    1983    28218193 :                 xfs_dir2_data_log_header(args, dbp);
    1984             : 
    1985             :         /* If the freespace block entry is now wrong, update it. */
    1986    28219104 :         if (freehdr.bests[findex] != bf[0].length) {
    1987    13996313 :                 freehdr.bests[findex] = bf[0].length;
    1988    13996313 :                 logfree = 1;
    1989             :         }
    1990             : 
    1991             :         /* Log the freespace entry if needed. */
    1992    28219104 :         if (logfree)
    1993    13996313 :                 xfs_dir2_free_log_bests(args, &freehdr, fbp, findex, findex);
    1994             : 
    1995             :         /* Return the data block and offset in args. */
    1996    28218704 :         args->blkno = (xfs_dablk_t)dbno;
    1997    28218704 :         args->index = be16_to_cpu(*tagp);
    1998    28218704 :         return 0;
    1999             : }
    2000             : 
    2001             : /*
    2002             :  * Top-level node form directory addname routine.
    2003             :  */
    2004             : int                                             /* error */
    2005    28216162 : xfs_dir2_node_addname(
    2006             :         xfs_da_args_t           *args)          /* operation arguments */
    2007             : {
    2008    28216162 :         xfs_da_state_blk_t      *blk;           /* leaf block for insert */
    2009    28216162 :         int                     error;          /* error return value */
    2010    28216162 :         int                     rval;           /* sub-return value */
    2011    28216162 :         xfs_da_state_t          *state;         /* btree cursor */
    2012             : 
    2013    28216162 :         trace_xfs_dir2_node_addname(args);
    2014             : 
    2015             :         /*
    2016             :          * Allocate and initialize the state (btree cursor).
    2017             :          */
    2018    28219558 :         state = xfs_da_state_alloc(args);
    2019             :         /*
    2020             :          * Look up the name.  We're not supposed to find it, but
    2021             :          * this gives us the insertion point.
    2022             :          */
    2023    28217818 :         error = xfs_da3_node_lookup_int(state, &rval);
    2024    28217177 :         if (error)
    2025           4 :                 rval = error;
    2026    28217177 :         if (rval != -ENOENT) {
    2027           4 :                 goto done;
    2028             :         }
    2029             :         /*
    2030             :          * Add the data entry to a data block.
    2031             :          * Extravalid is set to a freeblock found by lookup.
    2032             :          */
    2033    28217173 :         rval = xfs_dir2_node_addname_int(args,
    2034    28217173 :                 state->extravalid ? &state->extrablk : NULL);
    2035    28219112 :         if (rval) {
    2036         328 :                 goto done;
    2037             :         }
    2038    28218784 :         blk = &state->path.blk[state->path.active - 1];
    2039    28218764 :         ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
    2040             :         /*
    2041             :          * Add the new leaf entry.
    2042             :          */
    2043    28218764 :         rval = xfs_dir2_leafn_add(blk->bp, args, blk->index);
    2044    28217274 :         if (rval == 0) {
    2045             :                 /*
    2046             :                  * It worked, fix the hash values up the btree.
    2047             :                  */
    2048    28192875 :                 if (!(args->op_flags & XFS_DA_OP_JUSTCHECK))
    2049    28195053 :                         xfs_da3_fixhashpath(state, &state->path);
    2050             :         } else {
    2051             :                 /*
    2052             :                  * It didn't work, we need to split the leaf block.
    2053             :                  */
    2054       24399 :                 if (args->total == 0) {
    2055           0 :                         ASSERT(rval == -ENOSPC);
    2056           0 :                         goto done;
    2057             :                 }
    2058             :                 /*
    2059             :                  * Split the leaf block and insert the new entry.
    2060             :                  */
    2061       24399 :                 rval = xfs_da3_split(state);
    2062             :         }
    2063    28217046 : done:
    2064    28217046 :         xfs_da_state_free(state);
    2065    28219676 :         return rval;
    2066             : }
    2067             : 
    2068             : /*
    2069             :  * Lookup an entry in a node-format directory.
    2070             :  * All the real work happens in xfs_da3_node_lookup_int.
    2071             :  * The only real output is the inode number of the entry.
    2072             :  */
    2073             : int                                             /* error */
    2074   122643571 : xfs_dir2_node_lookup(
    2075             :         xfs_da_args_t   *args)                  /* operation arguments */
    2076             : {
    2077   122643571 :         int             error;                  /* error return value */
    2078   122643571 :         int             i;                      /* btree level */
    2079   122643571 :         int             rval;                   /* operation return value */
    2080   122643571 :         xfs_da_state_t  *state;                 /* btree cursor */
    2081             : 
    2082   122643571 :         trace_xfs_dir2_node_lookup(args);
    2083             : 
    2084             :         /*
    2085             :          * Allocate and initialize the btree cursor.
    2086             :          */
    2087   122643845 :         state = xfs_da_state_alloc(args);
    2088             : 
    2089             :         /*
    2090             :          * Fill in the path to the entry in the cursor.
    2091             :          */
    2092   122644011 :         error = xfs_da3_node_lookup_int(state, &rval);
    2093   122641898 :         if (error)
    2094        7359 :                 rval = error;
    2095   122634539 :         else if (rval == -ENOENT && args->cmpresult == XFS_CMP_CASE) {
    2096             :                 /* If a CI match, dup the actual name and return -EEXIST */
    2097       58413 :                 xfs_dir2_data_entry_t   *dep;
    2098             : 
    2099       58413 :                 dep = (xfs_dir2_data_entry_t *)
    2100       58413 :                         ((char *)state->extrablk.bp->b_addr +
    2101       58413 :                                                  state->extrablk.index);
    2102       58413 :                 rval = xfs_dir_cilookup_result(args, dep->name, dep->namelen);
    2103             :         }
    2104             :         /*
    2105             :          * Release the btree blocks and leaf block.
    2106             :          */
    2107   369193772 :         for (i = 0; i < state->path.active; i++) {
    2108   246549020 :                 xfs_trans_brelse(args->trans, state->path.blk[i].bp);
    2109   246566441 :                 state->path.blk[i].bp = NULL;
    2110             :         }
    2111             :         /*
    2112             :          * Release the data block if we have it.
    2113             :          */
    2114   122644752 :         if (state->extravalid && state->extrablk.bp) {
    2115   115294304 :                 xfs_trans_brelse(args->trans, state->extrablk.bp);
    2116   115294315 :                 state->extrablk.bp = NULL;
    2117             :         }
    2118   122644763 :         xfs_da_state_free(state);
    2119   122641075 :         return rval;
    2120             : }
    2121             : 
    2122             : /*
    2123             :  * Remove an entry from a node-format directory.
    2124             :  */
    2125             : int                                             /* error */
    2126    26758210 : xfs_dir2_node_removename(
    2127             :         struct xfs_da_args      *args)          /* operation arguments */
    2128             : {
    2129    26758210 :         struct xfs_da_state_blk *blk;           /* leaf block */
    2130    26758210 :         int                     error;          /* error return value */
    2131    26758210 :         int                     rval;           /* operation return value */
    2132    26758210 :         struct xfs_da_state     *state;         /* btree cursor */
    2133             : 
    2134    26758210 :         trace_xfs_dir2_node_removename(args);
    2135             : 
    2136             :         /*
    2137             :          * Allocate and initialize the btree cursor.
    2138             :          */
    2139    26758997 :         state = xfs_da_state_alloc(args);
    2140             : 
    2141             :         /* Look up the entry we're deleting, set up the cursor. */
    2142    26758325 :         error = xfs_da3_node_lookup_int(state, &rval);
    2143    26757890 :         if (error)
    2144           2 :                 goto out_free;
    2145             : 
    2146             :         /* Didn't find it, upper layer screwed up. */
    2147    26757888 :         if (rval != -EEXIST) {
    2148           0 :                 error = rval;
    2149           0 :                 goto out_free;
    2150             :         }
    2151             : 
    2152    26757888 :         blk = &state->path.blk[state->path.active - 1];
    2153    26758823 :         ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
    2154    26758823 :         ASSERT(state->extravalid);
    2155             :         /*
    2156             :          * Remove the leaf and data entries.
    2157             :          * Extrablk refers to the data block.
    2158             :          */
    2159    26758823 :         error = xfs_dir2_leafn_remove(args, blk->bp, blk->index,
    2160             :                 &state->extrablk, &rval);
    2161    26757715 :         if (error)
    2162           2 :                 goto out_free;
    2163             :         /*
    2164             :          * Fix the hash values up the btree.
    2165             :          */
    2166    26757713 :         xfs_da3_fixhashpath(state, &state->path);
    2167             :         /*
    2168             :          * If we need to join leaf blocks, do it.
    2169             :          */
    2170    26758346 :         if (rval && state->path.active > 1)
    2171     1654145 :                 error = xfs_da3_join(state);
    2172             :         /*
    2173             :          * If no errors so far, try conversion to leaf format.
    2174             :          */
    2175    26758351 :         if (!error)
    2176    26758351 :                 error = xfs_dir2_node_to_leaf(state);
    2177           0 : out_free:
    2178    26758228 :         xfs_da_state_free(state);
    2179    26758306 :         return error;
    2180             : }
    2181             : 
    2182             : /*
    2183             :  * Replace an entry's inode number in a node-format directory.
    2184             :  */
    2185             : int                                             /* error */
    2186      452870 : xfs_dir2_node_replace(
    2187             :         xfs_da_args_t           *args)          /* operation arguments */
    2188             : {
    2189      452870 :         xfs_da_state_blk_t      *blk;           /* leaf block */
    2190      452870 :         xfs_dir2_data_hdr_t     *hdr;           /* data block header */
    2191      452870 :         xfs_dir2_data_entry_t   *dep;           /* data entry changed */
    2192      452870 :         int                     error;          /* error return value */
    2193      452870 :         int                     i;              /* btree level */
    2194      452870 :         xfs_ino_t               inum;           /* new inode number */
    2195      452870 :         int                     ftype;          /* new file type */
    2196      452870 :         int                     rval;           /* internal return value */
    2197      452870 :         xfs_da_state_t          *state;         /* btree cursor */
    2198             : 
    2199      452870 :         trace_xfs_dir2_node_replace(args);
    2200             : 
    2201             :         /*
    2202             :          * Allocate and initialize the btree cursor.
    2203             :          */
    2204      452873 :         state = xfs_da_state_alloc(args);
    2205             : 
    2206             :         /*
    2207             :          * We have to save new inode number and ftype since
    2208             :          * xfs_da3_node_lookup_int() is going to overwrite them
    2209             :          */
    2210      452873 :         inum = args->inumber;
    2211      452873 :         ftype = args->filetype;
    2212             : 
    2213             :         /*
    2214             :          * Lookup the entry to change in the btree.
    2215             :          */
    2216      452873 :         error = xfs_da3_node_lookup_int(state, &rval);
    2217      452873 :         if (error) {
    2218         114 :                 rval = error;
    2219             :         }
    2220             :         /*
    2221             :          * It should be found, since the vnodeops layer has looked it up
    2222             :          * and locked it.  But paranoia is good.
    2223             :          */
    2224      452873 :         if (rval == -EEXIST) {
    2225      452759 :                 struct xfs_dir3_icleaf_hdr      leafhdr;
    2226             : 
    2227             :                 /*
    2228             :                  * Find the leaf entry.
    2229             :                  */
    2230      452759 :                 blk = &state->path.blk[state->path.active - 1];
    2231      452759 :                 ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC);
    2232      452759 :                 ASSERT(state->extravalid);
    2233             : 
    2234      452759 :                 xfs_dir2_leaf_hdr_from_disk(state->mp, &leafhdr,
    2235      452759 :                                             blk->bp->b_addr);
    2236             :                 /*
    2237             :                  * Point to the data entry.
    2238             :                  */
    2239      452758 :                 hdr = state->extrablk.bp->b_addr;
    2240      452758 :                 ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||
    2241             :                        hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC));
    2242      905516 :                 dep = (xfs_dir2_data_entry_t *)
    2243             :                       ((char *)hdr +
    2244      905516 :                        xfs_dir2_dataptr_to_off(args->geo,
    2245      452758 :                                 be32_to_cpu(leafhdr.ents[blk->index].address)));
    2246      452758 :                 ASSERT(inum != be64_to_cpu(dep->inumber));
    2247             :                 /*
    2248             :                  * Fill in the new inode number and log the entry.
    2249             :                  */
    2250      452758 :                 dep->inumber = cpu_to_be64(inum);
    2251      452758 :                 xfs_dir2_data_put_ftype(state->mp, dep, ftype);
    2252      452759 :                 xfs_dir2_data_log_entry(args, state->extrablk.bp, dep);
    2253      452758 :                 rval = 0;
    2254             :         }
    2255             :         /*
    2256             :          * Didn't find it, and we're holding a data block.  Drop it.
    2257             :          */
    2258         114 :         else if (state->extravalid) {
    2259           0 :                 xfs_trans_brelse(args->trans, state->extrablk.bp);
    2260           0 :                 state->extrablk.bp = NULL;
    2261             :         }
    2262             :         /*
    2263             :          * Release all the buffers in the cursor.
    2264             :          */
    2265     1358362 :         for (i = 0; i < state->path.active; i++) {
    2266      905489 :                 xfs_trans_brelse(args->trans, state->path.blk[i].bp);
    2267      905493 :                 state->path.blk[i].bp = NULL;
    2268             :         }
    2269      452873 :         xfs_da_state_free(state);
    2270      452873 :         return rval;
    2271             : }
    2272             : 
    2273             : /*
    2274             :  * Trim off a trailing empty freespace block.
    2275             :  * Return (in rvalp) 1 if we did it, 0 if not.
    2276             :  */
    2277             : int                                             /* error */
    2278        2150 : xfs_dir2_node_trim_free(
    2279             :         xfs_da_args_t           *args,          /* operation arguments */
    2280             :         xfs_fileoff_t           fo,             /* free block number */
    2281             :         int                     *rvalp)         /* out: did something */
    2282             : {
    2283        2150 :         struct xfs_buf          *bp;            /* freespace buffer */
    2284        2150 :         xfs_inode_t             *dp;            /* incore directory inode */
    2285        2150 :         int                     error;          /* error return code */
    2286        2150 :         xfs_dir2_free_t         *free;          /* freespace structure */
    2287        2150 :         xfs_trans_t             *tp;            /* transaction pointer */
    2288        2150 :         struct xfs_dir3_icfree_hdr freehdr;
    2289             : 
    2290        2150 :         dp = args->dp;
    2291        2150 :         tp = args->trans;
    2292             : 
    2293        2150 :         *rvalp = 0;
    2294             : 
    2295             :         /*
    2296             :          * Read the freespace block.
    2297             :          */
    2298        2150 :         error = xfs_dir2_free_try_read(tp, dp, fo, &bp);
    2299        2150 :         if (error)
    2300             :                 return error;
    2301             :         /*
    2302             :          * There can be holes in freespace.  If fo is a hole, there's
    2303             :          * nothing to do.
    2304             :          */
    2305        2150 :         if (!bp)
    2306             :                 return 0;
    2307        2150 :         free = bp->b_addr;
    2308        2150 :         xfs_dir2_free_hdr_from_disk(dp->i_mount, &freehdr, free);
    2309             : 
    2310             :         /*
    2311             :          * If there are used entries, there's nothing to do.
    2312             :          */
    2313        2150 :         if (freehdr.nused > 0) {
    2314        2150 :                 xfs_trans_brelse(tp, bp);
    2315        2150 :                 return 0;
    2316             :         }
    2317             :         /*
    2318             :          * Blow the block away.
    2319             :          */
    2320           0 :         error = xfs_dir2_shrink_inode(args,
    2321             :                         xfs_dir2_da_to_db(args->geo, (xfs_dablk_t)fo), bp);
    2322           0 :         if (error) {
    2323             :                 /*
    2324             :                  * Can't fail with ENOSPC since that only happens with no
    2325             :                  * space reservation, when breaking up an extent into two
    2326             :                  * pieces.  This is the last block of an extent.
    2327             :                  */
    2328           0 :                 ASSERT(error != -ENOSPC);
    2329           0 :                 xfs_trans_brelse(tp, bp);
    2330           0 :                 return error;
    2331             :         }
    2332             :         /*
    2333             :          * Return that we succeeded.
    2334             :          */
    2335           0 :         *rvalp = 1;
    2336           0 :         return 0;
    2337             : }

Generated by: LCOV version 1.14