1 /* 2 * Copyright (c) 2000-2006 Silicon Graphics, Inc. 3 * Copyright (c) 2012-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_types.h" 22 #include "xfs_bit.h" 23 #include "xfs_log.h" 24 #include "xfs_trans.h" 25 #include "xfs_sb.h" 26 #include "xfs_ag.h" 27 #include "xfs_dir2.h" 28 #include "xfs_mount.h" 29 #include "xfs_da_btree.h" 30 #include "xfs_bmap_btree.h" 31 #include "xfs_ialloc_btree.h" 32 #include "xfs_dinode.h" 33 #include "xfs_inode.h" 34 #include "xfs_inode_item.h" 35 #include "xfs_itable.h" 36 #include "xfs_ialloc.h" 37 #include "xfs_alloc.h" 38 #include "xfs_bmap.h" 39 #include "xfs_error.h" 40 #include "xfs_quota.h" 41 #include "xfs_utils.h" 42 #include "xfs_trans_space.h" 43 #include "xfs_log_priv.h" 44 #include "xfs_trace.h" 45 #include "xfs_symlink.h" 46 #include "xfs_cksum.h" 47 #include "xfs_buf_item.h" 48 49 50 /* 51 * Each contiguous block has a header, so it is not just a simple pathlen 52 * to FSB conversion. 53 */ 54 int 55 xfs_symlink_blocks( 56 struct xfs_mount *mp, 57 int pathlen) 58 { 59 int buflen = XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); 60 61 return (pathlen + buflen - 1) / buflen; 62 } 63 64 static int 65 xfs_symlink_hdr_set( 66 struct xfs_mount *mp, 67 xfs_ino_t ino, 68 uint32_t offset, 69 uint32_t size, 70 struct xfs_buf *bp) 71 { 72 struct xfs_dsymlink_hdr *dsl = bp->b_addr; 73 74 if (!xfs_sb_version_hascrc(&mp->m_sb)) 75 return 0; 76 77 dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); 78 dsl->sl_offset = cpu_to_be32(offset); 79 dsl->sl_bytes = cpu_to_be32(size); 80 uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); 81 dsl->sl_owner = cpu_to_be64(ino); 82 dsl->sl_blkno = cpu_to_be64(bp->b_bn); 83 bp->b_ops = &xfs_symlink_buf_ops; 84 85 return sizeof(struct xfs_dsymlink_hdr); 86 } 87 88 /* 89 * Checking of the symlink header is split into two parts. the verifier does 90 * CRC, location and bounds checking, the unpacking function checks the path 91 * parameters and owner. 92 */ 93 bool 94 xfs_symlink_hdr_ok( 95 struct xfs_mount *mp, 96 xfs_ino_t ino, 97 uint32_t offset, 98 uint32_t size, 99 struct xfs_buf *bp) 100 { 101 struct xfs_dsymlink_hdr *dsl = bp->b_addr; 102 103 if (offset != be32_to_cpu(dsl->sl_offset)) 104 return false; 105 if (size != be32_to_cpu(dsl->sl_bytes)) 106 return false; 107 if (ino != be64_to_cpu(dsl->sl_owner)) 108 return false; 109 110 /* ok */ 111 return true; 112 } 113 114 static bool 115 xfs_symlink_verify( 116 struct xfs_buf *bp) 117 { 118 struct xfs_mount *mp = bp->b_target->bt_mount; 119 struct xfs_dsymlink_hdr *dsl = bp->b_addr; 120 121 if (!xfs_sb_version_hascrc(&mp->m_sb)) 122 return false; 123 if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) 124 return false; 125 if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) 126 return false; 127 if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) 128 return false; 129 if (be32_to_cpu(dsl->sl_offset) + 130 be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) 131 return false; 132 if (dsl->sl_owner == 0) 133 return false; 134 135 return true; 136 } 137 138 static void 139 xfs_symlink_read_verify( 140 struct xfs_buf *bp) 141 { 142 struct xfs_mount *mp = bp->b_target->bt_mount; 143 144 /* no verification of non-crc buffers */ 145 if (!xfs_sb_version_hascrc(&mp->m_sb)) 146 return; 147 148 if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), 149 offsetof(struct xfs_dsymlink_hdr, sl_crc)) || 150 !xfs_symlink_verify(bp)) { 151 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); 152 xfs_buf_ioerror(bp, EFSCORRUPTED); 153 } 154 } 155 156 static void 157 xfs_symlink_write_verify( 158 struct xfs_buf *bp) 159 { 160 struct xfs_mount *mp = bp->b_target->bt_mount; 161 struct xfs_buf_log_item *bip = bp->b_fspriv; 162 163 /* no verification of non-crc buffers */ 164 if (!xfs_sb_version_hascrc(&mp->m_sb)) 165 return; 166 167 if (!xfs_symlink_verify(bp)) { 168 XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); 169 xfs_buf_ioerror(bp, EFSCORRUPTED); 170 return; 171 } 172 173 if (bip) { 174 struct xfs_dsymlink_hdr *dsl = bp->b_addr; 175 dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); 176 } 177 xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), 178 offsetof(struct xfs_dsymlink_hdr, sl_crc)); 179 } 180 181 const struct xfs_buf_ops xfs_symlink_buf_ops = { 182 .verify_read = xfs_symlink_read_verify, 183 .verify_write = xfs_symlink_write_verify, 184 }; 185 186 void 187 xfs_symlink_local_to_remote( 188 struct xfs_trans *tp, 189 struct xfs_buf *bp, 190 struct xfs_inode *ip, 191 struct xfs_ifork *ifp) 192 { 193 struct xfs_mount *mp = ip->i_mount; 194 char *buf; 195 196 if (!xfs_sb_version_hascrc(&mp->m_sb)) { 197 bp->b_ops = NULL; 198 memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); 199 return; 200 } 201 202 /* 203 * As this symlink fits in an inode literal area, it must also fit in 204 * the smallest buffer the filesystem supports. 205 */ 206 ASSERT(BBTOB(bp->b_length) >= 207 ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); 208 209 bp->b_ops = &xfs_symlink_buf_ops; 210 211 buf = bp->b_addr; 212 buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); 213 memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); 214 } 215 216 /* ----- Kernel only functions below ----- */ 217 STATIC int 218 xfs_readlink_bmap( 219 struct xfs_inode *ip, 220 char *link) 221 { 222 struct xfs_mount *mp = ip->i_mount; 223 struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; 224 struct xfs_buf *bp; 225 xfs_daddr_t d; 226 char *cur_chunk; 227 int pathlen = ip->i_d.di_size; 228 int nmaps = XFS_SYMLINK_MAPS; 229 int byte_cnt; 230 int n; 231 int error = 0; 232 int fsblocks = 0; 233 int offset; 234 235 fsblocks = xfs_symlink_blocks(mp, pathlen); 236 error = xfs_bmapi_read(ip, 0, fsblocks, mval, &nmaps, 0); 237 if (error) 238 goto out; 239 240 offset = 0; 241 for (n = 0; n < nmaps; n++) { 242 d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); 243 byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); 244 245 bp = xfs_buf_read(mp->m_ddev_targp, d, BTOBB(byte_cnt), 0, 246 &xfs_symlink_buf_ops); 247 if (!bp) 248 return XFS_ERROR(ENOMEM); 249 error = bp->b_error; 250 if (error) { 251 xfs_buf_ioerror_alert(bp, __func__); 252 xfs_buf_relse(bp); 253 goto out; 254 } 255 byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); 256 if (pathlen < byte_cnt) 257 byte_cnt = pathlen; 258 259 cur_chunk = bp->b_addr; 260 if (xfs_sb_version_hascrc(&mp->m_sb)) { 261 if (!xfs_symlink_hdr_ok(mp, ip->i_ino, offset, 262 byte_cnt, bp)) { 263 error = EFSCORRUPTED; 264 xfs_alert(mp, 265 "symlink header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", 266 offset, byte_cnt, ip->i_ino); 267 xfs_buf_relse(bp); 268 goto out; 269 270 } 271 272 cur_chunk += sizeof(struct xfs_dsymlink_hdr); 273 } 274 275 memcpy(link + offset, bp->b_addr, byte_cnt); 276 277 pathlen -= byte_cnt; 278 offset += byte_cnt; 279 280 xfs_buf_relse(bp); 281 } 282 ASSERT(pathlen == 0); 283 284 link[ip->i_d.di_size] = '\0'; 285 error = 0; 286 287 out: 288 return error; 289 } 290 291 int 292 xfs_readlink( 293 struct xfs_inode *ip, 294 char *link) 295 { 296 struct xfs_mount *mp = ip->i_mount; 297 xfs_fsize_t pathlen; 298 int error = 0; 299 300 trace_xfs_readlink(ip); 301 302 if (XFS_FORCED_SHUTDOWN(mp)) 303 return XFS_ERROR(EIO); 304 305 xfs_ilock(ip, XFS_ILOCK_SHARED); 306 307 pathlen = ip->i_d.di_size; 308 if (!pathlen) 309 goto out; 310 311 if (pathlen < 0 || pathlen > MAXPATHLEN) { 312 xfs_alert(mp, "%s: inode (%llu) bad symlink length (%lld)", 313 __func__, (unsigned long long) ip->i_ino, 314 (long long) pathlen); 315 ASSERT(0); 316 error = XFS_ERROR(EFSCORRUPTED); 317 goto out; 318 } 319 320 321 if (ip->i_df.if_flags & XFS_IFINLINE) { 322 memcpy(link, ip->i_df.if_u1.if_data, pathlen); 323 link[pathlen] = '\0'; 324 } else { 325 error = xfs_readlink_bmap(ip, link); 326 } 327 328 out: 329 xfs_iunlock(ip, XFS_ILOCK_SHARED); 330 return error; 331 } 332 333 int 334 xfs_symlink( 335 struct xfs_inode *dp, 336 struct xfs_name *link_name, 337 const char *target_path, 338 umode_t mode, 339 struct xfs_inode **ipp) 340 { 341 struct xfs_mount *mp = dp->i_mount; 342 struct xfs_trans *tp = NULL; 343 struct xfs_inode *ip = NULL; 344 int error = 0; 345 int pathlen; 346 struct xfs_bmap_free free_list; 347 xfs_fsblock_t first_block; 348 bool unlock_dp_on_error = false; 349 uint cancel_flags; 350 int committed; 351 xfs_fileoff_t first_fsb; 352 xfs_filblks_t fs_blocks; 353 int nmaps; 354 struct xfs_bmbt_irec mval[XFS_SYMLINK_MAPS]; 355 xfs_daddr_t d; 356 const char *cur_chunk; 357 int byte_cnt; 358 int n; 359 xfs_buf_t *bp; 360 prid_t prid; 361 struct xfs_dquot *udqp = NULL; 362 struct xfs_dquot *gdqp = NULL; 363 uint resblks; 364 365 *ipp = NULL; 366 367 trace_xfs_symlink(dp, link_name); 368 369 if (XFS_FORCED_SHUTDOWN(mp)) 370 return XFS_ERROR(EIO); 371 372 /* 373 * Check component lengths of the target path name. 374 */ 375 pathlen = strlen(target_path); 376 if (pathlen >= MAXPATHLEN) /* total string too long */ 377 return XFS_ERROR(ENAMETOOLONG); 378 379 udqp = gdqp = NULL; 380 if (dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) 381 prid = xfs_get_projid(dp); 382 else 383 prid = XFS_PROJID_DEFAULT; 384 385 /* 386 * Make sure that we have allocated dquot(s) on disk. 387 */ 388 error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid, 389 XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp); 390 if (error) 391 goto std_return; 392 393 tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); 394 cancel_flags = XFS_TRANS_RELEASE_LOG_RES; 395 /* 396 * The symlink will fit into the inode data fork? 397 * There can't be any attributes so we get the whole variable part. 398 */ 399 if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version)) 400 fs_blocks = 0; 401 else 402 fs_blocks = xfs_symlink_blocks(mp, pathlen); 403 resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks); 404 error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0, 405 XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); 406 if (error == ENOSPC && fs_blocks == 0) { 407 resblks = 0; 408 error = xfs_trans_reserve(tp, 0, XFS_SYMLINK_LOG_RES(mp), 0, 409 XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); 410 } 411 if (error) { 412 cancel_flags = 0; 413 goto error_return; 414 } 415 416 xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); 417 unlock_dp_on_error = true; 418 419 /* 420 * Check whether the directory allows new symlinks or not. 421 */ 422 if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { 423 error = XFS_ERROR(EPERM); 424 goto error_return; 425 } 426 427 /* 428 * Reserve disk quota : blocks and inode. 429 */ 430 error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, resblks, 1, 0); 431 if (error) 432 goto error_return; 433 434 /* 435 * Check for ability to enter directory entry, if no space reserved. 436 */ 437 error = xfs_dir_canenter(tp, dp, link_name, resblks); 438 if (error) 439 goto error_return; 440 /* 441 * Initialize the bmap freelist prior to calling either 442 * bmapi or the directory create code. 443 */ 444 xfs_bmap_init(&free_list, &first_block); 445 446 /* 447 * Allocate an inode for the symlink. 448 */ 449 error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, 450 prid, resblks > 0, &ip, NULL); 451 if (error) { 452 if (error == ENOSPC) 453 goto error_return; 454 goto error1; 455 } 456 457 /* 458 * An error after we've joined dp to the transaction will result in the 459 * transaction cancel unlocking dp so don't do it explicitly in the 460 * error path. 461 */ 462 xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); 463 unlock_dp_on_error = false; 464 465 /* 466 * Also attach the dquot(s) to it, if applicable. 467 */ 468 xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp); 469 470 if (resblks) 471 resblks -= XFS_IALLOC_SPACE_RES(mp); 472 /* 473 * If the symlink will fit into the inode, write it inline. 474 */ 475 if (pathlen <= XFS_IFORK_DSIZE(ip)) { 476 xfs_idata_realloc(ip, pathlen, XFS_DATA_FORK); 477 memcpy(ip->i_df.if_u1.if_data, target_path, pathlen); 478 ip->i_d.di_size = pathlen; 479 480 /* 481 * The inode was initially created in extent format. 482 */ 483 ip->i_df.if_flags &= ~(XFS_IFEXTENTS | XFS_IFBROOT); 484 ip->i_df.if_flags |= XFS_IFINLINE; 485 486 ip->i_d.di_format = XFS_DINODE_FMT_LOCAL; 487 xfs_trans_log_inode(tp, ip, XFS_ILOG_DDATA | XFS_ILOG_CORE); 488 489 } else { 490 int offset; 491 492 first_fsb = 0; 493 nmaps = XFS_SYMLINK_MAPS; 494 495 error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, 496 XFS_BMAPI_METADATA, &first_block, resblks, 497 mval, &nmaps, &free_list); 498 if (error) 499 goto error2; 500 501 if (resblks) 502 resblks -= fs_blocks; 503 ip->i_d.di_size = pathlen; 504 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 505 506 cur_chunk = target_path; 507 offset = 0; 508 for (n = 0; n < nmaps; n++) { 509 char *buf; 510 511 d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock); 512 byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); 513 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, 514 BTOBB(byte_cnt), 0); 515 if (!bp) { 516 error = ENOMEM; 517 goto error2; 518 } 519 bp->b_ops = &xfs_symlink_buf_ops; 520 521 byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); 522 byte_cnt = min(byte_cnt, pathlen); 523 524 buf = bp->b_addr; 525 buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, 526 byte_cnt, bp); 527 528 memcpy(buf, cur_chunk, byte_cnt); 529 530 cur_chunk += byte_cnt; 531 pathlen -= byte_cnt; 532 offset += byte_cnt; 533 534 xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - 535 (char *)bp->b_addr); 536 } 537 ASSERT(pathlen == 0); 538 } 539 540 /* 541 * Create the directory entry for the symlink. 542 */ 543 error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, 544 &first_block, &free_list, resblks); 545 if (error) 546 goto error2; 547 xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); 548 xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); 549 550 /* 551 * If this is a synchronous mount, make sure that the 552 * symlink transaction goes to disk before returning to 553 * the user. 554 */ 555 if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { 556 xfs_trans_set_sync(tp); 557 } 558 559 error = xfs_bmap_finish(&tp, &free_list, &committed); 560 if (error) { 561 goto error2; 562 } 563 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); 564 xfs_qm_dqrele(udqp); 565 xfs_qm_dqrele(gdqp); 566 567 *ipp = ip; 568 return 0; 569 570 error2: 571 IRELE(ip); 572 error1: 573 xfs_bmap_cancel(&free_list); 574 cancel_flags |= XFS_TRANS_ABORT; 575 error_return: 576 xfs_trans_cancel(tp, cancel_flags); 577 xfs_qm_dqrele(udqp); 578 xfs_qm_dqrele(gdqp); 579 580 if (unlock_dp_on_error) 581 xfs_iunlock(dp, XFS_ILOCK_EXCL); 582 std_return: 583 return error; 584 } 585 586 /* 587 * Free a symlink that has blocks associated with it. 588 */ 589 STATIC int 590 xfs_inactive_symlink_rmt( 591 xfs_inode_t *ip, 592 xfs_trans_t **tpp) 593 { 594 xfs_buf_t *bp; 595 int committed; 596 int done; 597 int error; 598 xfs_fsblock_t first_block; 599 xfs_bmap_free_t free_list; 600 int i; 601 xfs_mount_t *mp; 602 xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; 603 int nmaps; 604 xfs_trans_t *ntp; 605 int size; 606 xfs_trans_t *tp; 607 608 tp = *tpp; 609 mp = ip->i_mount; 610 ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); 611 /* 612 * We're freeing a symlink that has some 613 * blocks allocated to it. Free the 614 * blocks here. We know that we've got 615 * either 1 or 2 extents and that we can 616 * free them all in one bunmapi call. 617 */ 618 ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); 619 620 /* 621 * Lock the inode, fix the size, and join it to the transaction. 622 * Hold it so in the normal path, we still have it locked for 623 * the second transaction. In the error paths we need it 624 * held so the cancel won't rele it, see below. 625 */ 626 size = (int)ip->i_d.di_size; 627 ip->i_d.di_size = 0; 628 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 629 /* 630 * Find the block(s) so we can inval and unmap them. 631 */ 632 done = 0; 633 xfs_bmap_init(&free_list, &first_block); 634 nmaps = ARRAY_SIZE(mval); 635 error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), 636 mval, &nmaps, 0); 637 if (error) 638 goto error0; 639 /* 640 * Invalidate the block(s). No validation is done. 641 */ 642 for (i = 0; i < nmaps; i++) { 643 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, 644 XFS_FSB_TO_DADDR(mp, mval[i].br_startblock), 645 XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); 646 if (!bp) { 647 error = ENOMEM; 648 goto error1; 649 } 650 xfs_trans_binval(tp, bp); 651 } 652 /* 653 * Unmap the dead block(s) to the free_list. 654 */ 655 if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, 656 &first_block, &free_list, &done))) 657 goto error1; 658 ASSERT(done); 659 /* 660 * Commit the first transaction. This logs the EFI and the inode. 661 */ 662 if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) 663 goto error1; 664 /* 665 * The transaction must have been committed, since there were 666 * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. 667 * The new tp has the extent freeing and EFDs. 668 */ 669 ASSERT(committed); 670 /* 671 * The first xact was committed, so add the inode to the new one. 672 * Mark it dirty so it will be logged and moved forward in the log as 673 * part of every commit. 674 */ 675 xfs_trans_ijoin(tp, ip, 0); 676 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 677 /* 678 * Get a new, empty transaction to return to our caller. 679 */ 680 ntp = xfs_trans_dup(tp); 681 /* 682 * Commit the transaction containing extent freeing and EFDs. 683 * If we get an error on the commit here or on the reserve below, 684 * we need to unlock the inode since the new transaction doesn't 685 * have the inode attached. 686 */ 687 error = xfs_trans_commit(tp, 0); 688 tp = ntp; 689 if (error) { 690 ASSERT(XFS_FORCED_SHUTDOWN(mp)); 691 goto error0; 692 } 693 /* 694 * transaction commit worked ok so we can drop the extra ticket 695 * reference that we gained in xfs_trans_dup() 696 */ 697 xfs_log_ticket_put(tp->t_ticket); 698 699 /* 700 * Remove the memory for extent descriptions (just bookkeeping). 701 */ 702 if (ip->i_df.if_bytes) 703 xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); 704 ASSERT(ip->i_df.if_bytes == 0); 705 /* 706 * Put an itruncate log reservation in the new transaction 707 * for our caller. 708 */ 709 if ((error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, 710 XFS_TRANS_PERM_LOG_RES, XFS_ITRUNCATE_LOG_COUNT))) { 711 ASSERT(XFS_FORCED_SHUTDOWN(mp)); 712 goto error0; 713 } 714 715 xfs_trans_ijoin(tp, ip, 0); 716 *tpp = tp; 717 return 0; 718 719 error1: 720 xfs_bmap_cancel(&free_list); 721 error0: 722 return error; 723 } 724 725 /* 726 * xfs_inactive_symlink - free a symlink 727 */ 728 int 729 xfs_inactive_symlink( 730 struct xfs_inode *ip, 731 struct xfs_trans **tp) 732 { 733 struct xfs_mount *mp = ip->i_mount; 734 int pathlen; 735 736 trace_xfs_inactive_symlink(ip); 737 738 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); 739 740 if (XFS_FORCED_SHUTDOWN(mp)) 741 return XFS_ERROR(EIO); 742 743 /* 744 * Zero length symlinks _can_ exist. 745 */ 746 pathlen = (int)ip->i_d.di_size; 747 if (!pathlen) 748 return 0; 749 750 if (pathlen < 0 || pathlen > MAXPATHLEN) { 751 xfs_alert(mp, "%s: inode (0x%llx) bad symlink length (%d)", 752 __func__, (unsigned long long)ip->i_ino, pathlen); 753 ASSERT(0); 754 return XFS_ERROR(EFSCORRUPTED); 755 } 756 757 if (ip->i_df.if_flags & XFS_IFINLINE) { 758 if (ip->i_df.if_bytes > 0) 759 xfs_idata_realloc(ip, -(ip->i_df.if_bytes), 760 XFS_DATA_FORK); 761 ASSERT(ip->i_df.if_bytes == 0); 762 return 0; 763 } 764 765 /* remove the remote symlink */ 766 return xfs_inactive_symlink_rmt(ip, tp); 767 } 768