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