1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. 4 * Copyright (c) 2013 Red Hat, Inc. 5 * All Rights Reserved. 6 */ 7 #include "xfs.h" 8 #include "xfs_fs.h" 9 #include "xfs_shared.h" 10 #include "xfs_format.h" 11 #include "xfs_log_format.h" 12 #include "xfs_trans_resv.h" 13 #include "xfs_mount.h" 14 #include "xfs_inode.h" 15 #include "xfs_trans.h" 16 #include "xfs_bmap.h" 17 #include "xfs_buf_item.h" 18 #include "xfs_dir2.h" 19 #include "xfs_dir2_priv.h" 20 #include "xfs_error.h" 21 #include "xfs_trace.h" 22 #include "xfs_log.h" 23 24 /* 25 * Local function prototypes. 26 */ 27 static void xfs_dir2_block_log_leaf(xfs_trans_t *tp, struct xfs_buf *bp, 28 int first, int last); 29 static void xfs_dir2_block_log_tail(xfs_trans_t *tp, struct xfs_buf *bp); 30 static int xfs_dir2_block_lookup_int(xfs_da_args_t *args, struct xfs_buf **bpp, 31 int *entno); 32 static int xfs_dir2_block_sort(const void *a, const void *b); 33 34 static xfs_dahash_t xfs_dir_hash_dot, xfs_dir_hash_dotdot; 35 36 /* 37 * One-time startup routine called from xfs_init(). 38 */ 39 void 40 xfs_dir_startup(void) 41 { 42 xfs_dir_hash_dot = xfs_da_hashname((unsigned char *)".", 1); 43 xfs_dir_hash_dotdot = xfs_da_hashname((unsigned char *)"..", 2); 44 } 45 46 static xfs_failaddr_t 47 xfs_dir3_block_verify( 48 struct xfs_buf *bp) 49 { 50 struct xfs_mount *mp = bp->b_mount; 51 struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; 52 53 if (!xfs_verify_magic(bp, hdr3->magic)) 54 return __this_address; 55 56 if (xfs_sb_version_hascrc(&mp->m_sb)) { 57 if (!uuid_equal(&hdr3->uuid, &mp->m_sb.sb_meta_uuid)) 58 return __this_address; 59 if (be64_to_cpu(hdr3->blkno) != bp->b_bn) 60 return __this_address; 61 if (!xfs_log_check_lsn(mp, be64_to_cpu(hdr3->lsn))) 62 return __this_address; 63 } 64 return __xfs_dir3_data_check(NULL, bp); 65 } 66 67 static void 68 xfs_dir3_block_read_verify( 69 struct xfs_buf *bp) 70 { 71 struct xfs_mount *mp = bp->b_mount; 72 xfs_failaddr_t fa; 73 74 if (xfs_sb_version_hascrc(&mp->m_sb) && 75 !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) 76 xfs_verifier_error(bp, -EFSBADCRC, __this_address); 77 else { 78 fa = xfs_dir3_block_verify(bp); 79 if (fa) 80 xfs_verifier_error(bp, -EFSCORRUPTED, fa); 81 } 82 } 83 84 static void 85 xfs_dir3_block_write_verify( 86 struct xfs_buf *bp) 87 { 88 struct xfs_mount *mp = bp->b_mount; 89 struct xfs_buf_log_item *bip = bp->b_log_item; 90 struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; 91 xfs_failaddr_t fa; 92 93 fa = xfs_dir3_block_verify(bp); 94 if (fa) { 95 xfs_verifier_error(bp, -EFSCORRUPTED, fa); 96 return; 97 } 98 99 if (!xfs_sb_version_hascrc(&mp->m_sb)) 100 return; 101 102 if (bip) 103 hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); 104 105 xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF); 106 } 107 108 const struct xfs_buf_ops xfs_dir3_block_buf_ops = { 109 .name = "xfs_dir3_block", 110 .magic = { cpu_to_be32(XFS_DIR2_BLOCK_MAGIC), 111 cpu_to_be32(XFS_DIR3_BLOCK_MAGIC) }, 112 .verify_read = xfs_dir3_block_read_verify, 113 .verify_write = xfs_dir3_block_write_verify, 114 .verify_struct = xfs_dir3_block_verify, 115 }; 116 117 int 118 xfs_dir3_block_read( 119 struct xfs_trans *tp, 120 struct xfs_inode *dp, 121 struct xfs_buf **bpp) 122 { 123 struct xfs_mount *mp = dp->i_mount; 124 int err; 125 126 err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp, 127 XFS_DATA_FORK, &xfs_dir3_block_buf_ops); 128 if (!err && tp && *bpp) 129 xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); 130 return err; 131 } 132 133 static void 134 xfs_dir3_block_init( 135 struct xfs_mount *mp, 136 struct xfs_trans *tp, 137 struct xfs_buf *bp, 138 struct xfs_inode *dp) 139 { 140 struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; 141 142 bp->b_ops = &xfs_dir3_block_buf_ops; 143 xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DIR_BLOCK_BUF); 144 145 if (xfs_sb_version_hascrc(&mp->m_sb)) { 146 memset(hdr3, 0, sizeof(*hdr3)); 147 hdr3->magic = cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); 148 hdr3->blkno = cpu_to_be64(bp->b_bn); 149 hdr3->owner = cpu_to_be64(dp->i_ino); 150 uuid_copy(&hdr3->uuid, &mp->m_sb.sb_meta_uuid); 151 return; 152 153 } 154 hdr3->magic = cpu_to_be32(XFS_DIR2_BLOCK_MAGIC); 155 } 156 157 static void 158 xfs_dir2_block_need_space( 159 struct xfs_inode *dp, 160 struct xfs_dir2_data_hdr *hdr, 161 struct xfs_dir2_block_tail *btp, 162 struct xfs_dir2_leaf_entry *blp, 163 __be16 **tagpp, 164 struct xfs_dir2_data_unused **dupp, 165 struct xfs_dir2_data_unused **enddupp, 166 int *compact, 167 int len) 168 { 169 struct xfs_dir2_data_free *bf; 170 __be16 *tagp = NULL; 171 struct xfs_dir2_data_unused *dup = NULL; 172 struct xfs_dir2_data_unused *enddup = NULL; 173 174 *compact = 0; 175 bf = dp->d_ops->data_bestfree_p(hdr); 176 177 /* 178 * If there are stale entries we'll use one for the leaf. 179 */ 180 if (btp->stale) { 181 if (be16_to_cpu(bf[0].length) >= len) { 182 /* 183 * The biggest entry enough to avoid compaction. 184 */ 185 dup = (xfs_dir2_data_unused_t *) 186 ((char *)hdr + be16_to_cpu(bf[0].offset)); 187 goto out; 188 } 189 190 /* 191 * Will need to compact to make this work. 192 * Tag just before the first leaf entry. 193 */ 194 *compact = 1; 195 tagp = (__be16 *)blp - 1; 196 197 /* Data object just before the first leaf entry. */ 198 dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); 199 200 /* 201 * If it's not free then the data will go where the 202 * leaf data starts now, if it works at all. 203 */ 204 if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { 205 if (be16_to_cpu(dup->length) + (be32_to_cpu(btp->stale) - 1) * 206 (uint)sizeof(*blp) < len) 207 dup = NULL; 208 } else if ((be32_to_cpu(btp->stale) - 1) * (uint)sizeof(*blp) < len) 209 dup = NULL; 210 else 211 dup = (xfs_dir2_data_unused_t *)blp; 212 goto out; 213 } 214 215 /* 216 * no stale entries, so just use free space. 217 * Tag just before the first leaf entry. 218 */ 219 tagp = (__be16 *)blp - 1; 220 221 /* Data object just before the first leaf entry. */ 222 enddup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); 223 224 /* 225 * If it's not free then can't do this add without cleaning up: 226 * the space before the first leaf entry needs to be free so it 227 * can be expanded to hold the pointer to the new entry. 228 */ 229 if (be16_to_cpu(enddup->freetag) == XFS_DIR2_DATA_FREE_TAG) { 230 /* 231 * Check out the biggest freespace and see if it's the same one. 232 */ 233 dup = (xfs_dir2_data_unused_t *) 234 ((char *)hdr + be16_to_cpu(bf[0].offset)); 235 if (dup != enddup) { 236 /* 237 * Not the same free entry, just check its length. 238 */ 239 if (be16_to_cpu(dup->length) < len) 240 dup = NULL; 241 goto out; 242 } 243 244 /* 245 * It is the biggest freespace, can it hold the leaf too? 246 */ 247 if (be16_to_cpu(dup->length) < len + (uint)sizeof(*blp)) { 248 /* 249 * Yes, use the second-largest entry instead if it works. 250 */ 251 if (be16_to_cpu(bf[1].length) >= len) 252 dup = (xfs_dir2_data_unused_t *) 253 ((char *)hdr + be16_to_cpu(bf[1].offset)); 254 else 255 dup = NULL; 256 } 257 } 258 out: 259 *tagpp = tagp; 260 *dupp = dup; 261 *enddupp = enddup; 262 } 263 264 /* 265 * compact the leaf entries. 266 * Leave the highest-numbered stale entry stale. 267 * XXX should be the one closest to mid but mid is not yet computed. 268 */ 269 static void 270 xfs_dir2_block_compact( 271 struct xfs_da_args *args, 272 struct xfs_buf *bp, 273 struct xfs_dir2_data_hdr *hdr, 274 struct xfs_dir2_block_tail *btp, 275 struct xfs_dir2_leaf_entry *blp, 276 int *needlog, 277 int *lfloghigh, 278 int *lfloglow) 279 { 280 int fromidx; /* source leaf index */ 281 int toidx; /* target leaf index */ 282 int needscan = 0; 283 int highstale; /* high stale index */ 284 285 fromidx = toidx = be32_to_cpu(btp->count) - 1; 286 highstale = *lfloghigh = -1; 287 for (; fromidx >= 0; fromidx--) { 288 if (blp[fromidx].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) { 289 if (highstale == -1) 290 highstale = toidx; 291 else { 292 if (*lfloghigh == -1) 293 *lfloghigh = toidx; 294 continue; 295 } 296 } 297 if (fromidx < toidx) 298 blp[toidx] = blp[fromidx]; 299 toidx--; 300 } 301 *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); 302 *lfloghigh -= be32_to_cpu(btp->stale) - 1; 303 be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); 304 xfs_dir2_data_make_free(args, bp, 305 (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), 306 (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), 307 needlog, &needscan); 308 btp->stale = cpu_to_be32(1); 309 /* 310 * If we now need to rebuild the bestfree map, do so. 311 * This needs to happen before the next call to use_free. 312 */ 313 if (needscan) 314 xfs_dir2_data_freescan(args->dp, hdr, needlog); 315 } 316 317 /* 318 * Add an entry to a block directory. 319 */ 320 int /* error */ 321 xfs_dir2_block_addname( 322 xfs_da_args_t *args) /* directory op arguments */ 323 { 324 xfs_dir2_data_hdr_t *hdr; /* block header */ 325 xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ 326 struct xfs_buf *bp; /* buffer for block */ 327 xfs_dir2_block_tail_t *btp; /* block tail */ 328 int compact; /* need to compact leaf ents */ 329 xfs_dir2_data_entry_t *dep; /* block data entry */ 330 xfs_inode_t *dp; /* directory inode */ 331 xfs_dir2_data_unused_t *dup; /* block unused entry */ 332 int error; /* error return value */ 333 xfs_dir2_data_unused_t *enddup=NULL; /* unused at end of data */ 334 xfs_dahash_t hash; /* hash value of found entry */ 335 int high; /* high index for binary srch */ 336 int highstale; /* high stale index */ 337 int lfloghigh=0; /* last final leaf to log */ 338 int lfloglow=0; /* first final leaf to log */ 339 int len; /* length of the new entry */ 340 int low; /* low index for binary srch */ 341 int lowstale; /* low stale index */ 342 int mid=0; /* midpoint for binary srch */ 343 int needlog; /* need to log header */ 344 int needscan; /* need to rescan freespace */ 345 __be16 *tagp; /* pointer to tag value */ 346 xfs_trans_t *tp; /* transaction structure */ 347 348 trace_xfs_dir2_block_addname(args); 349 350 dp = args->dp; 351 tp = args->trans; 352 353 /* Read the (one and only) directory block into bp. */ 354 error = xfs_dir3_block_read(tp, dp, &bp); 355 if (error) 356 return error; 357 358 len = dp->d_ops->data_entsize(args->namelen); 359 360 /* 361 * Set up pointers to parts of the block. 362 */ 363 hdr = bp->b_addr; 364 btp = xfs_dir2_block_tail_p(args->geo, hdr); 365 blp = xfs_dir2_block_leaf_p(btp); 366 367 /* 368 * Find out if we can reuse stale entries or whether we need extra 369 * space for entry and new leaf. 370 */ 371 xfs_dir2_block_need_space(dp, hdr, btp, blp, &tagp, &dup, 372 &enddup, &compact, len); 373 374 /* 375 * Done everything we need for a space check now. 376 */ 377 if (args->op_flags & XFS_DA_OP_JUSTCHECK) { 378 xfs_trans_brelse(tp, bp); 379 if (!dup) 380 return -ENOSPC; 381 return 0; 382 } 383 384 /* 385 * If we don't have space for the new entry & leaf ... 386 */ 387 if (!dup) { 388 /* Don't have a space reservation: return no-space. */ 389 if (args->total == 0) 390 return -ENOSPC; 391 /* 392 * Convert to the next larger format. 393 * Then add the new entry in that format. 394 */ 395 error = xfs_dir2_block_to_leaf(args, bp); 396 if (error) 397 return error; 398 return xfs_dir2_leaf_addname(args); 399 } 400 401 needlog = needscan = 0; 402 403 /* 404 * If need to compact the leaf entries, do it now. 405 */ 406 if (compact) { 407 xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog, 408 &lfloghigh, &lfloglow); 409 /* recalculate blp post-compaction */ 410 blp = xfs_dir2_block_leaf_p(btp); 411 } else if (btp->stale) { 412 /* 413 * Set leaf logging boundaries to impossible state. 414 * For the no-stale case they're set explicitly. 415 */ 416 lfloglow = be32_to_cpu(btp->count); 417 lfloghigh = -1; 418 } 419 420 /* 421 * Find the slot that's first lower than our hash value, -1 if none. 422 */ 423 for (low = 0, high = be32_to_cpu(btp->count) - 1; low <= high; ) { 424 mid = (low + high) >> 1; 425 if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval) 426 break; 427 if (hash < args->hashval) 428 low = mid + 1; 429 else 430 high = mid - 1; 431 } 432 while (mid >= 0 && be32_to_cpu(blp[mid].hashval) >= args->hashval) { 433 mid--; 434 } 435 /* 436 * No stale entries, will use enddup space to hold new leaf. 437 */ 438 if (!btp->stale) { 439 xfs_dir2_data_aoff_t aoff; 440 441 /* 442 * Mark the space needed for the new leaf entry, now in use. 443 */ 444 aoff = (xfs_dir2_data_aoff_t)((char *)enddup - (char *)hdr + 445 be16_to_cpu(enddup->length) - sizeof(*blp)); 446 error = xfs_dir2_data_use_free(args, bp, enddup, aoff, 447 (xfs_dir2_data_aoff_t)sizeof(*blp), &needlog, 448 &needscan); 449 if (error) 450 return error; 451 452 /* 453 * Update the tail (entry count). 454 */ 455 be32_add_cpu(&btp->count, 1); 456 /* 457 * If we now need to rebuild the bestfree map, do so. 458 * This needs to happen before the next call to use_free. 459 */ 460 if (needscan) { 461 xfs_dir2_data_freescan(dp, hdr, &needlog); 462 needscan = 0; 463 } 464 /* 465 * Adjust pointer to the first leaf entry, we're about to move 466 * the table up one to open up space for the new leaf entry. 467 * Then adjust our index to match. 468 */ 469 blp--; 470 mid++; 471 if (mid) 472 memmove(blp, &blp[1], mid * sizeof(*blp)); 473 lfloglow = 0; 474 lfloghigh = mid; 475 } 476 /* 477 * Use a stale leaf for our new entry. 478 */ 479 else { 480 for (lowstale = mid; 481 lowstale >= 0 && 482 blp[lowstale].address != 483 cpu_to_be32(XFS_DIR2_NULL_DATAPTR); 484 lowstale--) 485 continue; 486 for (highstale = mid + 1; 487 highstale < be32_to_cpu(btp->count) && 488 blp[highstale].address != 489 cpu_to_be32(XFS_DIR2_NULL_DATAPTR) && 490 (lowstale < 0 || mid - lowstale > highstale - mid); 491 highstale++) 492 continue; 493 /* 494 * Move entries toward the low-numbered stale entry. 495 */ 496 if (lowstale >= 0 && 497 (highstale == be32_to_cpu(btp->count) || 498 mid - lowstale <= highstale - mid)) { 499 if (mid - lowstale) 500 memmove(&blp[lowstale], &blp[lowstale + 1], 501 (mid - lowstale) * sizeof(*blp)); 502 lfloglow = min(lowstale, lfloglow); 503 lfloghigh = max(mid, lfloghigh); 504 } 505 /* 506 * Move entries toward the high-numbered stale entry. 507 */ 508 else { 509 ASSERT(highstale < be32_to_cpu(btp->count)); 510 mid++; 511 if (highstale - mid) 512 memmove(&blp[mid + 1], &blp[mid], 513 (highstale - mid) * sizeof(*blp)); 514 lfloglow = min(mid, lfloglow); 515 lfloghigh = max(highstale, lfloghigh); 516 } 517 be32_add_cpu(&btp->stale, -1); 518 } 519 /* 520 * Point to the new data entry. 521 */ 522 dep = (xfs_dir2_data_entry_t *)dup; 523 /* 524 * Fill in the leaf entry. 525 */ 526 blp[mid].hashval = cpu_to_be32(args->hashval); 527 blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( 528 (char *)dep - (char *)hdr)); 529 xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh); 530 /* 531 * Mark space for the data entry used. 532 */ 533 error = xfs_dir2_data_use_free(args, bp, dup, 534 (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), 535 (xfs_dir2_data_aoff_t)len, &needlog, &needscan); 536 if (error) 537 return error; 538 /* 539 * Create the new data entry. 540 */ 541 dep->inumber = cpu_to_be64(args->inumber); 542 dep->namelen = args->namelen; 543 memcpy(dep->name, args->name, args->namelen); 544 dp->d_ops->data_put_ftype(dep, args->filetype); 545 tagp = dp->d_ops->data_entry_tag_p(dep); 546 *tagp = cpu_to_be16((char *)dep - (char *)hdr); 547 /* 548 * Clean up the bestfree array and log the header, tail, and entry. 549 */ 550 if (needscan) 551 xfs_dir2_data_freescan(dp, hdr, &needlog); 552 if (needlog) 553 xfs_dir2_data_log_header(args, bp); 554 xfs_dir2_block_log_tail(tp, bp); 555 xfs_dir2_data_log_entry(args, bp, dep); 556 xfs_dir3_data_check(dp, bp); 557 return 0; 558 } 559 560 /* 561 * Log leaf entries from the block. 562 */ 563 static void 564 xfs_dir2_block_log_leaf( 565 xfs_trans_t *tp, /* transaction structure */ 566 struct xfs_buf *bp, /* block buffer */ 567 int first, /* index of first logged leaf */ 568 int last) /* index of last logged leaf */ 569 { 570 xfs_dir2_data_hdr_t *hdr = bp->b_addr; 571 xfs_dir2_leaf_entry_t *blp; 572 xfs_dir2_block_tail_t *btp; 573 574 btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); 575 blp = xfs_dir2_block_leaf_p(btp); 576 xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr), 577 (uint)((char *)&blp[last + 1] - (char *)hdr - 1)); 578 } 579 580 /* 581 * Log the block tail. 582 */ 583 static void 584 xfs_dir2_block_log_tail( 585 xfs_trans_t *tp, /* transaction structure */ 586 struct xfs_buf *bp) /* block buffer */ 587 { 588 xfs_dir2_data_hdr_t *hdr = bp->b_addr; 589 xfs_dir2_block_tail_t *btp; 590 591 btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr); 592 xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr), 593 (uint)((char *)(btp + 1) - (char *)hdr - 1)); 594 } 595 596 /* 597 * Look up an entry in the block. This is the external routine, 598 * xfs_dir2_block_lookup_int does the real work. 599 */ 600 int /* error */ 601 xfs_dir2_block_lookup( 602 xfs_da_args_t *args) /* dir lookup arguments */ 603 { 604 xfs_dir2_data_hdr_t *hdr; /* block header */ 605 xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ 606 struct xfs_buf *bp; /* block buffer */ 607 xfs_dir2_block_tail_t *btp; /* block tail */ 608 xfs_dir2_data_entry_t *dep; /* block data entry */ 609 xfs_inode_t *dp; /* incore inode */ 610 int ent; /* entry index */ 611 int error; /* error return value */ 612 613 trace_xfs_dir2_block_lookup(args); 614 615 /* 616 * Get the buffer, look up the entry. 617 * If not found (ENOENT) then return, have no buffer. 618 */ 619 if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) 620 return error; 621 dp = args->dp; 622 hdr = bp->b_addr; 623 xfs_dir3_data_check(dp, bp); 624 btp = xfs_dir2_block_tail_p(args->geo, hdr); 625 blp = xfs_dir2_block_leaf_p(btp); 626 /* 627 * Get the offset from the leaf entry, to point to the data. 628 */ 629 dep = (xfs_dir2_data_entry_t *)((char *)hdr + 630 xfs_dir2_dataptr_to_off(args->geo, 631 be32_to_cpu(blp[ent].address))); 632 /* 633 * Fill in inode number, CI name if appropriate, release the block. 634 */ 635 args->inumber = be64_to_cpu(dep->inumber); 636 args->filetype = dp->d_ops->data_get_ftype(dep); 637 error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); 638 xfs_trans_brelse(args->trans, bp); 639 return error; 640 } 641 642 /* 643 * Internal block lookup routine. 644 */ 645 static int /* error */ 646 xfs_dir2_block_lookup_int( 647 xfs_da_args_t *args, /* dir lookup arguments */ 648 struct xfs_buf **bpp, /* returned block buffer */ 649 int *entno) /* returned entry number */ 650 { 651 xfs_dir2_dataptr_t addr; /* data entry address */ 652 xfs_dir2_data_hdr_t *hdr; /* block header */ 653 xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ 654 struct xfs_buf *bp; /* block buffer */ 655 xfs_dir2_block_tail_t *btp; /* block tail */ 656 xfs_dir2_data_entry_t *dep; /* block data entry */ 657 xfs_inode_t *dp; /* incore inode */ 658 int error; /* error return value */ 659 xfs_dahash_t hash; /* found hash value */ 660 int high; /* binary search high index */ 661 int low; /* binary search low index */ 662 int mid; /* binary search current idx */ 663 xfs_mount_t *mp; /* filesystem mount point */ 664 xfs_trans_t *tp; /* transaction pointer */ 665 enum xfs_dacmp cmp; /* comparison result */ 666 667 dp = args->dp; 668 tp = args->trans; 669 mp = dp->i_mount; 670 671 error = xfs_dir3_block_read(tp, dp, &bp); 672 if (error) 673 return error; 674 675 hdr = bp->b_addr; 676 xfs_dir3_data_check(dp, bp); 677 btp = xfs_dir2_block_tail_p(args->geo, hdr); 678 blp = xfs_dir2_block_leaf_p(btp); 679 /* 680 * Loop doing a binary search for our hash value. 681 * Find our entry, ENOENT if it's not there. 682 */ 683 for (low = 0, high = be32_to_cpu(btp->count) - 1; ; ) { 684 ASSERT(low <= high); 685 mid = (low + high) >> 1; 686 if ((hash = be32_to_cpu(blp[mid].hashval)) == args->hashval) 687 break; 688 if (hash < args->hashval) 689 low = mid + 1; 690 else 691 high = mid - 1; 692 if (low > high) { 693 ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); 694 xfs_trans_brelse(tp, bp); 695 return -ENOENT; 696 } 697 } 698 /* 699 * Back up to the first one with the right hash value. 700 */ 701 while (mid > 0 && be32_to_cpu(blp[mid - 1].hashval) == args->hashval) { 702 mid--; 703 } 704 /* 705 * Now loop forward through all the entries with the 706 * right hash value looking for our name. 707 */ 708 do { 709 if ((addr = be32_to_cpu(blp[mid].address)) == XFS_DIR2_NULL_DATAPTR) 710 continue; 711 /* 712 * Get pointer to the entry from the leaf. 713 */ 714 dep = (xfs_dir2_data_entry_t *) 715 ((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr)); 716 /* 717 * Compare name and if it's an exact match, return the index 718 * and buffer. If it's the first case-insensitive match, store 719 * the index and buffer and continue looking for an exact match. 720 */ 721 cmp = mp->m_dirnameops->compname(args, dep->name, dep->namelen); 722 if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { 723 args->cmpresult = cmp; 724 *bpp = bp; 725 *entno = mid; 726 if (cmp == XFS_CMP_EXACT) 727 return 0; 728 } 729 } while (++mid < be32_to_cpu(btp->count) && 730 be32_to_cpu(blp[mid].hashval) == hash); 731 732 ASSERT(args->op_flags & XFS_DA_OP_OKNOENT); 733 /* 734 * Here, we can only be doing a lookup (not a rename or replace). 735 * If a case-insensitive match was found earlier, return success. 736 */ 737 if (args->cmpresult == XFS_CMP_CASE) 738 return 0; 739 /* 740 * No match, release the buffer and return ENOENT. 741 */ 742 xfs_trans_brelse(tp, bp); 743 return -ENOENT; 744 } 745 746 /* 747 * Remove an entry from a block format directory. 748 * If that makes the block small enough to fit in shortform, transform it. 749 */ 750 int /* error */ 751 xfs_dir2_block_removename( 752 xfs_da_args_t *args) /* directory operation args */ 753 { 754 xfs_dir2_data_hdr_t *hdr; /* block header */ 755 xfs_dir2_leaf_entry_t *blp; /* block leaf pointer */ 756 struct xfs_buf *bp; /* block buffer */ 757 xfs_dir2_block_tail_t *btp; /* block tail */ 758 xfs_dir2_data_entry_t *dep; /* block data entry */ 759 xfs_inode_t *dp; /* incore inode */ 760 int ent; /* block leaf entry index */ 761 int error; /* error return value */ 762 int needlog; /* need to log block header */ 763 int needscan; /* need to fixup bestfree */ 764 xfs_dir2_sf_hdr_t sfh; /* shortform header */ 765 int size; /* shortform size */ 766 xfs_trans_t *tp; /* transaction pointer */ 767 768 trace_xfs_dir2_block_removename(args); 769 770 /* 771 * Look up the entry in the block. Gets the buffer and entry index. 772 * It will always be there, the vnodeops level does a lookup first. 773 */ 774 if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) { 775 return error; 776 } 777 dp = args->dp; 778 tp = args->trans; 779 hdr = bp->b_addr; 780 btp = xfs_dir2_block_tail_p(args->geo, hdr); 781 blp = xfs_dir2_block_leaf_p(btp); 782 /* 783 * Point to the data entry using the leaf entry. 784 */ 785 dep = (xfs_dir2_data_entry_t *)((char *)hdr + 786 xfs_dir2_dataptr_to_off(args->geo, 787 be32_to_cpu(blp[ent].address))); 788 /* 789 * Mark the data entry's space free. 790 */ 791 needlog = needscan = 0; 792 xfs_dir2_data_make_free(args, bp, 793 (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), 794 dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); 795 /* 796 * Fix up the block tail. 797 */ 798 be32_add_cpu(&btp->stale, 1); 799 xfs_dir2_block_log_tail(tp, bp); 800 /* 801 * Remove the leaf entry by marking it stale. 802 */ 803 blp[ent].address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); 804 xfs_dir2_block_log_leaf(tp, bp, ent, ent); 805 /* 806 * Fix up bestfree, log the header if necessary. 807 */ 808 if (needscan) 809 xfs_dir2_data_freescan(dp, hdr, &needlog); 810 if (needlog) 811 xfs_dir2_data_log_header(args, bp); 812 xfs_dir3_data_check(dp, bp); 813 /* 814 * See if the size as a shortform is good enough. 815 */ 816 size = xfs_dir2_block_sfsize(dp, hdr, &sfh); 817 if (size > XFS_IFORK_DSIZE(dp)) 818 return 0; 819 820 /* 821 * If it works, do the conversion. 822 */ 823 return xfs_dir2_block_to_sf(args, bp, size, &sfh); 824 } 825 826 /* 827 * Replace an entry in a V2 block directory. 828 * Change the inode number to the new value. 829 */ 830 int /* error */ 831 xfs_dir2_block_replace( 832 xfs_da_args_t *args) /* directory operation args */ 833 { 834 xfs_dir2_data_hdr_t *hdr; /* block header */ 835 xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ 836 struct xfs_buf *bp; /* block buffer */ 837 xfs_dir2_block_tail_t *btp; /* block tail */ 838 xfs_dir2_data_entry_t *dep; /* block data entry */ 839 xfs_inode_t *dp; /* incore inode */ 840 int ent; /* leaf entry index */ 841 int error; /* error return value */ 842 843 trace_xfs_dir2_block_replace(args); 844 845 /* 846 * Lookup the entry in the directory. Get buffer and entry index. 847 * This will always succeed since the caller has already done a lookup. 848 */ 849 if ((error = xfs_dir2_block_lookup_int(args, &bp, &ent))) { 850 return error; 851 } 852 dp = args->dp; 853 hdr = bp->b_addr; 854 btp = xfs_dir2_block_tail_p(args->geo, hdr); 855 blp = xfs_dir2_block_leaf_p(btp); 856 /* 857 * Point to the data entry we need to change. 858 */ 859 dep = (xfs_dir2_data_entry_t *)((char *)hdr + 860 xfs_dir2_dataptr_to_off(args->geo, 861 be32_to_cpu(blp[ent].address))); 862 ASSERT(be64_to_cpu(dep->inumber) != args->inumber); 863 /* 864 * Change the inode number to the new value. 865 */ 866 dep->inumber = cpu_to_be64(args->inumber); 867 dp->d_ops->data_put_ftype(dep, args->filetype); 868 xfs_dir2_data_log_entry(args, bp, dep); 869 xfs_dir3_data_check(dp, bp); 870 return 0; 871 } 872 873 /* 874 * Qsort comparison routine for the block leaf entries. 875 */ 876 static int /* sort order */ 877 xfs_dir2_block_sort( 878 const void *a, /* first leaf entry */ 879 const void *b) /* second leaf entry */ 880 { 881 const xfs_dir2_leaf_entry_t *la; /* first leaf entry */ 882 const xfs_dir2_leaf_entry_t *lb; /* second leaf entry */ 883 884 la = a; 885 lb = b; 886 return be32_to_cpu(la->hashval) < be32_to_cpu(lb->hashval) ? -1 : 887 (be32_to_cpu(la->hashval) > be32_to_cpu(lb->hashval) ? 1 : 0); 888 } 889 890 /* 891 * Convert a V2 leaf directory to a V2 block directory if possible. 892 */ 893 int /* error */ 894 xfs_dir2_leaf_to_block( 895 xfs_da_args_t *args, /* operation arguments */ 896 struct xfs_buf *lbp, /* leaf buffer */ 897 struct xfs_buf *dbp) /* data buffer */ 898 { 899 __be16 *bestsp; /* leaf bests table */ 900 xfs_dir2_data_hdr_t *hdr; /* block header */ 901 xfs_dir2_block_tail_t *btp; /* block tail */ 902 xfs_inode_t *dp; /* incore directory inode */ 903 xfs_dir2_data_unused_t *dup; /* unused data entry */ 904 int error; /* error return value */ 905 int from; /* leaf from index */ 906 xfs_dir2_leaf_t *leaf; /* leaf structure */ 907 xfs_dir2_leaf_entry_t *lep; /* leaf entry */ 908 xfs_dir2_leaf_tail_t *ltp; /* leaf tail structure */ 909 xfs_mount_t *mp; /* file system mount point */ 910 int needlog; /* need to log data header */ 911 int needscan; /* need to scan for bestfree */ 912 xfs_dir2_sf_hdr_t sfh; /* shortform header */ 913 int size; /* bytes used */ 914 __be16 *tagp; /* end of entry (tag) */ 915 int to; /* block/leaf to index */ 916 xfs_trans_t *tp; /* transaction pointer */ 917 struct xfs_dir2_leaf_entry *ents; 918 struct xfs_dir3_icleaf_hdr leafhdr; 919 920 trace_xfs_dir2_leaf_to_block(args); 921 922 dp = args->dp; 923 tp = args->trans; 924 mp = dp->i_mount; 925 leaf = lbp->b_addr; 926 dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); 927 ents = dp->d_ops->leaf_ents_p(leaf); 928 ltp = xfs_dir2_leaf_tail_p(args->geo, leaf); 929 930 ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || 931 leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); 932 /* 933 * If there are data blocks other than the first one, take this 934 * opportunity to remove trailing empty data blocks that may have 935 * been left behind during no-space-reservation operations. 936 * These will show up in the leaf bests table. 937 */ 938 while (dp->i_d.di_size > args->geo->blksize) { 939 int hdrsz; 940 941 hdrsz = dp->d_ops->data_entry_offset; 942 bestsp = xfs_dir2_leaf_bests_p(ltp); 943 if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == 944 args->geo->blksize - hdrsz) { 945 if ((error = 946 xfs_dir2_leaf_trim_data(args, lbp, 947 (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) 948 return error; 949 } else 950 return 0; 951 } 952 /* 953 * Read the data block if we don't already have it, give up if it fails. 954 */ 955 if (!dbp) { 956 error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp); 957 if (error) 958 return error; 959 } 960 hdr = dbp->b_addr; 961 ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || 962 hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); 963 964 /* 965 * Size of the "leaf" area in the block. 966 */ 967 size = (uint)sizeof(xfs_dir2_block_tail_t) + 968 (uint)sizeof(*lep) * (leafhdr.count - leafhdr.stale); 969 /* 970 * Look at the last data entry. 971 */ 972 tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1; 973 dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp)); 974 /* 975 * If it's not free or is too short we can't do it. 976 */ 977 if (be16_to_cpu(dup->freetag) != XFS_DIR2_DATA_FREE_TAG || 978 be16_to_cpu(dup->length) < size) 979 return 0; 980 981 /* 982 * Start converting it to block form. 983 */ 984 xfs_dir3_block_init(mp, tp, dbp, dp); 985 986 needlog = 1; 987 needscan = 0; 988 /* 989 * Use up the space at the end of the block (blp/btp). 990 */ 991 error = xfs_dir2_data_use_free(args, dbp, dup, 992 args->geo->blksize - size, size, &needlog, &needscan); 993 if (error) 994 return error; 995 /* 996 * Initialize the block tail. 997 */ 998 btp = xfs_dir2_block_tail_p(args->geo, hdr); 999 btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale); 1000 btp->stale = 0; 1001 xfs_dir2_block_log_tail(tp, dbp); 1002 /* 1003 * Initialize the block leaf area. We compact out stale entries. 1004 */ 1005 lep = xfs_dir2_block_leaf_p(btp); 1006 for (from = to = 0; from < leafhdr.count; from++) { 1007 if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) 1008 continue; 1009 lep[to++] = ents[from]; 1010 } 1011 ASSERT(to == be32_to_cpu(btp->count)); 1012 xfs_dir2_block_log_leaf(tp, dbp, 0, be32_to_cpu(btp->count) - 1); 1013 /* 1014 * Scan the bestfree if we need it and log the data block header. 1015 */ 1016 if (needscan) 1017 xfs_dir2_data_freescan(dp, hdr, &needlog); 1018 if (needlog) 1019 xfs_dir2_data_log_header(args, dbp); 1020 /* 1021 * Pitch the old leaf block. 1022 */ 1023 error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp); 1024 if (error) 1025 return error; 1026 1027 /* 1028 * Now see if the resulting block can be shrunken to shortform. 1029 */ 1030 size = xfs_dir2_block_sfsize(dp, hdr, &sfh); 1031 if (size > XFS_IFORK_DSIZE(dp)) 1032 return 0; 1033 1034 return xfs_dir2_block_to_sf(args, dbp, size, &sfh); 1035 } 1036 1037 /* 1038 * Convert the shortform directory to block form. 1039 */ 1040 int /* error */ 1041 xfs_dir2_sf_to_block( 1042 xfs_da_args_t *args) /* operation arguments */ 1043 { 1044 xfs_dir2_db_t blkno; /* dir-relative block # (0) */ 1045 xfs_dir2_data_hdr_t *hdr; /* block header */ 1046 xfs_dir2_leaf_entry_t *blp; /* block leaf entries */ 1047 struct xfs_buf *bp; /* block buffer */ 1048 xfs_dir2_block_tail_t *btp; /* block tail pointer */ 1049 xfs_dir2_data_entry_t *dep; /* data entry pointer */ 1050 xfs_inode_t *dp; /* incore directory inode */ 1051 int dummy; /* trash */ 1052 xfs_dir2_data_unused_t *dup; /* unused entry pointer */ 1053 int endoffset; /* end of data objects */ 1054 int error; /* error return value */ 1055 int i; /* index */ 1056 xfs_mount_t *mp; /* filesystem mount point */ 1057 int needlog; /* need to log block header */ 1058 int needscan; /* need to scan block freespc */ 1059 int newoffset; /* offset from current entry */ 1060 int offset; /* target block offset */ 1061 xfs_dir2_sf_entry_t *sfep; /* sf entry pointer */ 1062 xfs_dir2_sf_hdr_t *oldsfp; /* old shortform header */ 1063 xfs_dir2_sf_hdr_t *sfp; /* shortform header */ 1064 __be16 *tagp; /* end of data entry */ 1065 xfs_trans_t *tp; /* transaction pointer */ 1066 struct xfs_name name; 1067 struct xfs_ifork *ifp; 1068 1069 trace_xfs_dir2_sf_to_block(args); 1070 1071 dp = args->dp; 1072 tp = args->trans; 1073 mp = dp->i_mount; 1074 ifp = XFS_IFORK_PTR(dp, XFS_DATA_FORK); 1075 ASSERT(ifp->if_flags & XFS_IFINLINE); 1076 /* 1077 * Bomb out if the shortform directory is way too short. 1078 */ 1079 if (dp->i_d.di_size < offsetof(xfs_dir2_sf_hdr_t, parent)) { 1080 ASSERT(XFS_FORCED_SHUTDOWN(mp)); 1081 return -EIO; 1082 } 1083 1084 oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data; 1085 1086 ASSERT(ifp->if_bytes == dp->i_d.di_size); 1087 ASSERT(ifp->if_u1.if_data != NULL); 1088 ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count)); 1089 ASSERT(dp->i_d.di_nextents == 0); 1090 1091 /* 1092 * Copy the directory into a temporary buffer. 1093 * Then pitch the incore inode data so we can make extents. 1094 */ 1095 sfp = kmem_alloc(ifp->if_bytes, KM_SLEEP); 1096 memcpy(sfp, oldsfp, ifp->if_bytes); 1097 1098 xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK); 1099 xfs_bmap_local_to_extents_empty(dp, XFS_DATA_FORK); 1100 dp->i_d.di_size = 0; 1101 1102 /* 1103 * Add block 0 to the inode. 1104 */ 1105 error = xfs_dir2_grow_inode(args, XFS_DIR2_DATA_SPACE, &blkno); 1106 if (error) 1107 goto out_free; 1108 /* 1109 * Initialize the data block, then convert it to block format. 1110 */ 1111 error = xfs_dir3_data_init(args, blkno, &bp); 1112 if (error) 1113 goto out_free; 1114 xfs_dir3_block_init(mp, tp, bp, dp); 1115 hdr = bp->b_addr; 1116 1117 /* 1118 * Compute size of block "tail" area. 1119 */ 1120 i = (uint)sizeof(*btp) + 1121 (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t); 1122 /* 1123 * The whole thing is initialized to free by the init routine. 1124 * Say we're using the leaf and tail area. 1125 */ 1126 dup = dp->d_ops->data_unused_p(hdr); 1127 needlog = needscan = 0; 1128 error = xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, 1129 i, &needlog, &needscan); 1130 if (error) 1131 goto out_free; 1132 ASSERT(needscan == 0); 1133 /* 1134 * Fill in the tail. 1135 */ 1136 btp = xfs_dir2_block_tail_p(args->geo, hdr); 1137 btp->count = cpu_to_be32(sfp->count + 2); /* ., .. */ 1138 btp->stale = 0; 1139 blp = xfs_dir2_block_leaf_p(btp); 1140 endoffset = (uint)((char *)blp - (char *)hdr); 1141 /* 1142 * Remove the freespace, we'll manage it. 1143 */ 1144 error = xfs_dir2_data_use_free(args, bp, dup, 1145 (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), 1146 be16_to_cpu(dup->length), &needlog, &needscan); 1147 if (error) 1148 goto out_free; 1149 /* 1150 * Create entry for . 1151 */ 1152 dep = dp->d_ops->data_dot_entry_p(hdr); 1153 dep->inumber = cpu_to_be64(dp->i_ino); 1154 dep->namelen = 1; 1155 dep->name[0] = '.'; 1156 dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); 1157 tagp = dp->d_ops->data_entry_tag_p(dep); 1158 *tagp = cpu_to_be16((char *)dep - (char *)hdr); 1159 xfs_dir2_data_log_entry(args, bp, dep); 1160 blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); 1161 blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( 1162 (char *)dep - (char *)hdr)); 1163 /* 1164 * Create entry for .. 1165 */ 1166 dep = dp->d_ops->data_dotdot_entry_p(hdr); 1167 dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp)); 1168 dep->namelen = 2; 1169 dep->name[0] = dep->name[1] = '.'; 1170 dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); 1171 tagp = dp->d_ops->data_entry_tag_p(dep); 1172 *tagp = cpu_to_be16((char *)dep - (char *)hdr); 1173 xfs_dir2_data_log_entry(args, bp, dep); 1174 blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); 1175 blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( 1176 (char *)dep - (char *)hdr)); 1177 offset = dp->d_ops->data_first_offset; 1178 /* 1179 * Loop over existing entries, stuff them in. 1180 */ 1181 i = 0; 1182 if (!sfp->count) 1183 sfep = NULL; 1184 else 1185 sfep = xfs_dir2_sf_firstentry(sfp); 1186 /* 1187 * Need to preserve the existing offset values in the sf directory. 1188 * Insert holes (unused entries) where necessary. 1189 */ 1190 while (offset < endoffset) { 1191 /* 1192 * sfep is null when we reach the end of the list. 1193 */ 1194 if (sfep == NULL) 1195 newoffset = endoffset; 1196 else 1197 newoffset = xfs_dir2_sf_get_offset(sfep); 1198 /* 1199 * There should be a hole here, make one. 1200 */ 1201 if (offset < newoffset) { 1202 dup = (xfs_dir2_data_unused_t *)((char *)hdr + offset); 1203 dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); 1204 dup->length = cpu_to_be16(newoffset - offset); 1205 *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( 1206 ((char *)dup - (char *)hdr)); 1207 xfs_dir2_data_log_unused(args, bp, dup); 1208 xfs_dir2_data_freeinsert(hdr, 1209 dp->d_ops->data_bestfree_p(hdr), 1210 dup, &dummy); 1211 offset += be16_to_cpu(dup->length); 1212 continue; 1213 } 1214 /* 1215 * Copy a real entry. 1216 */ 1217 dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); 1218 dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep)); 1219 dep->namelen = sfep->namelen; 1220 dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep)); 1221 memcpy(dep->name, sfep->name, dep->namelen); 1222 tagp = dp->d_ops->data_entry_tag_p(dep); 1223 *tagp = cpu_to_be16((char *)dep - (char *)hdr); 1224 xfs_dir2_data_log_entry(args, bp, dep); 1225 name.name = sfep->name; 1226 name.len = sfep->namelen; 1227 blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> 1228 hashname(&name)); 1229 blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr( 1230 (char *)dep - (char *)hdr)); 1231 offset = (int)((char *)(tagp + 1) - (char *)hdr); 1232 if (++i == sfp->count) 1233 sfep = NULL; 1234 else 1235 sfep = dp->d_ops->sf_nextentry(sfp, sfep); 1236 } 1237 /* Done with the temporary buffer */ 1238 kmem_free(sfp); 1239 /* 1240 * Sort the leaf entries by hash value. 1241 */ 1242 xfs_sort(blp, be32_to_cpu(btp->count), sizeof(*blp), xfs_dir2_block_sort); 1243 /* 1244 * Log the leaf entry area and tail. 1245 * Already logged the header in data_init, ignore needlog. 1246 */ 1247 ASSERT(needscan == 0); 1248 xfs_dir2_block_log_leaf(tp, bp, 0, be32_to_cpu(btp->count) - 1); 1249 xfs_dir2_block_log_tail(tp, bp); 1250 xfs_dir3_data_check(dp, bp); 1251 return 0; 1252 out_free: 1253 kmem_free(sfp); 1254 return error; 1255 } 1256