1 /* 2 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3 * Copyright (c) 2013 Red Hat, Inc. 4 * All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it would be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 */ 19 #include "xfs.h" 20 #include "xfs_fs.h" 21 #include "xfs_shared.h" 22 #include "xfs_format.h" 23 #include "xfs_log_format.h" 24 #include "xfs_trans_resv.h" 25 #include "xfs_bit.h" 26 #include "xfs_sb.h" 27 #include "xfs_mount.h" 28 #include "xfs_da_format.h" 29 #include "xfs_da_btree.h" 30 #include "xfs_inode.h" 31 #include "xfs_trans.h" 32 #include "xfs_inode_item.h" 33 #include "xfs_bmap_btree.h" 34 #include "xfs_bmap.h" 35 #include "xfs_attr_sf.h" 36 #include "xfs_attr_remote.h" 37 #include "xfs_attr.h" 38 #include "xfs_attr_leaf.h" 39 #include "xfs_error.h" 40 #include "xfs_trace.h" 41 #include "xfs_buf_item.h" 42 #include "xfs_cksum.h" 43 #include "xfs_dir2.h" 44 45 46 /* 47 * xfs_attr_leaf.c 48 * 49 * Routines to implement leaf blocks of attributes as Btrees of hashed names. 50 */ 51 52 /*======================================================================== 53 * Function prototypes for the kernel. 54 *========================================================================*/ 55 56 /* 57 * Routines used for growing the Btree. 58 */ 59 STATIC int xfs_attr3_leaf_create(struct xfs_da_args *args, 60 xfs_dablk_t which_block, struct xfs_buf **bpp); 61 STATIC int xfs_attr3_leaf_add_work(struct xfs_buf *leaf_buffer, 62 struct xfs_attr3_icleaf_hdr *ichdr, 63 struct xfs_da_args *args, int freemap_index); 64 STATIC void xfs_attr3_leaf_compact(struct xfs_da_args *args, 65 struct xfs_attr3_icleaf_hdr *ichdr, 66 struct xfs_buf *leaf_buffer); 67 STATIC void xfs_attr3_leaf_rebalance(xfs_da_state_t *state, 68 xfs_da_state_blk_t *blk1, 69 xfs_da_state_blk_t *blk2); 70 STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, 71 xfs_da_state_blk_t *leaf_blk_1, 72 struct xfs_attr3_icleaf_hdr *ichdr1, 73 xfs_da_state_blk_t *leaf_blk_2, 74 struct xfs_attr3_icleaf_hdr *ichdr2, 75 int *number_entries_in_blk1, 76 int *number_usedbytes_in_blk1); 77 78 /* 79 * Utility routines. 80 */ 81 STATIC void xfs_attr3_leaf_moveents(struct xfs_da_args *args, 82 struct xfs_attr_leafblock *src_leaf, 83 struct xfs_attr3_icleaf_hdr *src_ichdr, int src_start, 84 struct xfs_attr_leafblock *dst_leaf, 85 struct xfs_attr3_icleaf_hdr *dst_ichdr, int dst_start, 86 int move_count); 87 STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); 88 89 /* 90 * attr3 block 'firstused' conversion helpers. 91 * 92 * firstused refers to the offset of the first used byte of the nameval region 93 * of an attr leaf block. The region starts at the tail of the block and expands 94 * backwards towards the middle. As such, firstused is initialized to the block 95 * size for an empty leaf block and is reduced from there. 96 * 97 * The attr3 block size is pegged to the fsb size and the maximum fsb is 64k. 98 * The in-core firstused field is 32-bit and thus supports the maximum fsb size. 99 * The on-disk field is only 16-bit, however, and overflows at 64k. Since this 100 * only occurs at exactly 64k, we use zero as a magic on-disk value to represent 101 * the attr block size. The following helpers manage the conversion between the 102 * in-core and on-disk formats. 103 */ 104 105 static void 106 xfs_attr3_leaf_firstused_from_disk( 107 struct xfs_da_geometry *geo, 108 struct xfs_attr3_icleaf_hdr *to, 109 struct xfs_attr_leafblock *from) 110 { 111 struct xfs_attr3_leaf_hdr *hdr3; 112 113 if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) { 114 hdr3 = (struct xfs_attr3_leaf_hdr *) from; 115 to->firstused = be16_to_cpu(hdr3->firstused); 116 } else { 117 to->firstused = be16_to_cpu(from->hdr.firstused); 118 } 119 120 /* 121 * Convert from the magic fsb size value to actual blocksize. This 122 * should only occur for empty blocks when the block size overflows 123 * 16-bits. 124 */ 125 if (to->firstused == XFS_ATTR3_LEAF_NULLOFF) { 126 ASSERT(!to->count && !to->usedbytes); 127 ASSERT(geo->blksize > USHRT_MAX); 128 to->firstused = geo->blksize; 129 } 130 } 131 132 static void 133 xfs_attr3_leaf_firstused_to_disk( 134 struct xfs_da_geometry *geo, 135 struct xfs_attr_leafblock *to, 136 struct xfs_attr3_icleaf_hdr *from) 137 { 138 struct xfs_attr3_leaf_hdr *hdr3; 139 uint32_t firstused; 140 141 /* magic value should only be seen on disk */ 142 ASSERT(from->firstused != XFS_ATTR3_LEAF_NULLOFF); 143 144 /* 145 * Scale down the 32-bit in-core firstused value to the 16-bit on-disk 146 * value. This only overflows at the max supported value of 64k. Use the 147 * magic on-disk value to represent block size in this case. 148 */ 149 firstused = from->firstused; 150 if (firstused > USHRT_MAX) { 151 ASSERT(from->firstused == geo->blksize); 152 firstused = XFS_ATTR3_LEAF_NULLOFF; 153 } 154 155 if (from->magic == XFS_ATTR3_LEAF_MAGIC) { 156 hdr3 = (struct xfs_attr3_leaf_hdr *) to; 157 hdr3->firstused = cpu_to_be16(firstused); 158 } else { 159 to->hdr.firstused = cpu_to_be16(firstused); 160 } 161 } 162 163 void 164 xfs_attr3_leaf_hdr_from_disk( 165 struct xfs_da_geometry *geo, 166 struct xfs_attr3_icleaf_hdr *to, 167 struct xfs_attr_leafblock *from) 168 { 169 int i; 170 171 ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC) || 172 from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)); 173 174 if (from->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) { 175 struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)from; 176 177 to->forw = be32_to_cpu(hdr3->info.hdr.forw); 178 to->back = be32_to_cpu(hdr3->info.hdr.back); 179 to->magic = be16_to_cpu(hdr3->info.hdr.magic); 180 to->count = be16_to_cpu(hdr3->count); 181 to->usedbytes = be16_to_cpu(hdr3->usedbytes); 182 xfs_attr3_leaf_firstused_from_disk(geo, to, from); 183 to->holes = hdr3->holes; 184 185 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 186 to->freemap[i].base = be16_to_cpu(hdr3->freemap[i].base); 187 to->freemap[i].size = be16_to_cpu(hdr3->freemap[i].size); 188 } 189 return; 190 } 191 to->forw = be32_to_cpu(from->hdr.info.forw); 192 to->back = be32_to_cpu(from->hdr.info.back); 193 to->magic = be16_to_cpu(from->hdr.info.magic); 194 to->count = be16_to_cpu(from->hdr.count); 195 to->usedbytes = be16_to_cpu(from->hdr.usedbytes); 196 xfs_attr3_leaf_firstused_from_disk(geo, to, from); 197 to->holes = from->hdr.holes; 198 199 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 200 to->freemap[i].base = be16_to_cpu(from->hdr.freemap[i].base); 201 to->freemap[i].size = be16_to_cpu(from->hdr.freemap[i].size); 202 } 203 } 204 205 void 206 xfs_attr3_leaf_hdr_to_disk( 207 struct xfs_da_geometry *geo, 208 struct xfs_attr_leafblock *to, 209 struct xfs_attr3_icleaf_hdr *from) 210 { 211 int i; 212 213 ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC || 214 from->magic == XFS_ATTR3_LEAF_MAGIC); 215 216 if (from->magic == XFS_ATTR3_LEAF_MAGIC) { 217 struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to; 218 219 hdr3->info.hdr.forw = cpu_to_be32(from->forw); 220 hdr3->info.hdr.back = cpu_to_be32(from->back); 221 hdr3->info.hdr.magic = cpu_to_be16(from->magic); 222 hdr3->count = cpu_to_be16(from->count); 223 hdr3->usedbytes = cpu_to_be16(from->usedbytes); 224 xfs_attr3_leaf_firstused_to_disk(geo, to, from); 225 hdr3->holes = from->holes; 226 hdr3->pad1 = 0; 227 228 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 229 hdr3->freemap[i].base = cpu_to_be16(from->freemap[i].base); 230 hdr3->freemap[i].size = cpu_to_be16(from->freemap[i].size); 231 } 232 return; 233 } 234 to->hdr.info.forw = cpu_to_be32(from->forw); 235 to->hdr.info.back = cpu_to_be32(from->back); 236 to->hdr.info.magic = cpu_to_be16(from->magic); 237 to->hdr.count = cpu_to_be16(from->count); 238 to->hdr.usedbytes = cpu_to_be16(from->usedbytes); 239 xfs_attr3_leaf_firstused_to_disk(geo, to, from); 240 to->hdr.holes = from->holes; 241 to->hdr.pad1 = 0; 242 243 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 244 to->hdr.freemap[i].base = cpu_to_be16(from->freemap[i].base); 245 to->hdr.freemap[i].size = cpu_to_be16(from->freemap[i].size); 246 } 247 } 248 249 static bool 250 xfs_attr3_leaf_verify( 251 struct xfs_buf *bp) 252 { 253 struct xfs_mount *mp = bp->b_target->bt_mount; 254 struct xfs_attr_leafblock *leaf = bp->b_addr; 255 struct xfs_attr3_icleaf_hdr ichdr; 256 257 xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf); 258 259 if (xfs_sb_version_hascrc(&mp->m_sb)) { 260 struct xfs_da3_node_hdr *hdr3 = bp->b_addr; 261 262 if (ichdr.magic != XFS_ATTR3_LEAF_MAGIC) 263 return false; 264 265 if (!uuid_equal(&hdr3->info.uuid, &mp->m_sb.sb_meta_uuid)) 266 return false; 267 if (be64_to_cpu(hdr3->info.blkno) != bp->b_bn) 268 return false; 269 } else { 270 if (ichdr.magic != XFS_ATTR_LEAF_MAGIC) 271 return false; 272 } 273 if (ichdr.count == 0) 274 return false; 275 276 /* XXX: need to range check rest of attr header values */ 277 /* XXX: hash order check? */ 278 279 return true; 280 } 281 282 static void 283 xfs_attr3_leaf_write_verify( 284 struct xfs_buf *bp) 285 { 286 struct xfs_mount *mp = bp->b_target->bt_mount; 287 struct xfs_buf_log_item *bip = bp->b_fspriv; 288 struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr; 289 290 if (!xfs_attr3_leaf_verify(bp)) { 291 xfs_buf_ioerror(bp, -EFSCORRUPTED); 292 xfs_verifier_error(bp); 293 return; 294 } 295 296 if (!xfs_sb_version_hascrc(&mp->m_sb)) 297 return; 298 299 if (bip) 300 hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); 301 302 xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF); 303 } 304 305 /* 306 * leaf/node format detection on trees is sketchy, so a node read can be done on 307 * leaf level blocks when detection identifies the tree as a node format tree 308 * incorrectly. In this case, we need to swap the verifier to match the correct 309 * format of the block being read. 310 */ 311 static void 312 xfs_attr3_leaf_read_verify( 313 struct xfs_buf *bp) 314 { 315 struct xfs_mount *mp = bp->b_target->bt_mount; 316 317 if (xfs_sb_version_hascrc(&mp->m_sb) && 318 !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF)) 319 xfs_buf_ioerror(bp, -EFSBADCRC); 320 else if (!xfs_attr3_leaf_verify(bp)) 321 xfs_buf_ioerror(bp, -EFSCORRUPTED); 322 323 if (bp->b_error) 324 xfs_verifier_error(bp); 325 } 326 327 const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = { 328 .verify_read = xfs_attr3_leaf_read_verify, 329 .verify_write = xfs_attr3_leaf_write_verify, 330 }; 331 332 int 333 xfs_attr3_leaf_read( 334 struct xfs_trans *tp, 335 struct xfs_inode *dp, 336 xfs_dablk_t bno, 337 xfs_daddr_t mappedbno, 338 struct xfs_buf **bpp) 339 { 340 int err; 341 342 err = xfs_da_read_buf(tp, dp, bno, mappedbno, bpp, 343 XFS_ATTR_FORK, &xfs_attr3_leaf_buf_ops); 344 if (!err && tp) 345 xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_ATTR_LEAF_BUF); 346 return err; 347 } 348 349 /*======================================================================== 350 * Namespace helper routines 351 *========================================================================*/ 352 353 /* 354 * If namespace bits don't match return 0. 355 * If all match then return 1. 356 */ 357 STATIC int 358 xfs_attr_namesp_match(int arg_flags, int ondisk_flags) 359 { 360 return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); 361 } 362 363 364 /*======================================================================== 365 * External routines when attribute fork size < XFS_LITINO(mp). 366 *========================================================================*/ 367 368 /* 369 * Query whether the requested number of additional bytes of extended 370 * attribute space will be able to fit inline. 371 * 372 * Returns zero if not, else the di_forkoff fork offset to be used in the 373 * literal area for attribute data once the new bytes have been added. 374 * 375 * di_forkoff must be 8 byte aligned, hence is stored as a >>3 value; 376 * special case for dev/uuid inodes, they have fixed size data forks. 377 */ 378 int 379 xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) 380 { 381 int offset; 382 int minforkoff; /* lower limit on valid forkoff locations */ 383 int maxforkoff; /* upper limit on valid forkoff locations */ 384 int dsize; 385 xfs_mount_t *mp = dp->i_mount; 386 387 /* rounded down */ 388 offset = (XFS_LITINO(mp, dp->i_d.di_version) - bytes) >> 3; 389 390 switch (dp->i_d.di_format) { 391 case XFS_DINODE_FMT_DEV: 392 minforkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; 393 return (offset >= minforkoff) ? minforkoff : 0; 394 case XFS_DINODE_FMT_UUID: 395 minforkoff = roundup(sizeof(uuid_t), 8) >> 3; 396 return (offset >= minforkoff) ? minforkoff : 0; 397 } 398 399 /* 400 * If the requested numbers of bytes is smaller or equal to the 401 * current attribute fork size we can always proceed. 402 * 403 * Note that if_bytes in the data fork might actually be larger than 404 * the current data fork size is due to delalloc extents. In that 405 * case either the extent count will go down when they are converted 406 * to real extents, or the delalloc conversion will take care of the 407 * literal area rebalancing. 408 */ 409 if (bytes <= XFS_IFORK_ASIZE(dp)) 410 return dp->i_d.di_forkoff; 411 412 /* 413 * For attr2 we can try to move the forkoff if there is space in the 414 * literal area, but for the old format we are done if there is no 415 * space in the fixed attribute fork. 416 */ 417 if (!(mp->m_flags & XFS_MOUNT_ATTR2)) 418 return 0; 419 420 dsize = dp->i_df.if_bytes; 421 422 switch (dp->i_d.di_format) { 423 case XFS_DINODE_FMT_EXTENTS: 424 /* 425 * If there is no attr fork and the data fork is extents, 426 * determine if creating the default attr fork will result 427 * in the extents form migrating to btree. If so, the 428 * minimum offset only needs to be the space required for 429 * the btree root. 430 */ 431 if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > 432 xfs_default_attroffset(dp)) 433 dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); 434 break; 435 case XFS_DINODE_FMT_BTREE: 436 /* 437 * If we have a data btree then keep forkoff if we have one, 438 * otherwise we are adding a new attr, so then we set 439 * minforkoff to where the btree root can finish so we have 440 * plenty of room for attrs 441 */ 442 if (dp->i_d.di_forkoff) { 443 if (offset < dp->i_d.di_forkoff) 444 return 0; 445 return dp->i_d.di_forkoff; 446 } 447 dsize = XFS_BMAP_BROOT_SPACE(mp, dp->i_df.if_broot); 448 break; 449 } 450 451 /* 452 * A data fork btree root must have space for at least 453 * MINDBTPTRS key/ptr pairs if the data fork is small or empty. 454 */ 455 minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); 456 minforkoff = roundup(minforkoff, 8) >> 3; 457 458 /* attr fork btree root can have at least this many key/ptr pairs */ 459 maxforkoff = XFS_LITINO(mp, dp->i_d.di_version) - 460 XFS_BMDR_SPACE_CALC(MINABTPTRS); 461 maxforkoff = maxforkoff >> 3; /* rounded down */ 462 463 if (offset >= maxforkoff) 464 return maxforkoff; 465 if (offset >= minforkoff) 466 return offset; 467 return 0; 468 } 469 470 /* 471 * Switch on the ATTR2 superblock bit (implies also FEATURES2) 472 */ 473 STATIC void 474 xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) 475 { 476 if ((mp->m_flags & XFS_MOUNT_ATTR2) && 477 !(xfs_sb_version_hasattr2(&mp->m_sb))) { 478 spin_lock(&mp->m_sb_lock); 479 if (!xfs_sb_version_hasattr2(&mp->m_sb)) { 480 xfs_sb_version_addattr2(&mp->m_sb); 481 spin_unlock(&mp->m_sb_lock); 482 xfs_log_sb(tp); 483 } else 484 spin_unlock(&mp->m_sb_lock); 485 } 486 } 487 488 /* 489 * Create the initial contents of a shortform attribute list. 490 */ 491 void 492 xfs_attr_shortform_create(xfs_da_args_t *args) 493 { 494 xfs_attr_sf_hdr_t *hdr; 495 xfs_inode_t *dp; 496 xfs_ifork_t *ifp; 497 498 trace_xfs_attr_sf_create(args); 499 500 dp = args->dp; 501 ASSERT(dp != NULL); 502 ifp = dp->i_afp; 503 ASSERT(ifp != NULL); 504 ASSERT(ifp->if_bytes == 0); 505 if (dp->i_d.di_aformat == XFS_DINODE_FMT_EXTENTS) { 506 ifp->if_flags &= ~XFS_IFEXTENTS; /* just in case */ 507 dp->i_d.di_aformat = XFS_DINODE_FMT_LOCAL; 508 ifp->if_flags |= XFS_IFINLINE; 509 } else { 510 ASSERT(ifp->if_flags & XFS_IFINLINE); 511 } 512 xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK); 513 hdr = (xfs_attr_sf_hdr_t *)ifp->if_u1.if_data; 514 hdr->count = 0; 515 hdr->totsize = cpu_to_be16(sizeof(*hdr)); 516 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); 517 } 518 519 /* 520 * Add a name/value pair to the shortform attribute list. 521 * Overflow from the inode has already been checked for. 522 */ 523 void 524 xfs_attr_shortform_add(xfs_da_args_t *args, int forkoff) 525 { 526 xfs_attr_shortform_t *sf; 527 xfs_attr_sf_entry_t *sfe; 528 int i, offset, size; 529 xfs_mount_t *mp; 530 xfs_inode_t *dp; 531 xfs_ifork_t *ifp; 532 533 trace_xfs_attr_sf_add(args); 534 535 dp = args->dp; 536 mp = dp->i_mount; 537 dp->i_d.di_forkoff = forkoff; 538 539 ifp = dp->i_afp; 540 ASSERT(ifp->if_flags & XFS_IFINLINE); 541 sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; 542 sfe = &sf->list[0]; 543 for (i = 0; i < sf->hdr.count; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { 544 #ifdef DEBUG 545 if (sfe->namelen != args->namelen) 546 continue; 547 if (memcmp(args->name, sfe->nameval, args->namelen) != 0) 548 continue; 549 if (!xfs_attr_namesp_match(args->flags, sfe->flags)) 550 continue; 551 ASSERT(0); 552 #endif 553 } 554 555 offset = (char *)sfe - (char *)sf; 556 size = XFS_ATTR_SF_ENTSIZE_BYNAME(args->namelen, args->valuelen); 557 xfs_idata_realloc(dp, size, XFS_ATTR_FORK); 558 sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; 559 sfe = (xfs_attr_sf_entry_t *)((char *)sf + offset); 560 561 sfe->namelen = args->namelen; 562 sfe->valuelen = args->valuelen; 563 sfe->flags = XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); 564 memcpy(sfe->nameval, args->name, args->namelen); 565 memcpy(&sfe->nameval[args->namelen], args->value, args->valuelen); 566 sf->hdr.count++; 567 be16_add_cpu(&sf->hdr.totsize, size); 568 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA); 569 570 xfs_sbversion_add_attr2(mp, args->trans); 571 } 572 573 /* 574 * After the last attribute is removed revert to original inode format, 575 * making all literal area available to the data fork once more. 576 */ 577 void 578 xfs_attr_fork_remove( 579 struct xfs_inode *ip, 580 struct xfs_trans *tp) 581 { 582 xfs_idestroy_fork(ip, XFS_ATTR_FORK); 583 ip->i_d.di_forkoff = 0; 584 ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS; 585 586 ASSERT(ip->i_d.di_anextents == 0); 587 ASSERT(ip->i_afp == NULL); 588 589 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 590 } 591 592 /* 593 * Remove an attribute from the shortform attribute list structure. 594 */ 595 int 596 xfs_attr_shortform_remove(xfs_da_args_t *args) 597 { 598 xfs_attr_shortform_t *sf; 599 xfs_attr_sf_entry_t *sfe; 600 int base, size=0, end, totsize, i; 601 xfs_mount_t *mp; 602 xfs_inode_t *dp; 603 604 trace_xfs_attr_sf_remove(args); 605 606 dp = args->dp; 607 mp = dp->i_mount; 608 base = sizeof(xfs_attr_sf_hdr_t); 609 sf = (xfs_attr_shortform_t *)dp->i_afp->if_u1.if_data; 610 sfe = &sf->list[0]; 611 end = sf->hdr.count; 612 for (i = 0; i < end; sfe = XFS_ATTR_SF_NEXTENTRY(sfe), 613 base += size, i++) { 614 size = XFS_ATTR_SF_ENTSIZE(sfe); 615 if (sfe->namelen != args->namelen) 616 continue; 617 if (memcmp(sfe->nameval, args->name, args->namelen) != 0) 618 continue; 619 if (!xfs_attr_namesp_match(args->flags, sfe->flags)) 620 continue; 621 break; 622 } 623 if (i == end) 624 return -ENOATTR; 625 626 /* 627 * Fix up the attribute fork data, covering the hole 628 */ 629 end = base + size; 630 totsize = be16_to_cpu(sf->hdr.totsize); 631 if (end != totsize) 632 memmove(&((char *)sf)[base], &((char *)sf)[end], totsize - end); 633 sf->hdr.count--; 634 be16_add_cpu(&sf->hdr.totsize, -size); 635 636 /* 637 * Fix up the start offset of the attribute fork 638 */ 639 totsize -= size; 640 if (totsize == sizeof(xfs_attr_sf_hdr_t) && 641 (mp->m_flags & XFS_MOUNT_ATTR2) && 642 (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && 643 !(args->op_flags & XFS_DA_OP_ADDNAME)) { 644 xfs_attr_fork_remove(dp, args->trans); 645 } else { 646 xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); 647 dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); 648 ASSERT(dp->i_d.di_forkoff); 649 ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || 650 (args->op_flags & XFS_DA_OP_ADDNAME) || 651 !(mp->m_flags & XFS_MOUNT_ATTR2) || 652 dp->i_d.di_format == XFS_DINODE_FMT_BTREE); 653 xfs_trans_log_inode(args->trans, dp, 654 XFS_ILOG_CORE | XFS_ILOG_ADATA); 655 } 656 657 xfs_sbversion_add_attr2(mp, args->trans); 658 659 return 0; 660 } 661 662 /* 663 * Look up a name in a shortform attribute list structure. 664 */ 665 /*ARGSUSED*/ 666 int 667 xfs_attr_shortform_lookup(xfs_da_args_t *args) 668 { 669 xfs_attr_shortform_t *sf; 670 xfs_attr_sf_entry_t *sfe; 671 int i; 672 xfs_ifork_t *ifp; 673 674 trace_xfs_attr_sf_lookup(args); 675 676 ifp = args->dp->i_afp; 677 ASSERT(ifp->if_flags & XFS_IFINLINE); 678 sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; 679 sfe = &sf->list[0]; 680 for (i = 0; i < sf->hdr.count; 681 sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { 682 if (sfe->namelen != args->namelen) 683 continue; 684 if (memcmp(args->name, sfe->nameval, args->namelen) != 0) 685 continue; 686 if (!xfs_attr_namesp_match(args->flags, sfe->flags)) 687 continue; 688 return -EEXIST; 689 } 690 return -ENOATTR; 691 } 692 693 /* 694 * Look up a name in a shortform attribute list structure. 695 */ 696 /*ARGSUSED*/ 697 int 698 xfs_attr_shortform_getvalue(xfs_da_args_t *args) 699 { 700 xfs_attr_shortform_t *sf; 701 xfs_attr_sf_entry_t *sfe; 702 int i; 703 704 ASSERT(args->dp->i_afp->if_flags == XFS_IFINLINE); 705 sf = (xfs_attr_shortform_t *)args->dp->i_afp->if_u1.if_data; 706 sfe = &sf->list[0]; 707 for (i = 0; i < sf->hdr.count; 708 sfe = XFS_ATTR_SF_NEXTENTRY(sfe), i++) { 709 if (sfe->namelen != args->namelen) 710 continue; 711 if (memcmp(args->name, sfe->nameval, args->namelen) != 0) 712 continue; 713 if (!xfs_attr_namesp_match(args->flags, sfe->flags)) 714 continue; 715 if (args->flags & ATTR_KERNOVAL) { 716 args->valuelen = sfe->valuelen; 717 return -EEXIST; 718 } 719 if (args->valuelen < sfe->valuelen) { 720 args->valuelen = sfe->valuelen; 721 return -ERANGE; 722 } 723 args->valuelen = sfe->valuelen; 724 memcpy(args->value, &sfe->nameval[args->namelen], 725 args->valuelen); 726 return -EEXIST; 727 } 728 return -ENOATTR; 729 } 730 731 /* 732 * Convert from using the shortform to the leaf. 733 */ 734 int 735 xfs_attr_shortform_to_leaf(xfs_da_args_t *args) 736 { 737 xfs_inode_t *dp; 738 xfs_attr_shortform_t *sf; 739 xfs_attr_sf_entry_t *sfe; 740 xfs_da_args_t nargs; 741 char *tmpbuffer; 742 int error, i, size; 743 xfs_dablk_t blkno; 744 struct xfs_buf *bp; 745 xfs_ifork_t *ifp; 746 747 trace_xfs_attr_sf_to_leaf(args); 748 749 dp = args->dp; 750 ifp = dp->i_afp; 751 sf = (xfs_attr_shortform_t *)ifp->if_u1.if_data; 752 size = be16_to_cpu(sf->hdr.totsize); 753 tmpbuffer = kmem_alloc(size, KM_SLEEP); 754 ASSERT(tmpbuffer != NULL); 755 memcpy(tmpbuffer, ifp->if_u1.if_data, size); 756 sf = (xfs_attr_shortform_t *)tmpbuffer; 757 758 xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); 759 xfs_bmap_local_to_extents_empty(dp, XFS_ATTR_FORK); 760 761 bp = NULL; 762 error = xfs_da_grow_inode(args, &blkno); 763 if (error) { 764 /* 765 * If we hit an IO error middle of the transaction inside 766 * grow_inode(), we may have inconsistent data. Bail out. 767 */ 768 if (error == -EIO) 769 goto out; 770 xfs_idata_realloc(dp, size, XFS_ATTR_FORK); /* try to put */ 771 memcpy(ifp->if_u1.if_data, tmpbuffer, size); /* it back */ 772 goto out; 773 } 774 775 ASSERT(blkno == 0); 776 error = xfs_attr3_leaf_create(args, blkno, &bp); 777 if (error) { 778 error = xfs_da_shrink_inode(args, 0, bp); 779 bp = NULL; 780 if (error) 781 goto out; 782 xfs_idata_realloc(dp, size, XFS_ATTR_FORK); /* try to put */ 783 memcpy(ifp->if_u1.if_data, tmpbuffer, size); /* it back */ 784 goto out; 785 } 786 787 memset((char *)&nargs, 0, sizeof(nargs)); 788 nargs.dp = dp; 789 nargs.geo = args->geo; 790 nargs.firstblock = args->firstblock; 791 nargs.flist = args->flist; 792 nargs.total = args->total; 793 nargs.whichfork = XFS_ATTR_FORK; 794 nargs.trans = args->trans; 795 nargs.op_flags = XFS_DA_OP_OKNOENT; 796 797 sfe = &sf->list[0]; 798 for (i = 0; i < sf->hdr.count; i++) { 799 nargs.name = sfe->nameval; 800 nargs.namelen = sfe->namelen; 801 nargs.value = &sfe->nameval[nargs.namelen]; 802 nargs.valuelen = sfe->valuelen; 803 nargs.hashval = xfs_da_hashname(sfe->nameval, 804 sfe->namelen); 805 nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(sfe->flags); 806 error = xfs_attr3_leaf_lookup_int(bp, &nargs); /* set a->index */ 807 ASSERT(error == -ENOATTR); 808 error = xfs_attr3_leaf_add(bp, &nargs); 809 ASSERT(error != -ENOSPC); 810 if (error) 811 goto out; 812 sfe = XFS_ATTR_SF_NEXTENTRY(sfe); 813 } 814 error = 0; 815 816 out: 817 kmem_free(tmpbuffer); 818 return error; 819 } 820 821 /* 822 * Check a leaf attribute block to see if all the entries would fit into 823 * a shortform attribute list. 824 */ 825 int 826 xfs_attr_shortform_allfit( 827 struct xfs_buf *bp, 828 struct xfs_inode *dp) 829 { 830 struct xfs_attr_leafblock *leaf; 831 struct xfs_attr_leaf_entry *entry; 832 xfs_attr_leaf_name_local_t *name_loc; 833 struct xfs_attr3_icleaf_hdr leafhdr; 834 int bytes; 835 int i; 836 struct xfs_mount *mp = bp->b_target->bt_mount; 837 838 leaf = bp->b_addr; 839 xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf); 840 entry = xfs_attr3_leaf_entryp(leaf); 841 842 bytes = sizeof(struct xfs_attr_sf_hdr); 843 for (i = 0; i < leafhdr.count; entry++, i++) { 844 if (entry->flags & XFS_ATTR_INCOMPLETE) 845 continue; /* don't copy partial entries */ 846 if (!(entry->flags & XFS_ATTR_LOCAL)) 847 return 0; 848 name_loc = xfs_attr3_leaf_name_local(leaf, i); 849 if (name_loc->namelen >= XFS_ATTR_SF_ENTSIZE_MAX) 850 return 0; 851 if (be16_to_cpu(name_loc->valuelen) >= XFS_ATTR_SF_ENTSIZE_MAX) 852 return 0; 853 bytes += sizeof(struct xfs_attr_sf_entry) - 1 854 + name_loc->namelen 855 + be16_to_cpu(name_loc->valuelen); 856 } 857 if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && 858 (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && 859 (bytes == sizeof(struct xfs_attr_sf_hdr))) 860 return -1; 861 return xfs_attr_shortform_bytesfit(dp, bytes); 862 } 863 864 /* 865 * Convert a leaf attribute list to shortform attribute list 866 */ 867 int 868 xfs_attr3_leaf_to_shortform( 869 struct xfs_buf *bp, 870 struct xfs_da_args *args, 871 int forkoff) 872 { 873 struct xfs_attr_leafblock *leaf; 874 struct xfs_attr3_icleaf_hdr ichdr; 875 struct xfs_attr_leaf_entry *entry; 876 struct xfs_attr_leaf_name_local *name_loc; 877 struct xfs_da_args nargs; 878 struct xfs_inode *dp = args->dp; 879 char *tmpbuffer; 880 int error; 881 int i; 882 883 trace_xfs_attr_leaf_to_sf(args); 884 885 tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); 886 if (!tmpbuffer) 887 return -ENOMEM; 888 889 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); 890 891 leaf = (xfs_attr_leafblock_t *)tmpbuffer; 892 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 893 entry = xfs_attr3_leaf_entryp(leaf); 894 895 /* XXX (dgc): buffer is about to be marked stale - why zero it? */ 896 memset(bp->b_addr, 0, args->geo->blksize); 897 898 /* 899 * Clean out the prior contents of the attribute list. 900 */ 901 error = xfs_da_shrink_inode(args, 0, bp); 902 if (error) 903 goto out; 904 905 if (forkoff == -1) { 906 ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); 907 ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE); 908 xfs_attr_fork_remove(dp, args->trans); 909 goto out; 910 } 911 912 xfs_attr_shortform_create(args); 913 914 /* 915 * Copy the attributes 916 */ 917 memset((char *)&nargs, 0, sizeof(nargs)); 918 nargs.geo = args->geo; 919 nargs.dp = dp; 920 nargs.firstblock = args->firstblock; 921 nargs.flist = args->flist; 922 nargs.total = args->total; 923 nargs.whichfork = XFS_ATTR_FORK; 924 nargs.trans = args->trans; 925 nargs.op_flags = XFS_DA_OP_OKNOENT; 926 927 for (i = 0; i < ichdr.count; entry++, i++) { 928 if (entry->flags & XFS_ATTR_INCOMPLETE) 929 continue; /* don't copy partial entries */ 930 if (!entry->nameidx) 931 continue; 932 ASSERT(entry->flags & XFS_ATTR_LOCAL); 933 name_loc = xfs_attr3_leaf_name_local(leaf, i); 934 nargs.name = name_loc->nameval; 935 nargs.namelen = name_loc->namelen; 936 nargs.value = &name_loc->nameval[nargs.namelen]; 937 nargs.valuelen = be16_to_cpu(name_loc->valuelen); 938 nargs.hashval = be32_to_cpu(entry->hashval); 939 nargs.flags = XFS_ATTR_NSP_ONDISK_TO_ARGS(entry->flags); 940 xfs_attr_shortform_add(&nargs, forkoff); 941 } 942 error = 0; 943 944 out: 945 kmem_free(tmpbuffer); 946 return error; 947 } 948 949 /* 950 * Convert from using a single leaf to a root node and a leaf. 951 */ 952 int 953 xfs_attr3_leaf_to_node( 954 struct xfs_da_args *args) 955 { 956 struct xfs_attr_leafblock *leaf; 957 struct xfs_attr3_icleaf_hdr icleafhdr; 958 struct xfs_attr_leaf_entry *entries; 959 struct xfs_da_node_entry *btree; 960 struct xfs_da3_icnode_hdr icnodehdr; 961 struct xfs_da_intnode *node; 962 struct xfs_inode *dp = args->dp; 963 struct xfs_mount *mp = dp->i_mount; 964 struct xfs_buf *bp1 = NULL; 965 struct xfs_buf *bp2 = NULL; 966 xfs_dablk_t blkno; 967 int error; 968 969 trace_xfs_attr_leaf_to_node(args); 970 971 error = xfs_da_grow_inode(args, &blkno); 972 if (error) 973 goto out; 974 error = xfs_attr3_leaf_read(args->trans, dp, 0, -1, &bp1); 975 if (error) 976 goto out; 977 978 error = xfs_da_get_buf(args->trans, dp, blkno, -1, &bp2, XFS_ATTR_FORK); 979 if (error) 980 goto out; 981 982 /* copy leaf to new buffer, update identifiers */ 983 xfs_trans_buf_set_type(args->trans, bp2, XFS_BLFT_ATTR_LEAF_BUF); 984 bp2->b_ops = bp1->b_ops; 985 memcpy(bp2->b_addr, bp1->b_addr, args->geo->blksize); 986 if (xfs_sb_version_hascrc(&mp->m_sb)) { 987 struct xfs_da3_blkinfo *hdr3 = bp2->b_addr; 988 hdr3->blkno = cpu_to_be64(bp2->b_bn); 989 } 990 xfs_trans_log_buf(args->trans, bp2, 0, args->geo->blksize - 1); 991 992 /* 993 * Set up the new root node. 994 */ 995 error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK); 996 if (error) 997 goto out; 998 node = bp1->b_addr; 999 dp->d_ops->node_hdr_from_disk(&icnodehdr, node); 1000 btree = dp->d_ops->node_tree_p(node); 1001 1002 leaf = bp2->b_addr; 1003 xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf); 1004 entries = xfs_attr3_leaf_entryp(leaf); 1005 1006 /* both on-disk, don't endian-flip twice */ 1007 btree[0].hashval = entries[icleafhdr.count - 1].hashval; 1008 btree[0].before = cpu_to_be32(blkno); 1009 icnodehdr.count = 1; 1010 dp->d_ops->node_hdr_to_disk(node, &icnodehdr); 1011 xfs_trans_log_buf(args->trans, bp1, 0, args->geo->blksize - 1); 1012 error = 0; 1013 out: 1014 return error; 1015 } 1016 1017 /*======================================================================== 1018 * Routines used for growing the Btree. 1019 *========================================================================*/ 1020 1021 /* 1022 * Create the initial contents of a leaf attribute list 1023 * or a leaf in a node attribute list. 1024 */ 1025 STATIC int 1026 xfs_attr3_leaf_create( 1027 struct xfs_da_args *args, 1028 xfs_dablk_t blkno, 1029 struct xfs_buf **bpp) 1030 { 1031 struct xfs_attr_leafblock *leaf; 1032 struct xfs_attr3_icleaf_hdr ichdr; 1033 struct xfs_inode *dp = args->dp; 1034 struct xfs_mount *mp = dp->i_mount; 1035 struct xfs_buf *bp; 1036 int error; 1037 1038 trace_xfs_attr_leaf_create(args); 1039 1040 error = xfs_da_get_buf(args->trans, args->dp, blkno, -1, &bp, 1041 XFS_ATTR_FORK); 1042 if (error) 1043 return error; 1044 bp->b_ops = &xfs_attr3_leaf_buf_ops; 1045 xfs_trans_buf_set_type(args->trans, bp, XFS_BLFT_ATTR_LEAF_BUF); 1046 leaf = bp->b_addr; 1047 memset(leaf, 0, args->geo->blksize); 1048 1049 memset(&ichdr, 0, sizeof(ichdr)); 1050 ichdr.firstused = args->geo->blksize; 1051 1052 if (xfs_sb_version_hascrc(&mp->m_sb)) { 1053 struct xfs_da3_blkinfo *hdr3 = bp->b_addr; 1054 1055 ichdr.magic = XFS_ATTR3_LEAF_MAGIC; 1056 1057 hdr3->blkno = cpu_to_be64(bp->b_bn); 1058 hdr3->owner = cpu_to_be64(dp->i_ino); 1059 uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid); 1060 1061 ichdr.freemap[0].base = sizeof(struct xfs_attr3_leaf_hdr); 1062 } else { 1063 ichdr.magic = XFS_ATTR_LEAF_MAGIC; 1064 ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); 1065 } 1066 ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; 1067 1068 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); 1069 xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); 1070 1071 *bpp = bp; 1072 return 0; 1073 } 1074 1075 /* 1076 * Split the leaf node, rebalance, then add the new entry. 1077 */ 1078 int 1079 xfs_attr3_leaf_split( 1080 struct xfs_da_state *state, 1081 struct xfs_da_state_blk *oldblk, 1082 struct xfs_da_state_blk *newblk) 1083 { 1084 xfs_dablk_t blkno; 1085 int error; 1086 1087 trace_xfs_attr_leaf_split(state->args); 1088 1089 /* 1090 * Allocate space for a new leaf node. 1091 */ 1092 ASSERT(oldblk->magic == XFS_ATTR_LEAF_MAGIC); 1093 error = xfs_da_grow_inode(state->args, &blkno); 1094 if (error) 1095 return error; 1096 error = xfs_attr3_leaf_create(state->args, blkno, &newblk->bp); 1097 if (error) 1098 return error; 1099 newblk->blkno = blkno; 1100 newblk->magic = XFS_ATTR_LEAF_MAGIC; 1101 1102 /* 1103 * Rebalance the entries across the two leaves. 1104 * NOTE: rebalance() currently depends on the 2nd block being empty. 1105 */ 1106 xfs_attr3_leaf_rebalance(state, oldblk, newblk); 1107 error = xfs_da3_blk_link(state, oldblk, newblk); 1108 if (error) 1109 return error; 1110 1111 /* 1112 * Save info on "old" attribute for "atomic rename" ops, leaf_add() 1113 * modifies the index/blkno/rmtblk/rmtblkcnt fields to show the 1114 * "new" attrs info. Will need the "old" info to remove it later. 1115 * 1116 * Insert the "new" entry in the correct block. 1117 */ 1118 if (state->inleaf) { 1119 trace_xfs_attr_leaf_add_old(state->args); 1120 error = xfs_attr3_leaf_add(oldblk->bp, state->args); 1121 } else { 1122 trace_xfs_attr_leaf_add_new(state->args); 1123 error = xfs_attr3_leaf_add(newblk->bp, state->args); 1124 } 1125 1126 /* 1127 * Update last hashval in each block since we added the name. 1128 */ 1129 oldblk->hashval = xfs_attr_leaf_lasthash(oldblk->bp, NULL); 1130 newblk->hashval = xfs_attr_leaf_lasthash(newblk->bp, NULL); 1131 return error; 1132 } 1133 1134 /* 1135 * Add a name to the leaf attribute list structure. 1136 */ 1137 int 1138 xfs_attr3_leaf_add( 1139 struct xfs_buf *bp, 1140 struct xfs_da_args *args) 1141 { 1142 struct xfs_attr_leafblock *leaf; 1143 struct xfs_attr3_icleaf_hdr ichdr; 1144 int tablesize; 1145 int entsize; 1146 int sum; 1147 int tmp; 1148 int i; 1149 1150 trace_xfs_attr_leaf_add(args); 1151 1152 leaf = bp->b_addr; 1153 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 1154 ASSERT(args->index >= 0 && args->index <= ichdr.count); 1155 entsize = xfs_attr_leaf_newentsize(args, NULL); 1156 1157 /* 1158 * Search through freemap for first-fit on new name length. 1159 * (may need to figure in size of entry struct too) 1160 */ 1161 tablesize = (ichdr.count + 1) * sizeof(xfs_attr_leaf_entry_t) 1162 + xfs_attr3_leaf_hdr_size(leaf); 1163 for (sum = 0, i = XFS_ATTR_LEAF_MAPSIZE - 1; i >= 0; i--) { 1164 if (tablesize > ichdr.firstused) { 1165 sum += ichdr.freemap[i].size; 1166 continue; 1167 } 1168 if (!ichdr.freemap[i].size) 1169 continue; /* no space in this map */ 1170 tmp = entsize; 1171 if (ichdr.freemap[i].base < ichdr.firstused) 1172 tmp += sizeof(xfs_attr_leaf_entry_t); 1173 if (ichdr.freemap[i].size >= tmp) { 1174 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, i); 1175 goto out_log_hdr; 1176 } 1177 sum += ichdr.freemap[i].size; 1178 } 1179 1180 /* 1181 * If there are no holes in the address space of the block, 1182 * and we don't have enough freespace, then compaction will do us 1183 * no good and we should just give up. 1184 */ 1185 if (!ichdr.holes && sum < entsize) 1186 return -ENOSPC; 1187 1188 /* 1189 * Compact the entries to coalesce free space. 1190 * This may change the hdr->count via dropping INCOMPLETE entries. 1191 */ 1192 xfs_attr3_leaf_compact(args, &ichdr, bp); 1193 1194 /* 1195 * After compaction, the block is guaranteed to have only one 1196 * free region, in freemap[0]. If it is not big enough, give up. 1197 */ 1198 if (ichdr.freemap[0].size < (entsize + sizeof(xfs_attr_leaf_entry_t))) { 1199 tmp = -ENOSPC; 1200 goto out_log_hdr; 1201 } 1202 1203 tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); 1204 1205 out_log_hdr: 1206 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); 1207 xfs_trans_log_buf(args->trans, bp, 1208 XFS_DA_LOGRANGE(leaf, &leaf->hdr, 1209 xfs_attr3_leaf_hdr_size(leaf))); 1210 return tmp; 1211 } 1212 1213 /* 1214 * Add a name to a leaf attribute list structure. 1215 */ 1216 STATIC int 1217 xfs_attr3_leaf_add_work( 1218 struct xfs_buf *bp, 1219 struct xfs_attr3_icleaf_hdr *ichdr, 1220 struct xfs_da_args *args, 1221 int mapindex) 1222 { 1223 struct xfs_attr_leafblock *leaf; 1224 struct xfs_attr_leaf_entry *entry; 1225 struct xfs_attr_leaf_name_local *name_loc; 1226 struct xfs_attr_leaf_name_remote *name_rmt; 1227 struct xfs_mount *mp; 1228 int tmp; 1229 int i; 1230 1231 trace_xfs_attr_leaf_add_work(args); 1232 1233 leaf = bp->b_addr; 1234 ASSERT(mapindex >= 0 && mapindex < XFS_ATTR_LEAF_MAPSIZE); 1235 ASSERT(args->index >= 0 && args->index <= ichdr->count); 1236 1237 /* 1238 * Force open some space in the entry array and fill it in. 1239 */ 1240 entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; 1241 if (args->index < ichdr->count) { 1242 tmp = ichdr->count - args->index; 1243 tmp *= sizeof(xfs_attr_leaf_entry_t); 1244 memmove(entry + 1, entry, tmp); 1245 xfs_trans_log_buf(args->trans, bp, 1246 XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(*entry))); 1247 } 1248 ichdr->count++; 1249 1250 /* 1251 * Allocate space for the new string (at the end of the run). 1252 */ 1253 mp = args->trans->t_mountp; 1254 ASSERT(ichdr->freemap[mapindex].base < args->geo->blksize); 1255 ASSERT((ichdr->freemap[mapindex].base & 0x3) == 0); 1256 ASSERT(ichdr->freemap[mapindex].size >= 1257 xfs_attr_leaf_newentsize(args, NULL)); 1258 ASSERT(ichdr->freemap[mapindex].size < args->geo->blksize); 1259 ASSERT((ichdr->freemap[mapindex].size & 0x3) == 0); 1260 1261 ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); 1262 1263 entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + 1264 ichdr->freemap[mapindex].size); 1265 entry->hashval = cpu_to_be32(args->hashval); 1266 entry->flags = tmp ? XFS_ATTR_LOCAL : 0; 1267 entry->flags |= XFS_ATTR_NSP_ARGS_TO_ONDISK(args->flags); 1268 if (args->op_flags & XFS_DA_OP_RENAME) { 1269 entry->flags |= XFS_ATTR_INCOMPLETE; 1270 if ((args->blkno2 == args->blkno) && 1271 (args->index2 <= args->index)) { 1272 args->index2++; 1273 } 1274 } 1275 xfs_trans_log_buf(args->trans, bp, 1276 XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); 1277 ASSERT((args->index == 0) || 1278 (be32_to_cpu(entry->hashval) >= be32_to_cpu((entry-1)->hashval))); 1279 ASSERT((args->index == ichdr->count - 1) || 1280 (be32_to_cpu(entry->hashval) <= be32_to_cpu((entry+1)->hashval))); 1281 1282 /* 1283 * For "remote" attribute values, simply note that we need to 1284 * allocate space for the "remote" value. We can't actually 1285 * allocate the extents in this transaction, and we can't decide 1286 * which blocks they should be as we might allocate more blocks 1287 * as part of this transaction (a split operation for example). 1288 */ 1289 if (entry->flags & XFS_ATTR_LOCAL) { 1290 name_loc = xfs_attr3_leaf_name_local(leaf, args->index); 1291 name_loc->namelen = args->namelen; 1292 name_loc->valuelen = cpu_to_be16(args->valuelen); 1293 memcpy((char *)name_loc->nameval, args->name, args->namelen); 1294 memcpy((char *)&name_loc->nameval[args->namelen], args->value, 1295 be16_to_cpu(name_loc->valuelen)); 1296 } else { 1297 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); 1298 name_rmt->namelen = args->namelen; 1299 memcpy((char *)name_rmt->name, args->name, args->namelen); 1300 entry->flags |= XFS_ATTR_INCOMPLETE; 1301 /* just in case */ 1302 name_rmt->valuelen = 0; 1303 name_rmt->valueblk = 0; 1304 args->rmtblkno = 1; 1305 args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); 1306 args->rmtvaluelen = args->valuelen; 1307 } 1308 xfs_trans_log_buf(args->trans, bp, 1309 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), 1310 xfs_attr_leaf_entsize(leaf, args->index))); 1311 1312 /* 1313 * Update the control info for this leaf node 1314 */ 1315 if (be16_to_cpu(entry->nameidx) < ichdr->firstused) 1316 ichdr->firstused = be16_to_cpu(entry->nameidx); 1317 1318 ASSERT(ichdr->firstused >= ichdr->count * sizeof(xfs_attr_leaf_entry_t) 1319 + xfs_attr3_leaf_hdr_size(leaf)); 1320 tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) 1321 + xfs_attr3_leaf_hdr_size(leaf); 1322 1323 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 1324 if (ichdr->freemap[i].base == tmp) { 1325 ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t); 1326 ichdr->freemap[i].size -= sizeof(xfs_attr_leaf_entry_t); 1327 } 1328 } 1329 ichdr->usedbytes += xfs_attr_leaf_entsize(leaf, args->index); 1330 return 0; 1331 } 1332 1333 /* 1334 * Garbage collect a leaf attribute list block by copying it to a new buffer. 1335 */ 1336 STATIC void 1337 xfs_attr3_leaf_compact( 1338 struct xfs_da_args *args, 1339 struct xfs_attr3_icleaf_hdr *ichdr_dst, 1340 struct xfs_buf *bp) 1341 { 1342 struct xfs_attr_leafblock *leaf_src; 1343 struct xfs_attr_leafblock *leaf_dst; 1344 struct xfs_attr3_icleaf_hdr ichdr_src; 1345 struct xfs_trans *trans = args->trans; 1346 char *tmpbuffer; 1347 1348 trace_xfs_attr_leaf_compact(args); 1349 1350 tmpbuffer = kmem_alloc(args->geo->blksize, KM_SLEEP); 1351 memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); 1352 memset(bp->b_addr, 0, args->geo->blksize); 1353 leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; 1354 leaf_dst = bp->b_addr; 1355 1356 /* 1357 * Copy the on-disk header back into the destination buffer to ensure 1358 * all the information in the header that is not part of the incore 1359 * header structure is preserved. 1360 */ 1361 memcpy(bp->b_addr, tmpbuffer, xfs_attr3_leaf_hdr_size(leaf_src)); 1362 1363 /* Initialise the incore headers */ 1364 ichdr_src = *ichdr_dst; /* struct copy */ 1365 ichdr_dst->firstused = args->geo->blksize; 1366 ichdr_dst->usedbytes = 0; 1367 ichdr_dst->count = 0; 1368 ichdr_dst->holes = 0; 1369 ichdr_dst->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_src); 1370 ichdr_dst->freemap[0].size = ichdr_dst->firstused - 1371 ichdr_dst->freemap[0].base; 1372 1373 /* write the header back to initialise the underlying buffer */ 1374 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst); 1375 1376 /* 1377 * Copy all entry's in the same (sorted) order, 1378 * but allocate name/value pairs packed and in sequence. 1379 */ 1380 xfs_attr3_leaf_moveents(args, leaf_src, &ichdr_src, 0, 1381 leaf_dst, ichdr_dst, 0, ichdr_src.count); 1382 /* 1383 * this logs the entire buffer, but the caller must write the header 1384 * back to the buffer when it is finished modifying it. 1385 */ 1386 xfs_trans_log_buf(trans, bp, 0, args->geo->blksize - 1); 1387 1388 kmem_free(tmpbuffer); 1389 } 1390 1391 /* 1392 * Compare two leaf blocks "order". 1393 * Return 0 unless leaf2 should go before leaf1. 1394 */ 1395 static int 1396 xfs_attr3_leaf_order( 1397 struct xfs_buf *leaf1_bp, 1398 struct xfs_attr3_icleaf_hdr *leaf1hdr, 1399 struct xfs_buf *leaf2_bp, 1400 struct xfs_attr3_icleaf_hdr *leaf2hdr) 1401 { 1402 struct xfs_attr_leaf_entry *entries1; 1403 struct xfs_attr_leaf_entry *entries2; 1404 1405 entries1 = xfs_attr3_leaf_entryp(leaf1_bp->b_addr); 1406 entries2 = xfs_attr3_leaf_entryp(leaf2_bp->b_addr); 1407 if (leaf1hdr->count > 0 && leaf2hdr->count > 0 && 1408 ((be32_to_cpu(entries2[0].hashval) < 1409 be32_to_cpu(entries1[0].hashval)) || 1410 (be32_to_cpu(entries2[leaf2hdr->count - 1].hashval) < 1411 be32_to_cpu(entries1[leaf1hdr->count - 1].hashval)))) { 1412 return 1; 1413 } 1414 return 0; 1415 } 1416 1417 int 1418 xfs_attr_leaf_order( 1419 struct xfs_buf *leaf1_bp, 1420 struct xfs_buf *leaf2_bp) 1421 { 1422 struct xfs_attr3_icleaf_hdr ichdr1; 1423 struct xfs_attr3_icleaf_hdr ichdr2; 1424 struct xfs_mount *mp = leaf1_bp->b_target->bt_mount; 1425 1426 xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr1, leaf1_bp->b_addr); 1427 xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr2, leaf2_bp->b_addr); 1428 return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2); 1429 } 1430 1431 /* 1432 * Redistribute the attribute list entries between two leaf nodes, 1433 * taking into account the size of the new entry. 1434 * 1435 * NOTE: if new block is empty, then it will get the upper half of the 1436 * old block. At present, all (one) callers pass in an empty second block. 1437 * 1438 * This code adjusts the args->index/blkno and args->index2/blkno2 fields 1439 * to match what it is doing in splitting the attribute leaf block. Those 1440 * values are used in "atomic rename" operations on attributes. Note that 1441 * the "new" and "old" values can end up in different blocks. 1442 */ 1443 STATIC void 1444 xfs_attr3_leaf_rebalance( 1445 struct xfs_da_state *state, 1446 struct xfs_da_state_blk *blk1, 1447 struct xfs_da_state_blk *blk2) 1448 { 1449 struct xfs_da_args *args; 1450 struct xfs_attr_leafblock *leaf1; 1451 struct xfs_attr_leafblock *leaf2; 1452 struct xfs_attr3_icleaf_hdr ichdr1; 1453 struct xfs_attr3_icleaf_hdr ichdr2; 1454 struct xfs_attr_leaf_entry *entries1; 1455 struct xfs_attr_leaf_entry *entries2; 1456 int count; 1457 int totallen; 1458 int max; 1459 int space; 1460 int swap; 1461 1462 /* 1463 * Set up environment. 1464 */ 1465 ASSERT(blk1->magic == XFS_ATTR_LEAF_MAGIC); 1466 ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC); 1467 leaf1 = blk1->bp->b_addr; 1468 leaf2 = blk2->bp->b_addr; 1469 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1); 1470 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2); 1471 ASSERT(ichdr2.count == 0); 1472 args = state->args; 1473 1474 trace_xfs_attr_leaf_rebalance(args); 1475 1476 /* 1477 * Check ordering of blocks, reverse if it makes things simpler. 1478 * 1479 * NOTE: Given that all (current) callers pass in an empty 1480 * second block, this code should never set "swap". 1481 */ 1482 swap = 0; 1483 if (xfs_attr3_leaf_order(blk1->bp, &ichdr1, blk2->bp, &ichdr2)) { 1484 struct xfs_da_state_blk *tmp_blk; 1485 struct xfs_attr3_icleaf_hdr tmp_ichdr; 1486 1487 tmp_blk = blk1; 1488 blk1 = blk2; 1489 blk2 = tmp_blk; 1490 1491 /* struct copies to swap them rather than reconverting */ 1492 tmp_ichdr = ichdr1; 1493 ichdr1 = ichdr2; 1494 ichdr2 = tmp_ichdr; 1495 1496 leaf1 = blk1->bp->b_addr; 1497 leaf2 = blk2->bp->b_addr; 1498 swap = 1; 1499 } 1500 1501 /* 1502 * Examine entries until we reduce the absolute difference in 1503 * byte usage between the two blocks to a minimum. Then get 1504 * the direction to copy and the number of elements to move. 1505 * 1506 * "inleaf" is true if the new entry should be inserted into blk1. 1507 * If "swap" is also true, then reverse the sense of "inleaf". 1508 */ 1509 state->inleaf = xfs_attr3_leaf_figure_balance(state, blk1, &ichdr1, 1510 blk2, &ichdr2, 1511 &count, &totallen); 1512 if (swap) 1513 state->inleaf = !state->inleaf; 1514 1515 /* 1516 * Move any entries required from leaf to leaf: 1517 */ 1518 if (count < ichdr1.count) { 1519 /* 1520 * Figure the total bytes to be added to the destination leaf. 1521 */ 1522 /* number entries being moved */ 1523 count = ichdr1.count - count; 1524 space = ichdr1.usedbytes - totallen; 1525 space += count * sizeof(xfs_attr_leaf_entry_t); 1526 1527 /* 1528 * leaf2 is the destination, compact it if it looks tight. 1529 */ 1530 max = ichdr2.firstused - xfs_attr3_leaf_hdr_size(leaf1); 1531 max -= ichdr2.count * sizeof(xfs_attr_leaf_entry_t); 1532 if (space > max) 1533 xfs_attr3_leaf_compact(args, &ichdr2, blk2->bp); 1534 1535 /* 1536 * Move high entries from leaf1 to low end of leaf2. 1537 */ 1538 xfs_attr3_leaf_moveents(args, leaf1, &ichdr1, 1539 ichdr1.count - count, leaf2, &ichdr2, 0, count); 1540 1541 } else if (count > ichdr1.count) { 1542 /* 1543 * I assert that since all callers pass in an empty 1544 * second buffer, this code should never execute. 1545 */ 1546 ASSERT(0); 1547 1548 /* 1549 * Figure the total bytes to be added to the destination leaf. 1550 */ 1551 /* number entries being moved */ 1552 count -= ichdr1.count; 1553 space = totallen - ichdr1.usedbytes; 1554 space += count * sizeof(xfs_attr_leaf_entry_t); 1555 1556 /* 1557 * leaf1 is the destination, compact it if it looks tight. 1558 */ 1559 max = ichdr1.firstused - xfs_attr3_leaf_hdr_size(leaf1); 1560 max -= ichdr1.count * sizeof(xfs_attr_leaf_entry_t); 1561 if (space > max) 1562 xfs_attr3_leaf_compact(args, &ichdr1, blk1->bp); 1563 1564 /* 1565 * Move low entries from leaf2 to high end of leaf1. 1566 */ 1567 xfs_attr3_leaf_moveents(args, leaf2, &ichdr2, 0, leaf1, &ichdr1, 1568 ichdr1.count, count); 1569 } 1570 1571 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1); 1572 xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2); 1573 xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1); 1574 xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1); 1575 1576 /* 1577 * Copy out last hashval in each block for B-tree code. 1578 */ 1579 entries1 = xfs_attr3_leaf_entryp(leaf1); 1580 entries2 = xfs_attr3_leaf_entryp(leaf2); 1581 blk1->hashval = be32_to_cpu(entries1[ichdr1.count - 1].hashval); 1582 blk2->hashval = be32_to_cpu(entries2[ichdr2.count - 1].hashval); 1583 1584 /* 1585 * Adjust the expected index for insertion. 1586 * NOTE: this code depends on the (current) situation that the 1587 * second block was originally empty. 1588 * 1589 * If the insertion point moved to the 2nd block, we must adjust 1590 * the index. We must also track the entry just following the 1591 * new entry for use in an "atomic rename" operation, that entry 1592 * is always the "old" entry and the "new" entry is what we are 1593 * inserting. The index/blkno fields refer to the "old" entry, 1594 * while the index2/blkno2 fields refer to the "new" entry. 1595 */ 1596 if (blk1->index > ichdr1.count) { 1597 ASSERT(state->inleaf == 0); 1598 blk2->index = blk1->index - ichdr1.count; 1599 args->index = args->index2 = blk2->index; 1600 args->blkno = args->blkno2 = blk2->blkno; 1601 } else if (blk1->index == ichdr1.count) { 1602 if (state->inleaf) { 1603 args->index = blk1->index; 1604 args->blkno = blk1->blkno; 1605 args->index2 = 0; 1606 args->blkno2 = blk2->blkno; 1607 } else { 1608 /* 1609 * On a double leaf split, the original attr location 1610 * is already stored in blkno2/index2, so don't 1611 * overwrite it overwise we corrupt the tree. 1612 */ 1613 blk2->index = blk1->index - ichdr1.count; 1614 args->index = blk2->index; 1615 args->blkno = blk2->blkno; 1616 if (!state->extravalid) { 1617 /* 1618 * set the new attr location to match the old 1619 * one and let the higher level split code 1620 * decide where in the leaf to place it. 1621 */ 1622 args->index2 = blk2->index; 1623 args->blkno2 = blk2->blkno; 1624 } 1625 } 1626 } else { 1627 ASSERT(state->inleaf == 1); 1628 args->index = args->index2 = blk1->index; 1629 args->blkno = args->blkno2 = blk1->blkno; 1630 } 1631 } 1632 1633 /* 1634 * Examine entries until we reduce the absolute difference in 1635 * byte usage between the two blocks to a minimum. 1636 * GROT: Is this really necessary? With other than a 512 byte blocksize, 1637 * GROT: there will always be enough room in either block for a new entry. 1638 * GROT: Do a double-split for this case? 1639 */ 1640 STATIC int 1641 xfs_attr3_leaf_figure_balance( 1642 struct xfs_da_state *state, 1643 struct xfs_da_state_blk *blk1, 1644 struct xfs_attr3_icleaf_hdr *ichdr1, 1645 struct xfs_da_state_blk *blk2, 1646 struct xfs_attr3_icleaf_hdr *ichdr2, 1647 int *countarg, 1648 int *usedbytesarg) 1649 { 1650 struct xfs_attr_leafblock *leaf1 = blk1->bp->b_addr; 1651 struct xfs_attr_leafblock *leaf2 = blk2->bp->b_addr; 1652 struct xfs_attr_leaf_entry *entry; 1653 int count; 1654 int max; 1655 int index; 1656 int totallen = 0; 1657 int half; 1658 int lastdelta; 1659 int foundit = 0; 1660 int tmp; 1661 1662 /* 1663 * Examine entries until we reduce the absolute difference in 1664 * byte usage between the two blocks to a minimum. 1665 */ 1666 max = ichdr1->count + ichdr2->count; 1667 half = (max + 1) * sizeof(*entry); 1668 half += ichdr1->usedbytes + ichdr2->usedbytes + 1669 xfs_attr_leaf_newentsize(state->args, NULL); 1670 half /= 2; 1671 lastdelta = state->args->geo->blksize; 1672 entry = xfs_attr3_leaf_entryp(leaf1); 1673 for (count = index = 0; count < max; entry++, index++, count++) { 1674 1675 #define XFS_ATTR_ABS(A) (((A) < 0) ? -(A) : (A)) 1676 /* 1677 * The new entry is in the first block, account for it. 1678 */ 1679 if (count == blk1->index) { 1680 tmp = totallen + sizeof(*entry) + 1681 xfs_attr_leaf_newentsize(state->args, NULL); 1682 if (XFS_ATTR_ABS(half - tmp) > lastdelta) 1683 break; 1684 lastdelta = XFS_ATTR_ABS(half - tmp); 1685 totallen = tmp; 1686 foundit = 1; 1687 } 1688 1689 /* 1690 * Wrap around into the second block if necessary. 1691 */ 1692 if (count == ichdr1->count) { 1693 leaf1 = leaf2; 1694 entry = xfs_attr3_leaf_entryp(leaf1); 1695 index = 0; 1696 } 1697 1698 /* 1699 * Figure out if next leaf entry would be too much. 1700 */ 1701 tmp = totallen + sizeof(*entry) + xfs_attr_leaf_entsize(leaf1, 1702 index); 1703 if (XFS_ATTR_ABS(half - tmp) > lastdelta) 1704 break; 1705 lastdelta = XFS_ATTR_ABS(half - tmp); 1706 totallen = tmp; 1707 #undef XFS_ATTR_ABS 1708 } 1709 1710 /* 1711 * Calculate the number of usedbytes that will end up in lower block. 1712 * If new entry not in lower block, fix up the count. 1713 */ 1714 totallen -= count * sizeof(*entry); 1715 if (foundit) { 1716 totallen -= sizeof(*entry) + 1717 xfs_attr_leaf_newentsize(state->args, NULL); 1718 } 1719 1720 *countarg = count; 1721 *usedbytesarg = totallen; 1722 return foundit; 1723 } 1724 1725 /*======================================================================== 1726 * Routines used for shrinking the Btree. 1727 *========================================================================*/ 1728 1729 /* 1730 * Check a leaf block and its neighbors to see if the block should be 1731 * collapsed into one or the other neighbor. Always keep the block 1732 * with the smaller block number. 1733 * If the current block is over 50% full, don't try to join it, return 0. 1734 * If the block is empty, fill in the state structure and return 2. 1735 * If it can be collapsed, fill in the state structure and return 1. 1736 * If nothing can be done, return 0. 1737 * 1738 * GROT: allow for INCOMPLETE entries in calculation. 1739 */ 1740 int 1741 xfs_attr3_leaf_toosmall( 1742 struct xfs_da_state *state, 1743 int *action) 1744 { 1745 struct xfs_attr_leafblock *leaf; 1746 struct xfs_da_state_blk *blk; 1747 struct xfs_attr3_icleaf_hdr ichdr; 1748 struct xfs_buf *bp; 1749 xfs_dablk_t blkno; 1750 int bytes; 1751 int forward; 1752 int error; 1753 int retval; 1754 int i; 1755 1756 trace_xfs_attr_leaf_toosmall(state->args); 1757 1758 /* 1759 * Check for the degenerate case of the block being over 50% full. 1760 * If so, it's not worth even looking to see if we might be able 1761 * to coalesce with a sibling. 1762 */ 1763 blk = &state->path.blk[ state->path.active-1 ]; 1764 leaf = blk->bp->b_addr; 1765 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf); 1766 bytes = xfs_attr3_leaf_hdr_size(leaf) + 1767 ichdr.count * sizeof(xfs_attr_leaf_entry_t) + 1768 ichdr.usedbytes; 1769 if (bytes > (state->args->geo->blksize >> 1)) { 1770 *action = 0; /* blk over 50%, don't try to join */ 1771 return 0; 1772 } 1773 1774 /* 1775 * Check for the degenerate case of the block being empty. 1776 * If the block is empty, we'll simply delete it, no need to 1777 * coalesce it with a sibling block. We choose (arbitrarily) 1778 * to merge with the forward block unless it is NULL. 1779 */ 1780 if (ichdr.count == 0) { 1781 /* 1782 * Make altpath point to the block we want to keep and 1783 * path point to the block we want to drop (this one). 1784 */ 1785 forward = (ichdr.forw != 0); 1786 memcpy(&state->altpath, &state->path, sizeof(state->path)); 1787 error = xfs_da3_path_shift(state, &state->altpath, forward, 1788 0, &retval); 1789 if (error) 1790 return error; 1791 if (retval) { 1792 *action = 0; 1793 } else { 1794 *action = 2; 1795 } 1796 return 0; 1797 } 1798 1799 /* 1800 * Examine each sibling block to see if we can coalesce with 1801 * at least 25% free space to spare. We need to figure out 1802 * whether to merge with the forward or the backward block. 1803 * We prefer coalescing with the lower numbered sibling so as 1804 * to shrink an attribute list over time. 1805 */ 1806 /* start with smaller blk num */ 1807 forward = ichdr.forw < ichdr.back; 1808 for (i = 0; i < 2; forward = !forward, i++) { 1809 struct xfs_attr3_icleaf_hdr ichdr2; 1810 if (forward) 1811 blkno = ichdr.forw; 1812 else 1813 blkno = ichdr.back; 1814 if (blkno == 0) 1815 continue; 1816 error = xfs_attr3_leaf_read(state->args->trans, state->args->dp, 1817 blkno, -1, &bp); 1818 if (error) 1819 return error; 1820 1821 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr); 1822 1823 bytes = state->args->geo->blksize - 1824 (state->args->geo->blksize >> 2) - 1825 ichdr.usedbytes - ichdr2.usedbytes - 1826 ((ichdr.count + ichdr2.count) * 1827 sizeof(xfs_attr_leaf_entry_t)) - 1828 xfs_attr3_leaf_hdr_size(leaf); 1829 1830 xfs_trans_brelse(state->args->trans, bp); 1831 if (bytes >= 0) 1832 break; /* fits with at least 25% to spare */ 1833 } 1834 if (i >= 2) { 1835 *action = 0; 1836 return 0; 1837 } 1838 1839 /* 1840 * Make altpath point to the block we want to keep (the lower 1841 * numbered block) and path point to the block we want to drop. 1842 */ 1843 memcpy(&state->altpath, &state->path, sizeof(state->path)); 1844 if (blkno < blk->blkno) { 1845 error = xfs_da3_path_shift(state, &state->altpath, forward, 1846 0, &retval); 1847 } else { 1848 error = xfs_da3_path_shift(state, &state->path, forward, 1849 0, &retval); 1850 } 1851 if (error) 1852 return error; 1853 if (retval) { 1854 *action = 0; 1855 } else { 1856 *action = 1; 1857 } 1858 return 0; 1859 } 1860 1861 /* 1862 * Remove a name from the leaf attribute list structure. 1863 * 1864 * Return 1 if leaf is less than 37% full, 0 if >= 37% full. 1865 * If two leaves are 37% full, when combined they will leave 25% free. 1866 */ 1867 int 1868 xfs_attr3_leaf_remove( 1869 struct xfs_buf *bp, 1870 struct xfs_da_args *args) 1871 { 1872 struct xfs_attr_leafblock *leaf; 1873 struct xfs_attr3_icleaf_hdr ichdr; 1874 struct xfs_attr_leaf_entry *entry; 1875 int before; 1876 int after; 1877 int smallest; 1878 int entsize; 1879 int tablesize; 1880 int tmp; 1881 int i; 1882 1883 trace_xfs_attr_leaf_remove(args); 1884 1885 leaf = bp->b_addr; 1886 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 1887 1888 ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); 1889 ASSERT(args->index >= 0 && args->index < ichdr.count); 1890 ASSERT(ichdr.firstused >= ichdr.count * sizeof(*entry) + 1891 xfs_attr3_leaf_hdr_size(leaf)); 1892 1893 entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; 1894 1895 ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); 1896 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); 1897 1898 /* 1899 * Scan through free region table: 1900 * check for adjacency of free'd entry with an existing one, 1901 * find smallest free region in case we need to replace it, 1902 * adjust any map that borders the entry table, 1903 */ 1904 tablesize = ichdr.count * sizeof(xfs_attr_leaf_entry_t) 1905 + xfs_attr3_leaf_hdr_size(leaf); 1906 tmp = ichdr.freemap[0].size; 1907 before = after = -1; 1908 smallest = XFS_ATTR_LEAF_MAPSIZE - 1; 1909 entsize = xfs_attr_leaf_entsize(leaf, args->index); 1910 for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { 1911 ASSERT(ichdr.freemap[i].base < args->geo->blksize); 1912 ASSERT(ichdr.freemap[i].size < args->geo->blksize); 1913 if (ichdr.freemap[i].base == tablesize) { 1914 ichdr.freemap[i].base -= sizeof(xfs_attr_leaf_entry_t); 1915 ichdr.freemap[i].size += sizeof(xfs_attr_leaf_entry_t); 1916 } 1917 1918 if (ichdr.freemap[i].base + ichdr.freemap[i].size == 1919 be16_to_cpu(entry->nameidx)) { 1920 before = i; 1921 } else if (ichdr.freemap[i].base == 1922 (be16_to_cpu(entry->nameidx) + entsize)) { 1923 after = i; 1924 } else if (ichdr.freemap[i].size < tmp) { 1925 tmp = ichdr.freemap[i].size; 1926 smallest = i; 1927 } 1928 } 1929 1930 /* 1931 * Coalesce adjacent freemap regions, 1932 * or replace the smallest region. 1933 */ 1934 if ((before >= 0) || (after >= 0)) { 1935 if ((before >= 0) && (after >= 0)) { 1936 ichdr.freemap[before].size += entsize; 1937 ichdr.freemap[before].size += ichdr.freemap[after].size; 1938 ichdr.freemap[after].base = 0; 1939 ichdr.freemap[after].size = 0; 1940 } else if (before >= 0) { 1941 ichdr.freemap[before].size += entsize; 1942 } else { 1943 ichdr.freemap[after].base = be16_to_cpu(entry->nameidx); 1944 ichdr.freemap[after].size += entsize; 1945 } 1946 } else { 1947 /* 1948 * Replace smallest region (if it is smaller than free'd entry) 1949 */ 1950 if (ichdr.freemap[smallest].size < entsize) { 1951 ichdr.freemap[smallest].base = be16_to_cpu(entry->nameidx); 1952 ichdr.freemap[smallest].size = entsize; 1953 } 1954 } 1955 1956 /* 1957 * Did we remove the first entry? 1958 */ 1959 if (be16_to_cpu(entry->nameidx) == ichdr.firstused) 1960 smallest = 1; 1961 else 1962 smallest = 0; 1963 1964 /* 1965 * Compress the remaining entries and zero out the removed stuff. 1966 */ 1967 memset(xfs_attr3_leaf_name(leaf, args->index), 0, entsize); 1968 ichdr.usedbytes -= entsize; 1969 xfs_trans_log_buf(args->trans, bp, 1970 XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), 1971 entsize)); 1972 1973 tmp = (ichdr.count - args->index) * sizeof(xfs_attr_leaf_entry_t); 1974 memmove(entry, entry + 1, tmp); 1975 ichdr.count--; 1976 xfs_trans_log_buf(args->trans, bp, 1977 XFS_DA_LOGRANGE(leaf, entry, tmp + sizeof(xfs_attr_leaf_entry_t))); 1978 1979 entry = &xfs_attr3_leaf_entryp(leaf)[ichdr.count]; 1980 memset(entry, 0, sizeof(xfs_attr_leaf_entry_t)); 1981 1982 /* 1983 * If we removed the first entry, re-find the first used byte 1984 * in the name area. Note that if the entry was the "firstused", 1985 * then we don't have a "hole" in our block resulting from 1986 * removing the name. 1987 */ 1988 if (smallest) { 1989 tmp = args->geo->blksize; 1990 entry = xfs_attr3_leaf_entryp(leaf); 1991 for (i = ichdr.count - 1; i >= 0; entry++, i--) { 1992 ASSERT(be16_to_cpu(entry->nameidx) >= ichdr.firstused); 1993 ASSERT(be16_to_cpu(entry->nameidx) < args->geo->blksize); 1994 1995 if (be16_to_cpu(entry->nameidx) < tmp) 1996 tmp = be16_to_cpu(entry->nameidx); 1997 } 1998 ichdr.firstused = tmp; 1999 ASSERT(ichdr.firstused != 0); 2000 } else { 2001 ichdr.holes = 1; /* mark as needing compaction */ 2002 } 2003 xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); 2004 xfs_trans_log_buf(args->trans, bp, 2005 XFS_DA_LOGRANGE(leaf, &leaf->hdr, 2006 xfs_attr3_leaf_hdr_size(leaf))); 2007 2008 /* 2009 * Check if leaf is less than 50% full, caller may want to 2010 * "join" the leaf with a sibling if so. 2011 */ 2012 tmp = ichdr.usedbytes + xfs_attr3_leaf_hdr_size(leaf) + 2013 ichdr.count * sizeof(xfs_attr_leaf_entry_t); 2014 2015 return tmp < args->geo->magicpct; /* leaf is < 37% full */ 2016 } 2017 2018 /* 2019 * Move all the attribute list entries from drop_leaf into save_leaf. 2020 */ 2021 void 2022 xfs_attr3_leaf_unbalance( 2023 struct xfs_da_state *state, 2024 struct xfs_da_state_blk *drop_blk, 2025 struct xfs_da_state_blk *save_blk) 2026 { 2027 struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr; 2028 struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr; 2029 struct xfs_attr3_icleaf_hdr drophdr; 2030 struct xfs_attr3_icleaf_hdr savehdr; 2031 struct xfs_attr_leaf_entry *entry; 2032 2033 trace_xfs_attr_leaf_unbalance(state->args); 2034 2035 drop_leaf = drop_blk->bp->b_addr; 2036 save_leaf = save_blk->bp->b_addr; 2037 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf); 2038 xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf); 2039 entry = xfs_attr3_leaf_entryp(drop_leaf); 2040 2041 /* 2042 * Save last hashval from dying block for later Btree fixup. 2043 */ 2044 drop_blk->hashval = be32_to_cpu(entry[drophdr.count - 1].hashval); 2045 2046 /* 2047 * Check if we need a temp buffer, or can we do it in place. 2048 * Note that we don't check "leaf" for holes because we will 2049 * always be dropping it, toosmall() decided that for us already. 2050 */ 2051 if (savehdr.holes == 0) { 2052 /* 2053 * dest leaf has no holes, so we add there. May need 2054 * to make some room in the entry array. 2055 */ 2056 if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, 2057 drop_blk->bp, &drophdr)) { 2058 xfs_attr3_leaf_moveents(state->args, 2059 drop_leaf, &drophdr, 0, 2060 save_leaf, &savehdr, 0, 2061 drophdr.count); 2062 } else { 2063 xfs_attr3_leaf_moveents(state->args, 2064 drop_leaf, &drophdr, 0, 2065 save_leaf, &savehdr, 2066 savehdr.count, drophdr.count); 2067 } 2068 } else { 2069 /* 2070 * Destination has holes, so we make a temporary copy 2071 * of the leaf and add them both to that. 2072 */ 2073 struct xfs_attr_leafblock *tmp_leaf; 2074 struct xfs_attr3_icleaf_hdr tmphdr; 2075 2076 tmp_leaf = kmem_zalloc(state->args->geo->blksize, KM_SLEEP); 2077 2078 /* 2079 * Copy the header into the temp leaf so that all the stuff 2080 * not in the incore header is present and gets copied back in 2081 * once we've moved all the entries. 2082 */ 2083 memcpy(tmp_leaf, save_leaf, xfs_attr3_leaf_hdr_size(save_leaf)); 2084 2085 memset(&tmphdr, 0, sizeof(tmphdr)); 2086 tmphdr.magic = savehdr.magic; 2087 tmphdr.forw = savehdr.forw; 2088 tmphdr.back = savehdr.back; 2089 tmphdr.firstused = state->args->geo->blksize; 2090 2091 /* write the header to the temp buffer to initialise it */ 2092 xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr); 2093 2094 if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, 2095 drop_blk->bp, &drophdr)) { 2096 xfs_attr3_leaf_moveents(state->args, 2097 drop_leaf, &drophdr, 0, 2098 tmp_leaf, &tmphdr, 0, 2099 drophdr.count); 2100 xfs_attr3_leaf_moveents(state->args, 2101 save_leaf, &savehdr, 0, 2102 tmp_leaf, &tmphdr, tmphdr.count, 2103 savehdr.count); 2104 } else { 2105 xfs_attr3_leaf_moveents(state->args, 2106 save_leaf, &savehdr, 0, 2107 tmp_leaf, &tmphdr, 0, 2108 savehdr.count); 2109 xfs_attr3_leaf_moveents(state->args, 2110 drop_leaf, &drophdr, 0, 2111 tmp_leaf, &tmphdr, tmphdr.count, 2112 drophdr.count); 2113 } 2114 memcpy(save_leaf, tmp_leaf, state->args->geo->blksize); 2115 savehdr = tmphdr; /* struct copy */ 2116 kmem_free(tmp_leaf); 2117 } 2118 2119 xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr); 2120 xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, 2121 state->args->geo->blksize - 1); 2122 2123 /* 2124 * Copy out last hashval in each block for B-tree code. 2125 */ 2126 entry = xfs_attr3_leaf_entryp(save_leaf); 2127 save_blk->hashval = be32_to_cpu(entry[savehdr.count - 1].hashval); 2128 } 2129 2130 /*======================================================================== 2131 * Routines used for finding things in the Btree. 2132 *========================================================================*/ 2133 2134 /* 2135 * Look up a name in a leaf attribute list structure. 2136 * This is the internal routine, it uses the caller's buffer. 2137 * 2138 * Note that duplicate keys are allowed, but only check within the 2139 * current leaf node. The Btree code must check in adjacent leaf nodes. 2140 * 2141 * Return in args->index the index into the entry[] array of either 2142 * the found entry, or where the entry should have been (insert before 2143 * that entry). 2144 * 2145 * Don't change the args->value unless we find the attribute. 2146 */ 2147 int 2148 xfs_attr3_leaf_lookup_int( 2149 struct xfs_buf *bp, 2150 struct xfs_da_args *args) 2151 { 2152 struct xfs_attr_leafblock *leaf; 2153 struct xfs_attr3_icleaf_hdr ichdr; 2154 struct xfs_attr_leaf_entry *entry; 2155 struct xfs_attr_leaf_entry *entries; 2156 struct xfs_attr_leaf_name_local *name_loc; 2157 struct xfs_attr_leaf_name_remote *name_rmt; 2158 xfs_dahash_t hashval; 2159 int probe; 2160 int span; 2161 2162 trace_xfs_attr_leaf_lookup(args); 2163 2164 leaf = bp->b_addr; 2165 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 2166 entries = xfs_attr3_leaf_entryp(leaf); 2167 ASSERT(ichdr.count < args->geo->blksize / 8); 2168 2169 /* 2170 * Binary search. (note: small blocks will skip this loop) 2171 */ 2172 hashval = args->hashval; 2173 probe = span = ichdr.count / 2; 2174 for (entry = &entries[probe]; span > 4; entry = &entries[probe]) { 2175 span /= 2; 2176 if (be32_to_cpu(entry->hashval) < hashval) 2177 probe += span; 2178 else if (be32_to_cpu(entry->hashval) > hashval) 2179 probe -= span; 2180 else 2181 break; 2182 } 2183 ASSERT(probe >= 0 && (!ichdr.count || probe < ichdr.count)); 2184 ASSERT(span <= 4 || be32_to_cpu(entry->hashval) == hashval); 2185 2186 /* 2187 * Since we may have duplicate hashval's, find the first matching 2188 * hashval in the leaf. 2189 */ 2190 while (probe > 0 && be32_to_cpu(entry->hashval) >= hashval) { 2191 entry--; 2192 probe--; 2193 } 2194 while (probe < ichdr.count && 2195 be32_to_cpu(entry->hashval) < hashval) { 2196 entry++; 2197 probe++; 2198 } 2199 if (probe == ichdr.count || be32_to_cpu(entry->hashval) != hashval) { 2200 args->index = probe; 2201 return -ENOATTR; 2202 } 2203 2204 /* 2205 * Duplicate keys may be present, so search all of them for a match. 2206 */ 2207 for (; probe < ichdr.count && (be32_to_cpu(entry->hashval) == hashval); 2208 entry++, probe++) { 2209 /* 2210 * GROT: Add code to remove incomplete entries. 2211 */ 2212 /* 2213 * If we are looking for INCOMPLETE entries, show only those. 2214 * If we are looking for complete entries, show only those. 2215 */ 2216 if ((args->flags & XFS_ATTR_INCOMPLETE) != 2217 (entry->flags & XFS_ATTR_INCOMPLETE)) { 2218 continue; 2219 } 2220 if (entry->flags & XFS_ATTR_LOCAL) { 2221 name_loc = xfs_attr3_leaf_name_local(leaf, probe); 2222 if (name_loc->namelen != args->namelen) 2223 continue; 2224 if (memcmp(args->name, name_loc->nameval, 2225 args->namelen) != 0) 2226 continue; 2227 if (!xfs_attr_namesp_match(args->flags, entry->flags)) 2228 continue; 2229 args->index = probe; 2230 return -EEXIST; 2231 } else { 2232 name_rmt = xfs_attr3_leaf_name_remote(leaf, probe); 2233 if (name_rmt->namelen != args->namelen) 2234 continue; 2235 if (memcmp(args->name, name_rmt->name, 2236 args->namelen) != 0) 2237 continue; 2238 if (!xfs_attr_namesp_match(args->flags, entry->flags)) 2239 continue; 2240 args->index = probe; 2241 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); 2242 args->rmtblkno = be32_to_cpu(name_rmt->valueblk); 2243 args->rmtblkcnt = xfs_attr3_rmt_blocks( 2244 args->dp->i_mount, 2245 args->rmtvaluelen); 2246 return -EEXIST; 2247 } 2248 } 2249 args->index = probe; 2250 return -ENOATTR; 2251 } 2252 2253 /* 2254 * Get the value associated with an attribute name from a leaf attribute 2255 * list structure. 2256 */ 2257 int 2258 xfs_attr3_leaf_getvalue( 2259 struct xfs_buf *bp, 2260 struct xfs_da_args *args) 2261 { 2262 struct xfs_attr_leafblock *leaf; 2263 struct xfs_attr3_icleaf_hdr ichdr; 2264 struct xfs_attr_leaf_entry *entry; 2265 struct xfs_attr_leaf_name_local *name_loc; 2266 struct xfs_attr_leaf_name_remote *name_rmt; 2267 int valuelen; 2268 2269 leaf = bp->b_addr; 2270 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 2271 ASSERT(ichdr.count < args->geo->blksize / 8); 2272 ASSERT(args->index < ichdr.count); 2273 2274 entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; 2275 if (entry->flags & XFS_ATTR_LOCAL) { 2276 name_loc = xfs_attr3_leaf_name_local(leaf, args->index); 2277 ASSERT(name_loc->namelen == args->namelen); 2278 ASSERT(memcmp(args->name, name_loc->nameval, args->namelen) == 0); 2279 valuelen = be16_to_cpu(name_loc->valuelen); 2280 if (args->flags & ATTR_KERNOVAL) { 2281 args->valuelen = valuelen; 2282 return 0; 2283 } 2284 if (args->valuelen < valuelen) { 2285 args->valuelen = valuelen; 2286 return -ERANGE; 2287 } 2288 args->valuelen = valuelen; 2289 memcpy(args->value, &name_loc->nameval[args->namelen], valuelen); 2290 } else { 2291 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); 2292 ASSERT(name_rmt->namelen == args->namelen); 2293 ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0); 2294 args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen); 2295 args->rmtblkno = be32_to_cpu(name_rmt->valueblk); 2296 args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, 2297 args->rmtvaluelen); 2298 if (args->flags & ATTR_KERNOVAL) { 2299 args->valuelen = args->rmtvaluelen; 2300 return 0; 2301 } 2302 if (args->valuelen < args->rmtvaluelen) { 2303 args->valuelen = args->rmtvaluelen; 2304 return -ERANGE; 2305 } 2306 args->valuelen = args->rmtvaluelen; 2307 } 2308 return 0; 2309 } 2310 2311 /*======================================================================== 2312 * Utility routines. 2313 *========================================================================*/ 2314 2315 /* 2316 * Move the indicated entries from one leaf to another. 2317 * NOTE: this routine modifies both source and destination leaves. 2318 */ 2319 /*ARGSUSED*/ 2320 STATIC void 2321 xfs_attr3_leaf_moveents( 2322 struct xfs_da_args *args, 2323 struct xfs_attr_leafblock *leaf_s, 2324 struct xfs_attr3_icleaf_hdr *ichdr_s, 2325 int start_s, 2326 struct xfs_attr_leafblock *leaf_d, 2327 struct xfs_attr3_icleaf_hdr *ichdr_d, 2328 int start_d, 2329 int count) 2330 { 2331 struct xfs_attr_leaf_entry *entry_s; 2332 struct xfs_attr_leaf_entry *entry_d; 2333 int desti; 2334 int tmp; 2335 int i; 2336 2337 /* 2338 * Check for nothing to do. 2339 */ 2340 if (count == 0) 2341 return; 2342 2343 /* 2344 * Set up environment. 2345 */ 2346 ASSERT(ichdr_s->magic == XFS_ATTR_LEAF_MAGIC || 2347 ichdr_s->magic == XFS_ATTR3_LEAF_MAGIC); 2348 ASSERT(ichdr_s->magic == ichdr_d->magic); 2349 ASSERT(ichdr_s->count > 0 && ichdr_s->count < args->geo->blksize / 8); 2350 ASSERT(ichdr_s->firstused >= (ichdr_s->count * sizeof(*entry_s)) 2351 + xfs_attr3_leaf_hdr_size(leaf_s)); 2352 ASSERT(ichdr_d->count < args->geo->blksize / 8); 2353 ASSERT(ichdr_d->firstused >= (ichdr_d->count * sizeof(*entry_d)) 2354 + xfs_attr3_leaf_hdr_size(leaf_d)); 2355 2356 ASSERT(start_s < ichdr_s->count); 2357 ASSERT(start_d <= ichdr_d->count); 2358 ASSERT(count <= ichdr_s->count); 2359 2360 2361 /* 2362 * Move the entries in the destination leaf up to make a hole? 2363 */ 2364 if (start_d < ichdr_d->count) { 2365 tmp = ichdr_d->count - start_d; 2366 tmp *= sizeof(xfs_attr_leaf_entry_t); 2367 entry_s = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; 2368 entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d + count]; 2369 memmove(entry_d, entry_s, tmp); 2370 } 2371 2372 /* 2373 * Copy all entry's in the same (sorted) order, 2374 * but allocate attribute info packed and in sequence. 2375 */ 2376 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; 2377 entry_d = &xfs_attr3_leaf_entryp(leaf_d)[start_d]; 2378 desti = start_d; 2379 for (i = 0; i < count; entry_s++, entry_d++, desti++, i++) { 2380 ASSERT(be16_to_cpu(entry_s->nameidx) >= ichdr_s->firstused); 2381 tmp = xfs_attr_leaf_entsize(leaf_s, start_s + i); 2382 #ifdef GROT 2383 /* 2384 * Code to drop INCOMPLETE entries. Difficult to use as we 2385 * may also need to change the insertion index. Code turned 2386 * off for 6.2, should be revisited later. 2387 */ 2388 if (entry_s->flags & XFS_ATTR_INCOMPLETE) { /* skip partials? */ 2389 memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); 2390 ichdr_s->usedbytes -= tmp; 2391 ichdr_s->count -= 1; 2392 entry_d--; /* to compensate for ++ in loop hdr */ 2393 desti--; 2394 if ((start_s + i) < offset) 2395 result++; /* insertion index adjustment */ 2396 } else { 2397 #endif /* GROT */ 2398 ichdr_d->firstused -= tmp; 2399 /* both on-disk, don't endian flip twice */ 2400 entry_d->hashval = entry_s->hashval; 2401 entry_d->nameidx = cpu_to_be16(ichdr_d->firstused); 2402 entry_d->flags = entry_s->flags; 2403 ASSERT(be16_to_cpu(entry_d->nameidx) + tmp 2404 <= args->geo->blksize); 2405 memmove(xfs_attr3_leaf_name(leaf_d, desti), 2406 xfs_attr3_leaf_name(leaf_s, start_s + i), tmp); 2407 ASSERT(be16_to_cpu(entry_s->nameidx) + tmp 2408 <= args->geo->blksize); 2409 memset(xfs_attr3_leaf_name(leaf_s, start_s + i), 0, tmp); 2410 ichdr_s->usedbytes -= tmp; 2411 ichdr_d->usedbytes += tmp; 2412 ichdr_s->count -= 1; 2413 ichdr_d->count += 1; 2414 tmp = ichdr_d->count * sizeof(xfs_attr_leaf_entry_t) 2415 + xfs_attr3_leaf_hdr_size(leaf_d); 2416 ASSERT(ichdr_d->firstused >= tmp); 2417 #ifdef GROT 2418 } 2419 #endif /* GROT */ 2420 } 2421 2422 /* 2423 * Zero out the entries we just copied. 2424 */ 2425 if (start_s == ichdr_s->count) { 2426 tmp = count * sizeof(xfs_attr_leaf_entry_t); 2427 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; 2428 ASSERT(((char *)entry_s + tmp) <= 2429 ((char *)leaf_s + args->geo->blksize)); 2430 memset(entry_s, 0, tmp); 2431 } else { 2432 /* 2433 * Move the remaining entries down to fill the hole, 2434 * then zero the entries at the top. 2435 */ 2436 tmp = (ichdr_s->count - count) * sizeof(xfs_attr_leaf_entry_t); 2437 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count]; 2438 entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; 2439 memmove(entry_d, entry_s, tmp); 2440 2441 tmp = count * sizeof(xfs_attr_leaf_entry_t); 2442 entry_s = &xfs_attr3_leaf_entryp(leaf_s)[ichdr_s->count]; 2443 ASSERT(((char *)entry_s + tmp) <= 2444 ((char *)leaf_s + args->geo->blksize)); 2445 memset(entry_s, 0, tmp); 2446 } 2447 2448 /* 2449 * Fill in the freemap information 2450 */ 2451 ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_d); 2452 ichdr_d->freemap[0].base += ichdr_d->count * sizeof(xfs_attr_leaf_entry_t); 2453 ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; 2454 ichdr_d->freemap[1].base = 0; 2455 ichdr_d->freemap[2].base = 0; 2456 ichdr_d->freemap[1].size = 0; 2457 ichdr_d->freemap[2].size = 0; 2458 ichdr_s->holes = 1; /* leaf may not be compact */ 2459 } 2460 2461 /* 2462 * Pick up the last hashvalue from a leaf block. 2463 */ 2464 xfs_dahash_t 2465 xfs_attr_leaf_lasthash( 2466 struct xfs_buf *bp, 2467 int *count) 2468 { 2469 struct xfs_attr3_icleaf_hdr ichdr; 2470 struct xfs_attr_leaf_entry *entries; 2471 struct xfs_mount *mp = bp->b_target->bt_mount; 2472 2473 xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, bp->b_addr); 2474 entries = xfs_attr3_leaf_entryp(bp->b_addr); 2475 if (count) 2476 *count = ichdr.count; 2477 if (!ichdr.count) 2478 return 0; 2479 return be32_to_cpu(entries[ichdr.count - 1].hashval); 2480 } 2481 2482 /* 2483 * Calculate the number of bytes used to store the indicated attribute 2484 * (whether local or remote only calculate bytes in this block). 2485 */ 2486 STATIC int 2487 xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index) 2488 { 2489 struct xfs_attr_leaf_entry *entries; 2490 xfs_attr_leaf_name_local_t *name_loc; 2491 xfs_attr_leaf_name_remote_t *name_rmt; 2492 int size; 2493 2494 entries = xfs_attr3_leaf_entryp(leaf); 2495 if (entries[index].flags & XFS_ATTR_LOCAL) { 2496 name_loc = xfs_attr3_leaf_name_local(leaf, index); 2497 size = xfs_attr_leaf_entsize_local(name_loc->namelen, 2498 be16_to_cpu(name_loc->valuelen)); 2499 } else { 2500 name_rmt = xfs_attr3_leaf_name_remote(leaf, index); 2501 size = xfs_attr_leaf_entsize_remote(name_rmt->namelen); 2502 } 2503 return size; 2504 } 2505 2506 /* 2507 * Calculate the number of bytes that would be required to store the new 2508 * attribute (whether local or remote only calculate bytes in this block). 2509 * This routine decides as a side effect whether the attribute will be 2510 * a "local" or a "remote" attribute. 2511 */ 2512 int 2513 xfs_attr_leaf_newentsize( 2514 struct xfs_da_args *args, 2515 int *local) 2516 { 2517 int size; 2518 2519 size = xfs_attr_leaf_entsize_local(args->namelen, args->valuelen); 2520 if (size < xfs_attr_leaf_entsize_local_max(args->geo->blksize)) { 2521 if (local) 2522 *local = 1; 2523 return size; 2524 } 2525 if (local) 2526 *local = 0; 2527 return xfs_attr_leaf_entsize_remote(args->namelen); 2528 } 2529 2530 2531 /*======================================================================== 2532 * Manage the INCOMPLETE flag in a leaf entry 2533 *========================================================================*/ 2534 2535 /* 2536 * Clear the INCOMPLETE flag on an entry in a leaf block. 2537 */ 2538 int 2539 xfs_attr3_leaf_clearflag( 2540 struct xfs_da_args *args) 2541 { 2542 struct xfs_attr_leafblock *leaf; 2543 struct xfs_attr_leaf_entry *entry; 2544 struct xfs_attr_leaf_name_remote *name_rmt; 2545 struct xfs_buf *bp; 2546 int error; 2547 #ifdef DEBUG 2548 struct xfs_attr3_icleaf_hdr ichdr; 2549 xfs_attr_leaf_name_local_t *name_loc; 2550 int namelen; 2551 char *name; 2552 #endif /* DEBUG */ 2553 2554 trace_xfs_attr_leaf_clearflag(args); 2555 /* 2556 * Set up the operation. 2557 */ 2558 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); 2559 if (error) 2560 return error; 2561 2562 leaf = bp->b_addr; 2563 entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; 2564 ASSERT(entry->flags & XFS_ATTR_INCOMPLETE); 2565 2566 #ifdef DEBUG 2567 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 2568 ASSERT(args->index < ichdr.count); 2569 ASSERT(args->index >= 0); 2570 2571 if (entry->flags & XFS_ATTR_LOCAL) { 2572 name_loc = xfs_attr3_leaf_name_local(leaf, args->index); 2573 namelen = name_loc->namelen; 2574 name = (char *)name_loc->nameval; 2575 } else { 2576 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); 2577 namelen = name_rmt->namelen; 2578 name = (char *)name_rmt->name; 2579 } 2580 ASSERT(be32_to_cpu(entry->hashval) == args->hashval); 2581 ASSERT(namelen == args->namelen); 2582 ASSERT(memcmp(name, args->name, namelen) == 0); 2583 #endif /* DEBUG */ 2584 2585 entry->flags &= ~XFS_ATTR_INCOMPLETE; 2586 xfs_trans_log_buf(args->trans, bp, 2587 XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); 2588 2589 if (args->rmtblkno) { 2590 ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0); 2591 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); 2592 name_rmt->valueblk = cpu_to_be32(args->rmtblkno); 2593 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); 2594 xfs_trans_log_buf(args->trans, bp, 2595 XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); 2596 } 2597 2598 /* 2599 * Commit the flag value change and start the next trans in series. 2600 */ 2601 return xfs_trans_roll(&args->trans, args->dp); 2602 } 2603 2604 /* 2605 * Set the INCOMPLETE flag on an entry in a leaf block. 2606 */ 2607 int 2608 xfs_attr3_leaf_setflag( 2609 struct xfs_da_args *args) 2610 { 2611 struct xfs_attr_leafblock *leaf; 2612 struct xfs_attr_leaf_entry *entry; 2613 struct xfs_attr_leaf_name_remote *name_rmt; 2614 struct xfs_buf *bp; 2615 int error; 2616 #ifdef DEBUG 2617 struct xfs_attr3_icleaf_hdr ichdr; 2618 #endif 2619 2620 trace_xfs_attr_leaf_setflag(args); 2621 2622 /* 2623 * Set up the operation. 2624 */ 2625 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp); 2626 if (error) 2627 return error; 2628 2629 leaf = bp->b_addr; 2630 #ifdef DEBUG 2631 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); 2632 ASSERT(args->index < ichdr.count); 2633 ASSERT(args->index >= 0); 2634 #endif 2635 entry = &xfs_attr3_leaf_entryp(leaf)[args->index]; 2636 2637 ASSERT((entry->flags & XFS_ATTR_INCOMPLETE) == 0); 2638 entry->flags |= XFS_ATTR_INCOMPLETE; 2639 xfs_trans_log_buf(args->trans, bp, 2640 XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); 2641 if ((entry->flags & XFS_ATTR_LOCAL) == 0) { 2642 name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index); 2643 name_rmt->valueblk = 0; 2644 name_rmt->valuelen = 0; 2645 xfs_trans_log_buf(args->trans, bp, 2646 XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt))); 2647 } 2648 2649 /* 2650 * Commit the flag value change and start the next trans in series. 2651 */ 2652 return xfs_trans_roll(&args->trans, args->dp); 2653 } 2654 2655 /* 2656 * In a single transaction, clear the INCOMPLETE flag on the leaf entry 2657 * given by args->blkno/index and set the INCOMPLETE flag on the leaf 2658 * entry given by args->blkno2/index2. 2659 * 2660 * Note that they could be in different blocks, or in the same block. 2661 */ 2662 int 2663 xfs_attr3_leaf_flipflags( 2664 struct xfs_da_args *args) 2665 { 2666 struct xfs_attr_leafblock *leaf1; 2667 struct xfs_attr_leafblock *leaf2; 2668 struct xfs_attr_leaf_entry *entry1; 2669 struct xfs_attr_leaf_entry *entry2; 2670 struct xfs_attr_leaf_name_remote *name_rmt; 2671 struct xfs_buf *bp1; 2672 struct xfs_buf *bp2; 2673 int error; 2674 #ifdef DEBUG 2675 struct xfs_attr3_icleaf_hdr ichdr1; 2676 struct xfs_attr3_icleaf_hdr ichdr2; 2677 xfs_attr_leaf_name_local_t *name_loc; 2678 int namelen1, namelen2; 2679 char *name1, *name2; 2680 #endif /* DEBUG */ 2681 2682 trace_xfs_attr_leaf_flipflags(args); 2683 2684 /* 2685 * Read the block containing the "old" attr 2686 */ 2687 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, -1, &bp1); 2688 if (error) 2689 return error; 2690 2691 /* 2692 * Read the block containing the "new" attr, if it is different 2693 */ 2694 if (args->blkno2 != args->blkno) { 2695 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno2, 2696 -1, &bp2); 2697 if (error) 2698 return error; 2699 } else { 2700 bp2 = bp1; 2701 } 2702 2703 leaf1 = bp1->b_addr; 2704 entry1 = &xfs_attr3_leaf_entryp(leaf1)[args->index]; 2705 2706 leaf2 = bp2->b_addr; 2707 entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2]; 2708 2709 #ifdef DEBUG 2710 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1); 2711 ASSERT(args->index < ichdr1.count); 2712 ASSERT(args->index >= 0); 2713 2714 xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2); 2715 ASSERT(args->index2 < ichdr2.count); 2716 ASSERT(args->index2 >= 0); 2717 2718 if (entry1->flags & XFS_ATTR_LOCAL) { 2719 name_loc = xfs_attr3_leaf_name_local(leaf1, args->index); 2720 namelen1 = name_loc->namelen; 2721 name1 = (char *)name_loc->nameval; 2722 } else { 2723 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); 2724 namelen1 = name_rmt->namelen; 2725 name1 = (char *)name_rmt->name; 2726 } 2727 if (entry2->flags & XFS_ATTR_LOCAL) { 2728 name_loc = xfs_attr3_leaf_name_local(leaf2, args->index2); 2729 namelen2 = name_loc->namelen; 2730 name2 = (char *)name_loc->nameval; 2731 } else { 2732 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); 2733 namelen2 = name_rmt->namelen; 2734 name2 = (char *)name_rmt->name; 2735 } 2736 ASSERT(be32_to_cpu(entry1->hashval) == be32_to_cpu(entry2->hashval)); 2737 ASSERT(namelen1 == namelen2); 2738 ASSERT(memcmp(name1, name2, namelen1) == 0); 2739 #endif /* DEBUG */ 2740 2741 ASSERT(entry1->flags & XFS_ATTR_INCOMPLETE); 2742 ASSERT((entry2->flags & XFS_ATTR_INCOMPLETE) == 0); 2743 2744 entry1->flags &= ~XFS_ATTR_INCOMPLETE; 2745 xfs_trans_log_buf(args->trans, bp1, 2746 XFS_DA_LOGRANGE(leaf1, entry1, sizeof(*entry1))); 2747 if (args->rmtblkno) { 2748 ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0); 2749 name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index); 2750 name_rmt->valueblk = cpu_to_be32(args->rmtblkno); 2751 name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen); 2752 xfs_trans_log_buf(args->trans, bp1, 2753 XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt))); 2754 } 2755 2756 entry2->flags |= XFS_ATTR_INCOMPLETE; 2757 xfs_trans_log_buf(args->trans, bp2, 2758 XFS_DA_LOGRANGE(leaf2, entry2, sizeof(*entry2))); 2759 if ((entry2->flags & XFS_ATTR_LOCAL) == 0) { 2760 name_rmt = xfs_attr3_leaf_name_remote(leaf2, args->index2); 2761 name_rmt->valueblk = 0; 2762 name_rmt->valuelen = 0; 2763 xfs_trans_log_buf(args->trans, bp2, 2764 XFS_DA_LOGRANGE(leaf2, name_rmt, sizeof(*name_rmt))); 2765 } 2766 2767 /* 2768 * Commit the flag value change and start the next trans in series. 2769 */ 2770 error = xfs_trans_roll(&args->trans, args->dp); 2771 2772 return error; 2773 } 2774