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