1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 4 * All Rights Reserved. 5 */ 6 #include "xfs.h" 7 #include "xfs_fs.h" 8 #include "xfs_shared.h" 9 #include "xfs_format.h" 10 #include "xfs_log_format.h" 11 #include "xfs_trans_resv.h" 12 #include "xfs_mount.h" 13 #include "xfs_defer.h" 14 #include "xfs_da_format.h" 15 #include "xfs_da_btree.h" 16 #include "xfs_attr_sf.h" 17 #include "xfs_inode.h" 18 #include "xfs_trans.h" 19 #include "xfs_bmap.h" 20 #include "xfs_bmap_btree.h" 21 #include "xfs_attr.h" 22 #include "xfs_attr_leaf.h" 23 #include "xfs_attr_remote.h" 24 #include "xfs_quota.h" 25 #include "xfs_trans_space.h" 26 #include "xfs_trace.h" 27 28 /* 29 * xfs_attr.c 30 * 31 * Provide the external interfaces to manage attribute lists. 32 */ 33 34 /*======================================================================== 35 * Function prototypes for the kernel. 36 *========================================================================*/ 37 38 /* 39 * Internal routines when attribute list fits inside the inode. 40 */ 41 STATIC int xfs_attr_shortform_addname(xfs_da_args_t *args); 42 43 /* 44 * Internal routines when attribute list is one block. 45 */ 46 STATIC int xfs_attr_leaf_get(xfs_da_args_t *args); 47 STATIC int xfs_attr_leaf_addname(xfs_da_args_t *args); 48 STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args); 49 STATIC int xfs_attr_leaf_hasname(struct xfs_da_args *args, struct xfs_buf **bp); 50 51 /* 52 * Internal routines when attribute list is more than one block. 53 */ 54 STATIC int xfs_attr_node_get(xfs_da_args_t *args); 55 STATIC int xfs_attr_node_addname(xfs_da_args_t *args); 56 STATIC int xfs_attr_node_removename(xfs_da_args_t *args); 57 STATIC int xfs_attr_node_hasname(xfs_da_args_t *args, 58 struct xfs_da_state **state); 59 STATIC int xfs_attr_fillstate(xfs_da_state_t *state); 60 STATIC int xfs_attr_refillstate(xfs_da_state_t *state); 61 62 int 63 xfs_inode_hasattr( 64 struct xfs_inode *ip) 65 { 66 if (!XFS_IFORK_Q(ip) || 67 (ip->i_afp->if_format == XFS_DINODE_FMT_EXTENTS && 68 ip->i_afp->if_nextents == 0)) 69 return 0; 70 return 1; 71 } 72 73 /* 74 * Returns true if the there is exactly only block in the attr fork, in which 75 * case the attribute fork consists of a single leaf block entry. 76 */ 77 bool 78 xfs_attr_is_leaf( 79 struct xfs_inode *ip) 80 { 81 struct xfs_ifork *ifp = ip->i_afp; 82 struct xfs_iext_cursor icur; 83 struct xfs_bmbt_irec imap; 84 85 if (ifp->if_nextents != 1 || ifp->if_format != XFS_DINODE_FMT_EXTENTS) 86 return false; 87 88 xfs_iext_first(ifp, &icur); 89 xfs_iext_get_extent(ifp, &icur, &imap); 90 return imap.br_startoff == 0 && imap.br_blockcount == 1; 91 } 92 93 /*======================================================================== 94 * Overall external interface routines. 95 *========================================================================*/ 96 97 /* 98 * Retrieve an extended attribute and its value. Must have ilock. 99 * Returns 0 on successful retrieval, otherwise an error. 100 */ 101 int 102 xfs_attr_get_ilocked( 103 struct xfs_da_args *args) 104 { 105 ASSERT(xfs_isilocked(args->dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); 106 107 if (!xfs_inode_hasattr(args->dp)) 108 return -ENOATTR; 109 110 if (args->dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) 111 return xfs_attr_shortform_getvalue(args); 112 if (xfs_attr_is_leaf(args->dp)) 113 return xfs_attr_leaf_get(args); 114 return xfs_attr_node_get(args); 115 } 116 117 /* 118 * Retrieve an extended attribute by name, and its value if requested. 119 * 120 * If args->valuelen is zero, then the caller does not want the value, just an 121 * indication whether the attribute exists and the size of the value if it 122 * exists. The size is returned in args.valuelen. 123 * 124 * If args->value is NULL but args->valuelen is non-zero, allocate the buffer 125 * for the value after existence of the attribute has been determined. The 126 * caller always has to free args->value if it is set, no matter if this 127 * function was successful or not. 128 * 129 * If the attribute is found, but exceeds the size limit set by the caller in 130 * args->valuelen, return -ERANGE with the size of the attribute that was found 131 * in args->valuelen. 132 */ 133 int 134 xfs_attr_get( 135 struct xfs_da_args *args) 136 { 137 uint lock_mode; 138 int error; 139 140 XFS_STATS_INC(args->dp->i_mount, xs_attr_get); 141 142 if (XFS_FORCED_SHUTDOWN(args->dp->i_mount)) 143 return -EIO; 144 145 args->geo = args->dp->i_mount->m_attr_geo; 146 args->whichfork = XFS_ATTR_FORK; 147 args->hashval = xfs_da_hashname(args->name, args->namelen); 148 149 /* Entirely possible to look up a name which doesn't exist */ 150 args->op_flags = XFS_DA_OP_OKNOENT; 151 152 lock_mode = xfs_ilock_attr_map_shared(args->dp); 153 error = xfs_attr_get_ilocked(args); 154 xfs_iunlock(args->dp, lock_mode); 155 156 return error; 157 } 158 159 /* 160 * Calculate how many blocks we need for the new attribute, 161 */ 162 STATIC int 163 xfs_attr_calc_size( 164 struct xfs_da_args *args, 165 int *local) 166 { 167 struct xfs_mount *mp = args->dp->i_mount; 168 int size; 169 int nblks; 170 171 /* 172 * Determine space new attribute will use, and if it would be 173 * "local" or "remote" (note: local != inline). 174 */ 175 size = xfs_attr_leaf_newentsize(args, local); 176 nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); 177 if (*local) { 178 if (size > (args->geo->blksize / 2)) { 179 /* Double split possible */ 180 nblks *= 2; 181 } 182 } else { 183 /* 184 * Out of line attribute, cannot double split, but 185 * make room for the attribute value itself. 186 */ 187 uint dblocks = xfs_attr3_rmt_blocks(mp, args->valuelen); 188 nblks += dblocks; 189 nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); 190 } 191 192 return nblks; 193 } 194 195 STATIC int 196 xfs_attr_try_sf_addname( 197 struct xfs_inode *dp, 198 struct xfs_da_args *args) 199 { 200 201 int error; 202 203 /* 204 * Build initial attribute list (if required). 205 */ 206 if (dp->i_afp->if_format == XFS_DINODE_FMT_EXTENTS) 207 xfs_attr_shortform_create(args); 208 209 error = xfs_attr_shortform_addname(args); 210 if (error == -ENOSPC) 211 return error; 212 213 /* 214 * Commit the shortform mods, and we're done. 215 * NOTE: this is also the error path (EEXIST, etc). 216 */ 217 if (!error && !(args->op_flags & XFS_DA_OP_NOTIME)) 218 xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); 219 220 if (dp->i_mount->m_flags & XFS_MOUNT_WSYNC) 221 xfs_trans_set_sync(args->trans); 222 223 return error; 224 } 225 226 /* 227 * Check to see if the attr should be upgraded from non-existent or shortform to 228 * single-leaf-block attribute list. 229 */ 230 static inline bool 231 xfs_attr_is_shortform( 232 struct xfs_inode *ip) 233 { 234 return ip->i_afp->if_format == XFS_DINODE_FMT_LOCAL || 235 (ip->i_afp->if_format == XFS_DINODE_FMT_EXTENTS && 236 ip->i_afp->if_nextents == 0); 237 } 238 239 /* 240 * Attempts to set an attr in shortform, or converts short form to leaf form if 241 * there is not enough room. If the attr is set, the transaction is committed 242 * and set to NULL. 243 */ 244 STATIC int 245 xfs_attr_set_shortform( 246 struct xfs_da_args *args, 247 struct xfs_buf **leaf_bp) 248 { 249 struct xfs_inode *dp = args->dp; 250 int error, error2 = 0; 251 252 /* 253 * Try to add the attr to the attribute list in the inode. 254 */ 255 error = xfs_attr_try_sf_addname(dp, args); 256 if (error != -ENOSPC) { 257 error2 = xfs_trans_commit(args->trans); 258 args->trans = NULL; 259 return error ? error : error2; 260 } 261 /* 262 * It won't fit in the shortform, transform to a leaf block. GROT: 263 * another possible req'mt for a double-split btree op. 264 */ 265 error = xfs_attr_shortform_to_leaf(args, leaf_bp); 266 if (error) 267 return error; 268 269 /* 270 * Prevent the leaf buffer from being unlocked so that a concurrent AIL 271 * push cannot grab the half-baked leaf buffer and run into problems 272 * with the write verifier. Once we're done rolling the transaction we 273 * can release the hold and add the attr to the leaf. 274 */ 275 xfs_trans_bhold(args->trans, *leaf_bp); 276 error = xfs_defer_finish(&args->trans); 277 xfs_trans_bhold_release(args->trans, *leaf_bp); 278 if (error) { 279 xfs_trans_brelse(args->trans, *leaf_bp); 280 return error; 281 } 282 283 return 0; 284 } 285 286 /* 287 * Set the attribute specified in @args. 288 */ 289 int 290 xfs_attr_set_args( 291 struct xfs_da_args *args) 292 { 293 struct xfs_inode *dp = args->dp; 294 struct xfs_buf *leaf_bp = NULL; 295 int error = 0; 296 297 /* 298 * If the attribute list is already in leaf format, jump straight to 299 * leaf handling. Otherwise, try to add the attribute to the shortform 300 * list; if there's no room then convert the list to leaf format and try 301 * again. 302 */ 303 if (xfs_attr_is_shortform(dp)) { 304 305 /* 306 * If the attr was successfully set in shortform, the 307 * transaction is committed and set to NULL. Otherwise, is it 308 * converted from shortform to leaf, and the transaction is 309 * retained. 310 */ 311 error = xfs_attr_set_shortform(args, &leaf_bp); 312 if (error || !args->trans) 313 return error; 314 } 315 316 if (xfs_attr_is_leaf(dp)) { 317 error = xfs_attr_leaf_addname(args); 318 if (error != -ENOSPC) 319 return error; 320 321 /* 322 * Promote the attribute list to the Btree format. 323 */ 324 error = xfs_attr3_leaf_to_node(args); 325 if (error) 326 return error; 327 328 /* 329 * Finish any deferred work items and roll the transaction once 330 * more. The goal here is to call node_addname with the inode 331 * and transaction in the same state (inode locked and joined, 332 * transaction clean) no matter how we got to this step. 333 */ 334 error = xfs_defer_finish(&args->trans); 335 if (error) 336 return error; 337 338 /* 339 * Commit the current trans (including the inode) and 340 * start a new one. 341 */ 342 error = xfs_trans_roll_inode(&args->trans, dp); 343 if (error) 344 return error; 345 } 346 347 error = xfs_attr_node_addname(args); 348 return error; 349 } 350 351 /* 352 * Return EEXIST if attr is found, or ENOATTR if not 353 */ 354 int 355 xfs_has_attr( 356 struct xfs_da_args *args) 357 { 358 struct xfs_inode *dp = args->dp; 359 struct xfs_buf *bp = NULL; 360 int error; 361 362 if (!xfs_inode_hasattr(dp)) 363 return -ENOATTR; 364 365 if (dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) 366 return xfs_attr_sf_findname(args, NULL, NULL); 367 368 if (xfs_attr_is_leaf(dp)) { 369 error = xfs_attr_leaf_hasname(args, &bp); 370 371 if (bp) 372 xfs_trans_brelse(args->trans, bp); 373 374 return error; 375 } 376 377 return xfs_attr_node_hasname(args, NULL); 378 } 379 380 /* 381 * Remove the attribute specified in @args. 382 */ 383 int 384 xfs_attr_remove_args( 385 struct xfs_da_args *args) 386 { 387 if (!xfs_inode_hasattr(args->dp)) 388 return -ENOATTR; 389 390 if (args->dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) 391 return xfs_attr_shortform_remove(args); 392 if (xfs_attr_is_leaf(args->dp)) 393 return xfs_attr_leaf_removename(args); 394 return xfs_attr_node_removename(args); 395 } 396 397 /* 398 * Note: If args->value is NULL the attribute will be removed, just like the 399 * Linux ->setattr API. 400 */ 401 int 402 xfs_attr_set( 403 struct xfs_da_args *args) 404 { 405 struct xfs_inode *dp = args->dp; 406 struct xfs_mount *mp = dp->i_mount; 407 struct xfs_trans_res tres; 408 bool rsvd = (args->attr_filter & XFS_ATTR_ROOT); 409 int error, local; 410 int rmt_blks = 0; 411 unsigned int total; 412 413 if (XFS_FORCED_SHUTDOWN(dp->i_mount)) 414 return -EIO; 415 416 error = xfs_qm_dqattach(dp); 417 if (error) 418 return error; 419 420 args->geo = mp->m_attr_geo; 421 args->whichfork = XFS_ATTR_FORK; 422 args->hashval = xfs_da_hashname(args->name, args->namelen); 423 424 /* 425 * We have no control over the attribute names that userspace passes us 426 * to remove, so we have to allow the name lookup prior to attribute 427 * removal to fail as well. 428 */ 429 args->op_flags = XFS_DA_OP_OKNOENT; 430 431 if (args->value) { 432 XFS_STATS_INC(mp, xs_attr_set); 433 434 args->op_flags |= XFS_DA_OP_ADDNAME; 435 args->total = xfs_attr_calc_size(args, &local); 436 437 /* 438 * If the inode doesn't have an attribute fork, add one. 439 * (inode must not be locked when we call this routine) 440 */ 441 if (XFS_IFORK_Q(dp) == 0) { 442 int sf_size = sizeof(struct xfs_attr_sf_hdr) + 443 xfs_attr_sf_entsize_byname(args->namelen, 444 args->valuelen); 445 446 error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); 447 if (error) 448 return error; 449 } 450 451 tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + 452 M_RES(mp)->tr_attrsetrt.tr_logres * 453 args->total; 454 tres.tr_logcount = XFS_ATTRSET_LOG_COUNT; 455 tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; 456 total = args->total; 457 458 if (!local) 459 rmt_blks = xfs_attr3_rmt_blocks(mp, args->valuelen); 460 } else { 461 XFS_STATS_INC(mp, xs_attr_remove); 462 463 tres = M_RES(mp)->tr_attrrm; 464 total = XFS_ATTRRM_SPACE_RES(mp); 465 rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX); 466 } 467 468 /* 469 * Root fork attributes can use reserved data blocks for this 470 * operation if necessary 471 */ 472 error = xfs_trans_alloc_inode(dp, &tres, total, 0, rsvd, &args->trans); 473 if (error) 474 return error; 475 476 if (args->value || xfs_inode_hasattr(dp)) { 477 error = xfs_iext_count_may_overflow(dp, XFS_ATTR_FORK, 478 XFS_IEXT_ATTR_MANIP_CNT(rmt_blks)); 479 if (error) 480 goto out_trans_cancel; 481 } 482 483 if (args->value) { 484 error = xfs_has_attr(args); 485 if (error == -EEXIST && (args->attr_flags & XATTR_CREATE)) 486 goto out_trans_cancel; 487 if (error == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) 488 goto out_trans_cancel; 489 if (error != -ENOATTR && error != -EEXIST) 490 goto out_trans_cancel; 491 492 error = xfs_attr_set_args(args); 493 if (error) 494 goto out_trans_cancel; 495 /* shortform attribute has already been committed */ 496 if (!args->trans) 497 goto out_unlock; 498 } else { 499 error = xfs_has_attr(args); 500 if (error != -EEXIST) 501 goto out_trans_cancel; 502 503 error = xfs_attr_remove_args(args); 504 if (error) 505 goto out_trans_cancel; 506 } 507 508 /* 509 * If this is a synchronous mount, make sure that the 510 * transaction goes to disk before returning to the user. 511 */ 512 if (mp->m_flags & XFS_MOUNT_WSYNC) 513 xfs_trans_set_sync(args->trans); 514 515 if (!(args->op_flags & XFS_DA_OP_NOTIME)) 516 xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); 517 518 /* 519 * Commit the last in the sequence of transactions. 520 */ 521 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); 522 error = xfs_trans_commit(args->trans); 523 out_unlock: 524 xfs_iunlock(dp, XFS_ILOCK_EXCL); 525 return error; 526 527 out_trans_cancel: 528 if (args->trans) 529 xfs_trans_cancel(args->trans); 530 goto out_unlock; 531 } 532 533 /*======================================================================== 534 * External routines when attribute list is inside the inode 535 *========================================================================*/ 536 537 static inline int xfs_attr_sf_totsize(struct xfs_inode *dp) 538 { 539 struct xfs_attr_shortform *sf; 540 541 sf = (struct xfs_attr_shortform *)dp->i_afp->if_u1.if_data; 542 return be16_to_cpu(sf->hdr.totsize); 543 } 544 545 /* 546 * Add a name to the shortform attribute list structure 547 * This is the external routine. 548 */ 549 STATIC int 550 xfs_attr_shortform_addname(xfs_da_args_t *args) 551 { 552 int newsize, forkoff, retval; 553 554 trace_xfs_attr_sf_addname(args); 555 556 retval = xfs_attr_shortform_lookup(args); 557 if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) 558 return retval; 559 if (retval == -EEXIST) { 560 if (args->attr_flags & XATTR_CREATE) 561 return retval; 562 retval = xfs_attr_shortform_remove(args); 563 if (retval) 564 return retval; 565 /* 566 * Since we have removed the old attr, clear ATTR_REPLACE so 567 * that the leaf format add routine won't trip over the attr 568 * not being around. 569 */ 570 args->attr_flags &= ~XATTR_REPLACE; 571 } 572 573 if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || 574 args->valuelen >= XFS_ATTR_SF_ENTSIZE_MAX) 575 return -ENOSPC; 576 577 newsize = xfs_attr_sf_totsize(args->dp); 578 newsize += xfs_attr_sf_entsize_byname(args->namelen, args->valuelen); 579 580 forkoff = xfs_attr_shortform_bytesfit(args->dp, newsize); 581 if (!forkoff) 582 return -ENOSPC; 583 584 xfs_attr_shortform_add(args, forkoff); 585 return 0; 586 } 587 588 589 /*======================================================================== 590 * External routines when attribute list is one block 591 *========================================================================*/ 592 593 /* Store info about a remote block */ 594 STATIC void 595 xfs_attr_save_rmt_blk( 596 struct xfs_da_args *args) 597 { 598 args->blkno2 = args->blkno; 599 args->index2 = args->index; 600 args->rmtblkno2 = args->rmtblkno; 601 args->rmtblkcnt2 = args->rmtblkcnt; 602 args->rmtvaluelen2 = args->rmtvaluelen; 603 } 604 605 /* Set stored info about a remote block */ 606 STATIC void 607 xfs_attr_restore_rmt_blk( 608 struct xfs_da_args *args) 609 { 610 args->blkno = args->blkno2; 611 args->index = args->index2; 612 args->rmtblkno = args->rmtblkno2; 613 args->rmtblkcnt = args->rmtblkcnt2; 614 args->rmtvaluelen = args->rmtvaluelen2; 615 } 616 617 /* 618 * Tries to add an attribute to an inode in leaf form 619 * 620 * This function is meant to execute as part of a delayed operation and leaves 621 * the transaction handling to the caller. On success the attribute is added 622 * and the inode and transaction are left dirty. If there is not enough space, 623 * the attr data is converted to node format and -ENOSPC is returned. Caller is 624 * responsible for handling the dirty inode and transaction or adding the attr 625 * in node format. 626 */ 627 STATIC int 628 xfs_attr_leaf_try_add( 629 struct xfs_da_args *args, 630 struct xfs_buf *bp) 631 { 632 int retval; 633 634 /* 635 * Look up the given attribute in the leaf block. Figure out if 636 * the given flags produce an error or call for an atomic rename. 637 */ 638 retval = xfs_attr_leaf_hasname(args, &bp); 639 if (retval != -ENOATTR && retval != -EEXIST) 640 return retval; 641 if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) 642 goto out_brelse; 643 if (retval == -EEXIST) { 644 if (args->attr_flags & XATTR_CREATE) 645 goto out_brelse; 646 647 trace_xfs_attr_leaf_replace(args); 648 649 /* save the attribute state for later removal*/ 650 args->op_flags |= XFS_DA_OP_RENAME; /* an atomic rename */ 651 xfs_attr_save_rmt_blk(args); 652 653 /* 654 * clear the remote attr state now that it is saved so that the 655 * values reflect the state of the attribute we are about to 656 * add, not the attribute we just found and will remove later. 657 */ 658 args->rmtblkno = 0; 659 args->rmtblkcnt = 0; 660 args->rmtvaluelen = 0; 661 } 662 663 /* 664 * Add the attribute to the leaf block 665 */ 666 return xfs_attr3_leaf_add(bp, args); 667 668 out_brelse: 669 xfs_trans_brelse(args->trans, bp); 670 return retval; 671 } 672 673 674 /* 675 * Add a name to the leaf attribute list structure 676 * 677 * This leaf block cannot have a "remote" value, we only call this routine 678 * if bmap_one_block() says there is only one block (ie: no remote blks). 679 */ 680 STATIC int 681 xfs_attr_leaf_addname( 682 struct xfs_da_args *args) 683 { 684 int error, forkoff; 685 struct xfs_buf *bp = NULL; 686 struct xfs_inode *dp = args->dp; 687 688 trace_xfs_attr_leaf_addname(args); 689 690 error = xfs_attr_leaf_try_add(args, bp); 691 if (error) 692 return error; 693 694 /* 695 * Commit the transaction that added the attr name so that 696 * later routines can manage their own transactions. 697 */ 698 error = xfs_trans_roll_inode(&args->trans, dp); 699 if (error) 700 return error; 701 702 /* 703 * If there was an out-of-line value, allocate the blocks we 704 * identified for its storage and copy the value. This is done 705 * after we create the attribute so that we don't overflow the 706 * maximum size of a transaction and/or hit a deadlock. 707 */ 708 if (args->rmtblkno > 0) { 709 error = xfs_attr_rmtval_set(args); 710 if (error) 711 return error; 712 } 713 714 if (!(args->op_flags & XFS_DA_OP_RENAME)) { 715 /* 716 * Added a "remote" value, just clear the incomplete flag. 717 */ 718 if (args->rmtblkno > 0) 719 error = xfs_attr3_leaf_clearflag(args); 720 721 return error; 722 } 723 724 /* 725 * If this is an atomic rename operation, we must "flip" the incomplete 726 * flags on the "new" and "old" attribute/value pairs so that one 727 * disappears and one appears atomically. Then we must remove the "old" 728 * attribute/value pair. 729 * 730 * In a separate transaction, set the incomplete flag on the "old" attr 731 * and clear the incomplete flag on the "new" attr. 732 */ 733 734 error = xfs_attr3_leaf_flipflags(args); 735 if (error) 736 return error; 737 /* 738 * Commit the flag value change and start the next trans in series. 739 */ 740 error = xfs_trans_roll_inode(&args->trans, args->dp); 741 if (error) 742 return error; 743 744 /* 745 * Dismantle the "old" attribute/value pair by removing a "remote" value 746 * (if it exists). 747 */ 748 xfs_attr_restore_rmt_blk(args); 749 750 if (args->rmtblkno) { 751 error = xfs_attr_rmtval_invalidate(args); 752 if (error) 753 return error; 754 755 error = xfs_attr_rmtval_remove(args); 756 if (error) 757 return error; 758 } 759 760 /* 761 * Read in the block containing the "old" attr, then remove the "old" 762 * attr from that block (neat, huh!) 763 */ 764 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, 765 &bp); 766 if (error) 767 return error; 768 769 xfs_attr3_leaf_remove(bp, args); 770 771 /* 772 * If the result is small enough, shrink it all into the inode. 773 */ 774 forkoff = xfs_attr_shortform_allfit(bp, dp); 775 if (forkoff) 776 error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); 777 /* bp is gone due to xfs_da_shrink_inode */ 778 779 return error; 780 } 781 782 /* 783 * Return EEXIST if attr is found, or ENOATTR if not 784 */ 785 STATIC int 786 xfs_attr_leaf_hasname( 787 struct xfs_da_args *args, 788 struct xfs_buf **bp) 789 { 790 int error = 0; 791 792 error = xfs_attr3_leaf_read(args->trans, args->dp, 0, bp); 793 if (error) 794 return error; 795 796 error = xfs_attr3_leaf_lookup_int(*bp, args); 797 if (error != -ENOATTR && error != -EEXIST) 798 xfs_trans_brelse(args->trans, *bp); 799 800 return error; 801 } 802 803 /* 804 * Remove a name from the leaf attribute list structure 805 * 806 * This leaf block cannot have a "remote" value, we only call this routine 807 * if bmap_one_block() says there is only one block (ie: no remote blks). 808 */ 809 STATIC int 810 xfs_attr_leaf_removename( 811 struct xfs_da_args *args) 812 { 813 struct xfs_inode *dp; 814 struct xfs_buf *bp; 815 int error, forkoff; 816 817 trace_xfs_attr_leaf_removename(args); 818 819 /* 820 * Remove the attribute. 821 */ 822 dp = args->dp; 823 824 error = xfs_attr_leaf_hasname(args, &bp); 825 826 if (error == -ENOATTR) { 827 xfs_trans_brelse(args->trans, bp); 828 return error; 829 } else if (error != -EEXIST) 830 return error; 831 832 xfs_attr3_leaf_remove(bp, args); 833 834 /* 835 * If the result is small enough, shrink it all into the inode. 836 */ 837 forkoff = xfs_attr_shortform_allfit(bp, dp); 838 if (forkoff) 839 return xfs_attr3_leaf_to_shortform(bp, args, forkoff); 840 /* bp is gone due to xfs_da_shrink_inode */ 841 842 return 0; 843 } 844 845 /* 846 * Look up a name in a leaf attribute list structure. 847 * 848 * This leaf block cannot have a "remote" value, we only call this routine 849 * if bmap_one_block() says there is only one block (ie: no remote blks). 850 * 851 * Returns 0 on successful retrieval, otherwise an error. 852 */ 853 STATIC int 854 xfs_attr_leaf_get(xfs_da_args_t *args) 855 { 856 struct xfs_buf *bp; 857 int error; 858 859 trace_xfs_attr_leaf_get(args); 860 861 error = xfs_attr_leaf_hasname(args, &bp); 862 863 if (error == -ENOATTR) { 864 xfs_trans_brelse(args->trans, bp); 865 return error; 866 } else if (error != -EEXIST) 867 return error; 868 869 870 error = xfs_attr3_leaf_getvalue(bp, args); 871 xfs_trans_brelse(args->trans, bp); 872 return error; 873 } 874 875 /* 876 * Return EEXIST if attr is found, or ENOATTR if not 877 * statep: If not null is set to point at the found state. Caller will 878 * be responsible for freeing the state in this case. 879 */ 880 STATIC int 881 xfs_attr_node_hasname( 882 struct xfs_da_args *args, 883 struct xfs_da_state **statep) 884 { 885 struct xfs_da_state *state; 886 int retval, error; 887 888 state = xfs_da_state_alloc(args); 889 if (statep != NULL) 890 *statep = NULL; 891 892 /* 893 * Search to see if name exists, and get back a pointer to it. 894 */ 895 error = xfs_da3_node_lookup_int(state, &retval); 896 if (error) { 897 xfs_da_state_free(state); 898 return error; 899 } 900 901 if (statep != NULL) 902 *statep = state; 903 else 904 xfs_da_state_free(state); 905 return retval; 906 } 907 908 /*======================================================================== 909 * External routines when attribute list size > geo->blksize 910 *========================================================================*/ 911 912 /* 913 * Add a name to a Btree-format attribute list. 914 * 915 * This will involve walking down the Btree, and may involve splitting 916 * leaf nodes and even splitting intermediate nodes up to and including 917 * the root node (a special case of an intermediate node). 918 * 919 * "Remote" attribute values confuse the issue and atomic rename operations 920 * add a whole extra layer of confusion on top of that. 921 */ 922 STATIC int 923 xfs_attr_node_addname( 924 struct xfs_da_args *args) 925 { 926 struct xfs_da_state *state; 927 struct xfs_da_state_blk *blk; 928 struct xfs_inode *dp; 929 int retval, error; 930 931 trace_xfs_attr_node_addname(args); 932 933 /* 934 * Fill in bucket of arguments/results/context to carry around. 935 */ 936 dp = args->dp; 937 restart: 938 /* 939 * Search to see if name already exists, and get back a pointer 940 * to where it should go. 941 */ 942 error = 0; 943 retval = xfs_attr_node_hasname(args, &state); 944 if (retval != -ENOATTR && retval != -EEXIST) 945 goto out; 946 947 blk = &state->path.blk[ state->path.active-1 ]; 948 ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); 949 if (retval == -ENOATTR && (args->attr_flags & XATTR_REPLACE)) 950 goto out; 951 if (retval == -EEXIST) { 952 if (args->attr_flags & XATTR_CREATE) 953 goto out; 954 955 trace_xfs_attr_node_replace(args); 956 957 /* save the attribute state for later removal*/ 958 args->op_flags |= XFS_DA_OP_RENAME; /* atomic rename op */ 959 xfs_attr_save_rmt_blk(args); 960 961 /* 962 * clear the remote attr state now that it is saved so that the 963 * values reflect the state of the attribute we are about to 964 * add, not the attribute we just found and will remove later. 965 */ 966 args->rmtblkno = 0; 967 args->rmtblkcnt = 0; 968 args->rmtvaluelen = 0; 969 } 970 971 retval = xfs_attr3_leaf_add(blk->bp, state->args); 972 if (retval == -ENOSPC) { 973 if (state->path.active == 1) { 974 /* 975 * Its really a single leaf node, but it had 976 * out-of-line values so it looked like it *might* 977 * have been a b-tree. 978 */ 979 xfs_da_state_free(state); 980 state = NULL; 981 error = xfs_attr3_leaf_to_node(args); 982 if (error) 983 goto out; 984 error = xfs_defer_finish(&args->trans); 985 if (error) 986 goto out; 987 988 /* 989 * Commit the node conversion and start the next 990 * trans in the chain. 991 */ 992 error = xfs_trans_roll_inode(&args->trans, dp); 993 if (error) 994 goto out; 995 996 goto restart; 997 } 998 999 /* 1000 * Split as many Btree elements as required. 1001 * This code tracks the new and old attr's location 1002 * in the index/blkno/rmtblkno/rmtblkcnt fields and 1003 * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. 1004 */ 1005 error = xfs_da3_split(state); 1006 if (error) 1007 goto out; 1008 error = xfs_defer_finish(&args->trans); 1009 if (error) 1010 goto out; 1011 } else { 1012 /* 1013 * Addition succeeded, update Btree hashvals. 1014 */ 1015 xfs_da3_fixhashpath(state, &state->path); 1016 } 1017 1018 /* 1019 * Kill the state structure, we're done with it and need to 1020 * allow the buffers to come back later. 1021 */ 1022 xfs_da_state_free(state); 1023 state = NULL; 1024 1025 /* 1026 * Commit the leaf addition or btree split and start the next 1027 * trans in the chain. 1028 */ 1029 error = xfs_trans_roll_inode(&args->trans, dp); 1030 if (error) 1031 goto out; 1032 1033 /* 1034 * If there was an out-of-line value, allocate the blocks we 1035 * identified for its storage and copy the value. This is done 1036 * after we create the attribute so that we don't overflow the 1037 * maximum size of a transaction and/or hit a deadlock. 1038 */ 1039 if (args->rmtblkno > 0) { 1040 error = xfs_attr_rmtval_set(args); 1041 if (error) 1042 return error; 1043 } 1044 1045 if (!(args->op_flags & XFS_DA_OP_RENAME)) { 1046 /* 1047 * Added a "remote" value, just clear the incomplete flag. 1048 */ 1049 if (args->rmtblkno > 0) 1050 error = xfs_attr3_leaf_clearflag(args); 1051 retval = error; 1052 goto out; 1053 } 1054 1055 /* 1056 * If this is an atomic rename operation, we must "flip" the incomplete 1057 * flags on the "new" and "old" attribute/value pairs so that one 1058 * disappears and one appears atomically. Then we must remove the "old" 1059 * attribute/value pair. 1060 * 1061 * In a separate transaction, set the incomplete flag on the "old" attr 1062 * and clear the incomplete flag on the "new" attr. 1063 */ 1064 error = xfs_attr3_leaf_flipflags(args); 1065 if (error) 1066 goto out; 1067 /* 1068 * Commit the flag value change and start the next trans in series 1069 */ 1070 error = xfs_trans_roll_inode(&args->trans, args->dp); 1071 if (error) 1072 goto out; 1073 1074 /* 1075 * Dismantle the "old" attribute/value pair by removing a "remote" value 1076 * (if it exists). 1077 */ 1078 xfs_attr_restore_rmt_blk(args); 1079 1080 if (args->rmtblkno) { 1081 error = xfs_attr_rmtval_invalidate(args); 1082 if (error) 1083 return error; 1084 1085 error = xfs_attr_rmtval_remove(args); 1086 if (error) 1087 return error; 1088 } 1089 1090 /* 1091 * Re-find the "old" attribute entry after any split ops. The INCOMPLETE 1092 * flag means that we will find the "old" attr, not the "new" one. 1093 */ 1094 args->attr_filter |= XFS_ATTR_INCOMPLETE; 1095 state = xfs_da_state_alloc(args); 1096 state->inleaf = 0; 1097 error = xfs_da3_node_lookup_int(state, &retval); 1098 if (error) 1099 goto out; 1100 1101 /* 1102 * Remove the name and update the hashvals in the tree. 1103 */ 1104 blk = &state->path.blk[state->path.active-1]; 1105 ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); 1106 error = xfs_attr3_leaf_remove(blk->bp, args); 1107 xfs_da3_fixhashpath(state, &state->path); 1108 1109 /* 1110 * Check to see if the tree needs to be collapsed. 1111 */ 1112 if (retval && (state->path.active > 1)) { 1113 error = xfs_da3_join(state); 1114 if (error) 1115 goto out; 1116 } 1117 retval = error = 0; 1118 1119 out: 1120 if (state) 1121 xfs_da_state_free(state); 1122 if (error) 1123 return error; 1124 return retval; 1125 } 1126 1127 /* 1128 * Shrink an attribute from leaf to shortform 1129 */ 1130 STATIC int 1131 xfs_attr_node_shrink( 1132 struct xfs_da_args *args, 1133 struct xfs_da_state *state) 1134 { 1135 struct xfs_inode *dp = args->dp; 1136 int error, forkoff; 1137 struct xfs_buf *bp; 1138 1139 /* 1140 * Have to get rid of the copy of this dabuf in the state. 1141 */ 1142 ASSERT(state->path.active == 1); 1143 ASSERT(state->path.blk[0].bp); 1144 state->path.blk[0].bp = NULL; 1145 1146 error = xfs_attr3_leaf_read(args->trans, args->dp, 0, &bp); 1147 if (error) 1148 return error; 1149 1150 forkoff = xfs_attr_shortform_allfit(bp, dp); 1151 if (forkoff) { 1152 error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); 1153 /* bp is gone due to xfs_da_shrink_inode */ 1154 } else 1155 xfs_trans_brelse(args->trans, bp); 1156 1157 return error; 1158 } 1159 1160 /* 1161 * Mark an attribute entry INCOMPLETE and save pointers to the relevant buffers 1162 * for later deletion of the entry. 1163 */ 1164 STATIC int 1165 xfs_attr_leaf_mark_incomplete( 1166 struct xfs_da_args *args, 1167 struct xfs_da_state *state) 1168 { 1169 int error; 1170 1171 /* 1172 * Fill in disk block numbers in the state structure 1173 * so that we can get the buffers back after we commit 1174 * several transactions in the following calls. 1175 */ 1176 error = xfs_attr_fillstate(state); 1177 if (error) 1178 return error; 1179 1180 /* 1181 * Mark the attribute as INCOMPLETE 1182 */ 1183 return xfs_attr3_leaf_setflag(args); 1184 } 1185 1186 /* 1187 * Initial setup for xfs_attr_node_removename. Make sure the attr is there and 1188 * the blocks are valid. Attr keys with remote blocks will be marked 1189 * incomplete. 1190 */ 1191 STATIC 1192 int xfs_attr_node_removename_setup( 1193 struct xfs_da_args *args, 1194 struct xfs_da_state **state) 1195 { 1196 int error; 1197 1198 error = xfs_attr_node_hasname(args, state); 1199 if (error != -EEXIST) 1200 return error; 1201 1202 ASSERT((*state)->path.blk[(*state)->path.active - 1].bp != NULL); 1203 ASSERT((*state)->path.blk[(*state)->path.active - 1].magic == 1204 XFS_ATTR_LEAF_MAGIC); 1205 1206 if (args->rmtblkno > 0) { 1207 error = xfs_attr_leaf_mark_incomplete(args, *state); 1208 if (error) 1209 return error; 1210 1211 return xfs_attr_rmtval_invalidate(args); 1212 } 1213 1214 return 0; 1215 } 1216 1217 STATIC int 1218 xfs_attr_node_remove_rmt( 1219 struct xfs_da_args *args, 1220 struct xfs_da_state *state) 1221 { 1222 int error = 0; 1223 1224 error = xfs_attr_rmtval_remove(args); 1225 if (error) 1226 return error; 1227 1228 /* 1229 * Refill the state structure with buffers, the prior calls released our 1230 * buffers. 1231 */ 1232 return xfs_attr_refillstate(state); 1233 } 1234 1235 /* 1236 * Remove a name from a B-tree attribute list. 1237 * 1238 * This will involve walking down the Btree, and may involve joining 1239 * leaf nodes and even joining intermediate nodes up to and including 1240 * the root node (a special case of an intermediate node). 1241 */ 1242 STATIC int 1243 xfs_attr_node_removename( 1244 struct xfs_da_args *args) 1245 { 1246 struct xfs_da_state *state; 1247 struct xfs_da_state_blk *blk; 1248 int retval, error; 1249 struct xfs_inode *dp = args->dp; 1250 1251 trace_xfs_attr_node_removename(args); 1252 1253 error = xfs_attr_node_removename_setup(args, &state); 1254 if (error) 1255 goto out; 1256 1257 /* 1258 * If there is an out-of-line value, de-allocate the blocks. 1259 * This is done before we remove the attribute so that we don't 1260 * overflow the maximum size of a transaction and/or hit a deadlock. 1261 */ 1262 if (args->rmtblkno > 0) { 1263 error = xfs_attr_node_remove_rmt(args, state); 1264 if (error) 1265 goto out; 1266 } 1267 1268 /* 1269 * Remove the name and update the hashvals in the tree. 1270 */ 1271 blk = &state->path.blk[ state->path.active-1 ]; 1272 ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); 1273 retval = xfs_attr3_leaf_remove(blk->bp, args); 1274 xfs_da3_fixhashpath(state, &state->path); 1275 1276 /* 1277 * Check to see if the tree needs to be collapsed. 1278 */ 1279 if (retval && (state->path.active > 1)) { 1280 error = xfs_da3_join(state); 1281 if (error) 1282 goto out; 1283 error = xfs_defer_finish(&args->trans); 1284 if (error) 1285 goto out; 1286 /* 1287 * Commit the Btree join operation and start a new trans. 1288 */ 1289 error = xfs_trans_roll_inode(&args->trans, dp); 1290 if (error) 1291 goto out; 1292 } 1293 1294 /* 1295 * If the result is small enough, push it all into the inode. 1296 */ 1297 if (xfs_attr_is_leaf(dp)) 1298 error = xfs_attr_node_shrink(args, state); 1299 1300 out: 1301 if (state) 1302 xfs_da_state_free(state); 1303 return error; 1304 } 1305 1306 /* 1307 * Fill in the disk block numbers in the state structure for the buffers 1308 * that are attached to the state structure. 1309 * This is done so that we can quickly reattach ourselves to those buffers 1310 * after some set of transaction commits have released these buffers. 1311 */ 1312 STATIC int 1313 xfs_attr_fillstate(xfs_da_state_t *state) 1314 { 1315 xfs_da_state_path_t *path; 1316 xfs_da_state_blk_t *blk; 1317 int level; 1318 1319 trace_xfs_attr_fillstate(state->args); 1320 1321 /* 1322 * Roll down the "path" in the state structure, storing the on-disk 1323 * block number for those buffers in the "path". 1324 */ 1325 path = &state->path; 1326 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1327 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1328 if (blk->bp) { 1329 blk->disk_blkno = XFS_BUF_ADDR(blk->bp); 1330 blk->bp = NULL; 1331 } else { 1332 blk->disk_blkno = 0; 1333 } 1334 } 1335 1336 /* 1337 * Roll down the "altpath" in the state structure, storing the on-disk 1338 * block number for those buffers in the "altpath". 1339 */ 1340 path = &state->altpath; 1341 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1342 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1343 if (blk->bp) { 1344 blk->disk_blkno = XFS_BUF_ADDR(blk->bp); 1345 blk->bp = NULL; 1346 } else { 1347 blk->disk_blkno = 0; 1348 } 1349 } 1350 1351 return 0; 1352 } 1353 1354 /* 1355 * Reattach the buffers to the state structure based on the disk block 1356 * numbers stored in the state structure. 1357 * This is done after some set of transaction commits have released those 1358 * buffers from our grip. 1359 */ 1360 STATIC int 1361 xfs_attr_refillstate(xfs_da_state_t *state) 1362 { 1363 xfs_da_state_path_t *path; 1364 xfs_da_state_blk_t *blk; 1365 int level, error; 1366 1367 trace_xfs_attr_refillstate(state->args); 1368 1369 /* 1370 * Roll down the "path" in the state structure, storing the on-disk 1371 * block number for those buffers in the "path". 1372 */ 1373 path = &state->path; 1374 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1375 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1376 if (blk->disk_blkno) { 1377 error = xfs_da3_node_read_mapped(state->args->trans, 1378 state->args->dp, blk->disk_blkno, 1379 &blk->bp, XFS_ATTR_FORK); 1380 if (error) 1381 return error; 1382 } else { 1383 blk->bp = NULL; 1384 } 1385 } 1386 1387 /* 1388 * Roll down the "altpath" in the state structure, storing the on-disk 1389 * block number for those buffers in the "altpath". 1390 */ 1391 path = &state->altpath; 1392 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 1393 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 1394 if (blk->disk_blkno) { 1395 error = xfs_da3_node_read_mapped(state->args->trans, 1396 state->args->dp, blk->disk_blkno, 1397 &blk->bp, XFS_ATTR_FORK); 1398 if (error) 1399 return error; 1400 } else { 1401 blk->bp = NULL; 1402 } 1403 } 1404 1405 return 0; 1406 } 1407 1408 /* 1409 * Retrieve the attribute data from a node attribute list. 1410 * 1411 * This routine gets called for any attribute fork that has more than one 1412 * block, ie: both true Btree attr lists and for single-leaf-blocks with 1413 * "remote" values taking up more blocks. 1414 * 1415 * Returns 0 on successful retrieval, otherwise an error. 1416 */ 1417 STATIC int 1418 xfs_attr_node_get( 1419 struct xfs_da_args *args) 1420 { 1421 struct xfs_da_state *state; 1422 struct xfs_da_state_blk *blk; 1423 int i; 1424 int error; 1425 1426 trace_xfs_attr_node_get(args); 1427 1428 /* 1429 * Search to see if name exists, and get back a pointer to it. 1430 */ 1431 error = xfs_attr_node_hasname(args, &state); 1432 if (error != -EEXIST) 1433 goto out_release; 1434 1435 /* 1436 * Get the value, local or "remote" 1437 */ 1438 blk = &state->path.blk[state->path.active - 1]; 1439 error = xfs_attr3_leaf_getvalue(blk->bp, args); 1440 1441 /* 1442 * If not in a transaction, we have to release all the buffers. 1443 */ 1444 out_release: 1445 for (i = 0; state != NULL && i < state->path.active; i++) { 1446 xfs_trans_brelse(args->trans, state->path.blk[i].bp); 1447 state->path.blk[i].bp = NULL; 1448 } 1449 1450 if (state) 1451 xfs_da_state_free(state); 1452 return error; 1453 } 1454 1455 /* Returns true if the attribute entry name is valid. */ 1456 bool 1457 xfs_attr_namecheck( 1458 const void *name, 1459 size_t length) 1460 { 1461 /* 1462 * MAXNAMELEN includes the trailing null, but (name/length) leave it 1463 * out, so use >= for the length check. 1464 */ 1465 if (length >= MAXNAMELEN) 1466 return false; 1467 1468 /* There shouldn't be any nulls here */ 1469 return !memchr(name, 0, length); 1470 } 1471