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