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