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 #include "xfs_attr_item.h" 28 #include "xfs_xattr.h" 29 30 struct kmem_cache *xfs_attr_intent_cache; 31 32 /* 33 * xfs_attr.c 34 * 35 * Provide the external interfaces to manage attribute lists. 36 */ 37 38 /*======================================================================== 39 * Function prototypes for the kernel. 40 *========================================================================*/ 41 42 /* 43 * Internal routines when attribute list fits inside the inode. 44 */ 45 STATIC int xfs_attr_shortform_addname(xfs_da_args_t *args); 46 47 /* 48 * Internal routines when attribute list is one block. 49 */ 50 STATIC int xfs_attr_leaf_get(xfs_da_args_t *args); 51 STATIC int xfs_attr_leaf_removename(xfs_da_args_t *args); 52 STATIC int xfs_attr_leaf_hasname(struct xfs_da_args *args, struct xfs_buf **bp); 53 STATIC int xfs_attr_leaf_try_add(struct xfs_da_args *args, struct xfs_buf *bp); 54 55 /* 56 * Internal routines when attribute list is more than one block. 57 */ 58 STATIC int xfs_attr_node_get(xfs_da_args_t *args); 59 STATIC void xfs_attr_restore_rmt_blk(struct xfs_da_args *args); 60 static int xfs_attr_node_try_addname(struct xfs_attr_intent *attr); 61 STATIC int xfs_attr_node_addname_find_attr(struct xfs_attr_intent *attr); 62 STATIC int xfs_attr_node_remove_attr(struct xfs_attr_intent *attr); 63 STATIC int xfs_attr_node_lookup(struct xfs_da_args *args, 64 struct xfs_da_state *state); 65 66 int 67 xfs_inode_hasattr( 68 struct xfs_inode *ip) 69 { 70 if (!XFS_IFORK_Q(ip)) 71 return 0; 72 if (!ip->i_afp) 73 return 0; 74 if (ip->i_afp->if_format == XFS_DINODE_FMT_EXTENTS && 75 ip->i_afp->if_nextents == 0) 76 return 0; 77 return 1; 78 } 79 80 /* 81 * Returns true if the there is exactly only block in the attr fork, in which 82 * case the attribute fork consists of a single leaf block entry. 83 */ 84 bool 85 xfs_attr_is_leaf( 86 struct xfs_inode *ip) 87 { 88 struct xfs_ifork *ifp = ip->i_afp; 89 struct xfs_iext_cursor icur; 90 struct xfs_bmbt_irec imap; 91 92 if (ifp->if_nextents != 1 || ifp->if_format != XFS_DINODE_FMT_EXTENTS) 93 return false; 94 95 xfs_iext_first(ifp, &icur); 96 xfs_iext_get_extent(ifp, &icur, &imap); 97 return imap.br_startoff == 0 && imap.br_blockcount == 1; 98 } 99 100 /* 101 * XXX (dchinner): name path state saving and refilling is an optimisation to 102 * avoid needing to look up name entries after rolling transactions removing 103 * remote xattr blocks between the name entry lookup and name entry removal. 104 * This optimisation got sidelined when combining the set and remove state 105 * machines, but the code has been left in place because it is worthwhile to 106 * restore the optimisation once the combined state machine paths have settled. 107 * 108 * This comment is a public service announcement to remind Future Dave that he 109 * still needs to restore this code to working order. 110 */ 111 #if 0 112 /* 113 * Fill in the disk block numbers in the state structure for the buffers 114 * that are attached to the state structure. 115 * This is done so that we can quickly reattach ourselves to those buffers 116 * after some set of transaction commits have released these buffers. 117 */ 118 static int 119 xfs_attr_fillstate(xfs_da_state_t *state) 120 { 121 xfs_da_state_path_t *path; 122 xfs_da_state_blk_t *blk; 123 int level; 124 125 trace_xfs_attr_fillstate(state->args); 126 127 /* 128 * Roll down the "path" in the state structure, storing the on-disk 129 * block number for those buffers in the "path". 130 */ 131 path = &state->path; 132 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 133 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 134 if (blk->bp) { 135 blk->disk_blkno = xfs_buf_daddr(blk->bp); 136 blk->bp = NULL; 137 } else { 138 blk->disk_blkno = 0; 139 } 140 } 141 142 /* 143 * Roll down the "altpath" in the state structure, storing the on-disk 144 * block number for those buffers in the "altpath". 145 */ 146 path = &state->altpath; 147 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 148 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 149 if (blk->bp) { 150 blk->disk_blkno = xfs_buf_daddr(blk->bp); 151 blk->bp = NULL; 152 } else { 153 blk->disk_blkno = 0; 154 } 155 } 156 157 return 0; 158 } 159 160 /* 161 * Reattach the buffers to the state structure based on the disk block 162 * numbers stored in the state structure. 163 * This is done after some set of transaction commits have released those 164 * buffers from our grip. 165 */ 166 static int 167 xfs_attr_refillstate(xfs_da_state_t *state) 168 { 169 xfs_da_state_path_t *path; 170 xfs_da_state_blk_t *blk; 171 int level, error; 172 173 trace_xfs_attr_refillstate(state->args); 174 175 /* 176 * Roll down the "path" in the state structure, storing the on-disk 177 * block number for those buffers in the "path". 178 */ 179 path = &state->path; 180 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 181 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 182 if (blk->disk_blkno) { 183 error = xfs_da3_node_read_mapped(state->args->trans, 184 state->args->dp, blk->disk_blkno, 185 &blk->bp, XFS_ATTR_FORK); 186 if (error) 187 return error; 188 } else { 189 blk->bp = NULL; 190 } 191 } 192 193 /* 194 * Roll down the "altpath" in the state structure, storing the on-disk 195 * block number for those buffers in the "altpath". 196 */ 197 path = &state->altpath; 198 ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH)); 199 for (blk = path->blk, level = 0; level < path->active; blk++, level++) { 200 if (blk->disk_blkno) { 201 error = xfs_da3_node_read_mapped(state->args->trans, 202 state->args->dp, blk->disk_blkno, 203 &blk->bp, XFS_ATTR_FORK); 204 if (error) 205 return error; 206 } else { 207 blk->bp = NULL; 208 } 209 } 210 211 return 0; 212 } 213 #else 214 static int xfs_attr_fillstate(xfs_da_state_t *state) { return 0; } 215 #endif 216 217 /*======================================================================== 218 * Overall external interface routines. 219 *========================================================================*/ 220 221 /* 222 * Retrieve an extended attribute and its value. Must have ilock. 223 * Returns 0 on successful retrieval, otherwise an error. 224 */ 225 int 226 xfs_attr_get_ilocked( 227 struct xfs_da_args *args) 228 { 229 ASSERT(xfs_isilocked(args->dp, XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); 230 231 if (!xfs_inode_hasattr(args->dp)) 232 return -ENOATTR; 233 234 if (args->dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) 235 return xfs_attr_shortform_getvalue(args); 236 if (xfs_attr_is_leaf(args->dp)) 237 return xfs_attr_leaf_get(args); 238 return xfs_attr_node_get(args); 239 } 240 241 /* 242 * Retrieve an extended attribute by name, and its value if requested. 243 * 244 * If args->valuelen is zero, then the caller does not want the value, just an 245 * indication whether the attribute exists and the size of the value if it 246 * exists. The size is returned in args.valuelen. 247 * 248 * If args->value is NULL but args->valuelen is non-zero, allocate the buffer 249 * for the value after existence of the attribute has been determined. The 250 * caller always has to free args->value if it is set, no matter if this 251 * function was successful or not. 252 * 253 * If the attribute is found, but exceeds the size limit set by the caller in 254 * args->valuelen, return -ERANGE with the size of the attribute that was found 255 * in args->valuelen. 256 */ 257 int 258 xfs_attr_get( 259 struct xfs_da_args *args) 260 { 261 uint lock_mode; 262 int error; 263 264 XFS_STATS_INC(args->dp->i_mount, xs_attr_get); 265 266 if (xfs_is_shutdown(args->dp->i_mount)) 267 return -EIO; 268 269 args->geo = args->dp->i_mount->m_attr_geo; 270 args->whichfork = XFS_ATTR_FORK; 271 args->hashval = xfs_da_hashname(args->name, args->namelen); 272 273 /* Entirely possible to look up a name which doesn't exist */ 274 args->op_flags = XFS_DA_OP_OKNOENT; 275 276 lock_mode = xfs_ilock_attr_map_shared(args->dp); 277 error = xfs_attr_get_ilocked(args); 278 xfs_iunlock(args->dp, lock_mode); 279 280 return error; 281 } 282 283 /* 284 * Calculate how many blocks we need for the new attribute, 285 */ 286 int 287 xfs_attr_calc_size( 288 struct xfs_da_args *args, 289 int *local) 290 { 291 struct xfs_mount *mp = args->dp->i_mount; 292 int size; 293 int nblks; 294 295 /* 296 * Determine space new attribute will use, and if it would be 297 * "local" or "remote" (note: local != inline). 298 */ 299 size = xfs_attr_leaf_newentsize(args, local); 300 nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); 301 if (*local) { 302 if (size > (args->geo->blksize / 2)) { 303 /* Double split possible */ 304 nblks *= 2; 305 } 306 } else { 307 /* 308 * Out of line attribute, cannot double split, but 309 * make room for the attribute value itself. 310 */ 311 uint dblocks = xfs_attr3_rmt_blocks(mp, args->valuelen); 312 nblks += dblocks; 313 nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK); 314 } 315 316 return nblks; 317 } 318 319 /* Initialize transaction reservation for attr operations */ 320 void 321 xfs_init_attr_trans( 322 struct xfs_da_args *args, 323 struct xfs_trans_res *tres, 324 unsigned int *total) 325 { 326 struct xfs_mount *mp = args->dp->i_mount; 327 328 if (args->value) { 329 tres->tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + 330 M_RES(mp)->tr_attrsetrt.tr_logres * 331 args->total; 332 tres->tr_logcount = XFS_ATTRSET_LOG_COUNT; 333 tres->tr_logflags = XFS_TRANS_PERM_LOG_RES; 334 *total = args->total; 335 } else { 336 *tres = M_RES(mp)->tr_attrrm; 337 *total = XFS_ATTRRM_SPACE_RES(mp); 338 } 339 } 340 341 /* 342 * Add an attr to a shortform fork. If there is no space, 343 * xfs_attr_shortform_addname() will convert to leaf format and return -ENOSPC. 344 * to use. 345 */ 346 STATIC int 347 xfs_attr_try_sf_addname( 348 struct xfs_inode *dp, 349 struct xfs_da_args *args) 350 { 351 352 int error; 353 354 /* 355 * Build initial attribute list (if required). 356 */ 357 if (dp->i_afp->if_format == XFS_DINODE_FMT_EXTENTS) 358 xfs_attr_shortform_create(args); 359 360 error = xfs_attr_shortform_addname(args); 361 if (error == -ENOSPC) 362 return error; 363 364 /* 365 * Commit the shortform mods, and we're done. 366 * NOTE: this is also the error path (EEXIST, etc). 367 */ 368 if (!error && !(args->op_flags & XFS_DA_OP_NOTIME)) 369 xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); 370 371 if (xfs_has_wsync(dp->i_mount)) 372 xfs_trans_set_sync(args->trans); 373 374 return error; 375 } 376 377 static int 378 xfs_attr_sf_addname( 379 struct xfs_attr_intent *attr) 380 { 381 struct xfs_da_args *args = attr->xattri_da_args; 382 struct xfs_inode *dp = args->dp; 383 int error = 0; 384 385 error = xfs_attr_try_sf_addname(dp, args); 386 if (error != -ENOSPC) { 387 ASSERT(!error || error == -EEXIST); 388 attr->xattri_dela_state = XFS_DAS_DONE; 389 goto out; 390 } 391 392 /* 393 * It won't fit in the shortform, transform to a leaf block. GROT: 394 * another possible req'mt for a double-split btree op. 395 */ 396 error = xfs_attr_shortform_to_leaf(args, &attr->xattri_leaf_bp); 397 if (error) 398 return error; 399 400 /* 401 * Prevent the leaf buffer from being unlocked so that a concurrent AIL 402 * push cannot grab the half-baked leaf buffer and run into problems 403 * with the write verifier. 404 */ 405 xfs_trans_bhold(args->trans, attr->xattri_leaf_bp); 406 attr->xattri_dela_state = XFS_DAS_LEAF_ADD; 407 out: 408 trace_xfs_attr_sf_addname_return(attr->xattri_dela_state, args->dp); 409 return error; 410 } 411 412 /* 413 * Handle the state change on completion of a multi-state attr operation. 414 * 415 * If the XFS_DA_OP_REPLACE flag is set, this means the operation was the first 416 * modification in a attr replace operation and we still have to do the second 417 * state, indicated by @replace_state. 418 * 419 * We consume the XFS_DA_OP_REPLACE flag so that when we are called again on 420 * completion of the second half of the attr replace operation we correctly 421 * signal that it is done. 422 */ 423 static enum xfs_delattr_state 424 xfs_attr_complete_op( 425 struct xfs_attr_intent *attr, 426 enum xfs_delattr_state replace_state) 427 { 428 struct xfs_da_args *args = attr->xattri_da_args; 429 bool do_replace = args->op_flags & XFS_DA_OP_REPLACE; 430 431 args->op_flags &= ~XFS_DA_OP_REPLACE; 432 if (do_replace) { 433 args->attr_filter &= ~XFS_ATTR_INCOMPLETE; 434 return replace_state; 435 } 436 return XFS_DAS_DONE; 437 } 438 439 static int 440 xfs_attr_leaf_addname( 441 struct xfs_attr_intent *attr) 442 { 443 struct xfs_da_args *args = attr->xattri_da_args; 444 int error; 445 446 ASSERT(xfs_attr_is_leaf(args->dp)); 447 448 /* 449 * Use the leaf buffer we may already hold locked as a result of 450 * a sf-to-leaf conversion. The held buffer is no longer valid 451 * after this call, regardless of the result. 452 */ 453 error = xfs_attr_leaf_try_add(args, attr->xattri_leaf_bp); 454 attr->xattri_leaf_bp = NULL; 455 456 if (error == -ENOSPC) { 457 error = xfs_attr3_leaf_to_node(args); 458 if (error) 459 return error; 460 461 /* 462 * We're not in leaf format anymore, so roll the transaction and 463 * retry the add to the newly allocated node block. 464 */ 465 attr->xattri_dela_state = XFS_DAS_NODE_ADD; 466 goto out; 467 } 468 if (error) 469 return error; 470 471 /* 472 * We need to commit and roll if we need to allocate remote xattr blocks 473 * or perform more xattr manipulations. Otherwise there is nothing more 474 * to do and we can return success. 475 */ 476 if (args->rmtblkno) 477 attr->xattri_dela_state = XFS_DAS_LEAF_SET_RMT; 478 else 479 attr->xattri_dela_state = xfs_attr_complete_op(attr, 480 XFS_DAS_LEAF_REPLACE); 481 out: 482 trace_xfs_attr_leaf_addname_return(attr->xattri_dela_state, args->dp); 483 return error; 484 } 485 486 /* 487 * Add an entry to a node format attr tree. 488 * 489 * Note that we might still have a leaf here - xfs_attr_is_leaf() cannot tell 490 * the difference between leaf + remote attr blocks and a node format tree, 491 * so we may still end up having to convert from leaf to node format here. 492 */ 493 static int 494 xfs_attr_node_addname( 495 struct xfs_attr_intent *attr) 496 { 497 struct xfs_da_args *args = attr->xattri_da_args; 498 int error; 499 500 ASSERT(!attr->xattri_leaf_bp); 501 502 error = xfs_attr_node_addname_find_attr(attr); 503 if (error) 504 return error; 505 506 error = xfs_attr_node_try_addname(attr); 507 if (error == -ENOSPC) { 508 error = xfs_attr3_leaf_to_node(args); 509 if (error) 510 return error; 511 /* 512 * No state change, we really are in node form now 513 * but we need the transaction rolled to continue. 514 */ 515 goto out; 516 } 517 if (error) 518 return error; 519 520 if (args->rmtblkno) 521 attr->xattri_dela_state = XFS_DAS_NODE_SET_RMT; 522 else 523 attr->xattri_dela_state = xfs_attr_complete_op(attr, 524 XFS_DAS_NODE_REPLACE); 525 out: 526 trace_xfs_attr_node_addname_return(attr->xattri_dela_state, args->dp); 527 return error; 528 } 529 530 static int 531 xfs_attr_rmtval_alloc( 532 struct xfs_attr_intent *attr) 533 { 534 struct xfs_da_args *args = attr->xattri_da_args; 535 int error = 0; 536 537 /* 538 * If there was an out-of-line value, allocate the blocks we 539 * identified for its storage and copy the value. This is done 540 * after we create the attribute so that we don't overflow the 541 * maximum size of a transaction and/or hit a deadlock. 542 */ 543 if (attr->xattri_blkcnt > 0) { 544 error = xfs_attr_rmtval_set_blk(attr); 545 if (error) 546 return error; 547 /* Roll the transaction only if there is more to allocate. */ 548 if (attr->xattri_blkcnt > 0) 549 goto out; 550 } 551 552 error = xfs_attr_rmtval_set_value(args); 553 if (error) 554 return error; 555 556 attr->xattri_dela_state = xfs_attr_complete_op(attr, 557 ++attr->xattri_dela_state); 558 /* 559 * If we are not doing a rename, we've finished the operation but still 560 * have to clear the incomplete flag protecting the new attr from 561 * exposing partially initialised state if we crash during creation. 562 */ 563 if (attr->xattri_dela_state == XFS_DAS_DONE) 564 error = xfs_attr3_leaf_clearflag(args); 565 out: 566 trace_xfs_attr_rmtval_alloc(attr->xattri_dela_state, args->dp); 567 return error; 568 } 569 570 /* 571 * Mark an attribute entry INCOMPLETE and save pointers to the relevant buffers 572 * for later deletion of the entry. 573 */ 574 static int 575 xfs_attr_leaf_mark_incomplete( 576 struct xfs_da_args *args, 577 struct xfs_da_state *state) 578 { 579 int error; 580 581 /* 582 * Fill in disk block numbers in the state structure 583 * so that we can get the buffers back after we commit 584 * several transactions in the following calls. 585 */ 586 error = xfs_attr_fillstate(state); 587 if (error) 588 return error; 589 590 /* 591 * Mark the attribute as INCOMPLETE 592 */ 593 return xfs_attr3_leaf_setflag(args); 594 } 595 596 /* Ensure the da state of an xattr deferred work item is ready to go. */ 597 static inline void 598 xfs_attr_item_init_da_state( 599 struct xfs_attr_intent *attr) 600 { 601 struct xfs_da_args *args = attr->xattri_da_args; 602 603 if (!attr->xattri_da_state) 604 attr->xattri_da_state = xfs_da_state_alloc(args); 605 else 606 xfs_da_state_reset(attr->xattri_da_state, args); 607 } 608 609 /* 610 * Initial setup for xfs_attr_node_removename. Make sure the attr is there and 611 * the blocks are valid. Attr keys with remote blocks will be marked 612 * incomplete. 613 */ 614 static 615 int xfs_attr_node_removename_setup( 616 struct xfs_attr_intent *attr) 617 { 618 struct xfs_da_args *args = attr->xattri_da_args; 619 struct xfs_da_state *state; 620 int error; 621 622 xfs_attr_item_init_da_state(attr); 623 error = xfs_attr_node_lookup(args, attr->xattri_da_state); 624 if (error != -EEXIST) 625 goto out; 626 error = 0; 627 628 state = attr->xattri_da_state; 629 ASSERT(state->path.blk[state->path.active - 1].bp != NULL); 630 ASSERT(state->path.blk[state->path.active - 1].magic == 631 XFS_ATTR_LEAF_MAGIC); 632 633 error = xfs_attr_leaf_mark_incomplete(args, state); 634 if (error) 635 goto out; 636 if (args->rmtblkno > 0) 637 error = xfs_attr_rmtval_invalidate(args); 638 out: 639 if (error) { 640 xfs_da_state_free(attr->xattri_da_state); 641 attr->xattri_da_state = NULL; 642 } 643 644 return error; 645 } 646 647 /* 648 * Remove the original attr we have just replaced. This is dependent on the 649 * original lookup and insert placing the old attr in args->blkno/args->index 650 * and the new attr in args->blkno2/args->index2. 651 */ 652 static int 653 xfs_attr_leaf_remove_attr( 654 struct xfs_attr_intent *attr) 655 { 656 struct xfs_da_args *args = attr->xattri_da_args; 657 struct xfs_inode *dp = args->dp; 658 struct xfs_buf *bp = NULL; 659 int forkoff; 660 int error; 661 662 error = xfs_attr3_leaf_read(args->trans, args->dp, args->blkno, 663 &bp); 664 if (error) 665 return error; 666 667 xfs_attr3_leaf_remove(bp, args); 668 669 forkoff = xfs_attr_shortform_allfit(bp, dp); 670 if (forkoff) 671 error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); 672 /* bp is gone due to xfs_da_shrink_inode */ 673 674 return error; 675 } 676 677 /* 678 * Shrink an attribute from leaf to shortform. Used by the node format remove 679 * path when the node format collapses to a single block and so we have to check 680 * if it can be collapsed further. 681 */ 682 static int 683 xfs_attr_leaf_shrink( 684 struct xfs_da_args *args) 685 { 686 struct xfs_inode *dp = args->dp; 687 struct xfs_buf *bp; 688 int forkoff; 689 int error; 690 691 if (!xfs_attr_is_leaf(dp)) 692 return 0; 693 694 error = xfs_attr3_leaf_read(args->trans, args->dp, 0, &bp); 695 if (error) 696 return error; 697 698 forkoff = xfs_attr_shortform_allfit(bp, dp); 699 if (forkoff) { 700 error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); 701 /* bp is gone due to xfs_da_shrink_inode */ 702 } else { 703 xfs_trans_brelse(args->trans, bp); 704 } 705 706 return error; 707 } 708 709 /* 710 * Run the attribute operation specified in @attr. 711 * 712 * This routine is meant to function as a delayed operation and will set the 713 * state to XFS_DAS_DONE when the operation is complete. Calling functions will 714 * need to handle this, and recall the function until either an error or 715 * XFS_DAS_DONE is detected. 716 */ 717 int 718 xfs_attr_set_iter( 719 struct xfs_attr_intent *attr) 720 { 721 struct xfs_da_args *args = attr->xattri_da_args; 722 int error = 0; 723 724 /* State machine switch */ 725 next_state: 726 switch (attr->xattri_dela_state) { 727 case XFS_DAS_UNINIT: 728 ASSERT(0); 729 return -EFSCORRUPTED; 730 case XFS_DAS_SF_ADD: 731 return xfs_attr_sf_addname(attr); 732 case XFS_DAS_LEAF_ADD: 733 return xfs_attr_leaf_addname(attr); 734 case XFS_DAS_NODE_ADD: 735 return xfs_attr_node_addname(attr); 736 737 case XFS_DAS_SF_REMOVE: 738 error = xfs_attr_sf_removename(args); 739 attr->xattri_dela_state = xfs_attr_complete_op(attr, 740 xfs_attr_init_add_state(args)); 741 break; 742 case XFS_DAS_LEAF_REMOVE: 743 error = xfs_attr_leaf_removename(args); 744 attr->xattri_dela_state = xfs_attr_complete_op(attr, 745 xfs_attr_init_add_state(args)); 746 break; 747 case XFS_DAS_NODE_REMOVE: 748 error = xfs_attr_node_removename_setup(attr); 749 if (error == -ENOATTR && 750 (args->op_flags & XFS_DA_OP_RECOVERY)) { 751 attr->xattri_dela_state = xfs_attr_complete_op(attr, 752 xfs_attr_init_add_state(args)); 753 error = 0; 754 break; 755 } 756 if (error) 757 return error; 758 attr->xattri_dela_state = XFS_DAS_NODE_REMOVE_RMT; 759 if (args->rmtblkno == 0) 760 attr->xattri_dela_state++; 761 break; 762 763 case XFS_DAS_LEAF_SET_RMT: 764 case XFS_DAS_NODE_SET_RMT: 765 error = xfs_attr_rmtval_find_space(attr); 766 if (error) 767 return error; 768 attr->xattri_dela_state++; 769 fallthrough; 770 771 case XFS_DAS_LEAF_ALLOC_RMT: 772 case XFS_DAS_NODE_ALLOC_RMT: 773 error = xfs_attr_rmtval_alloc(attr); 774 if (error) 775 return error; 776 if (attr->xattri_dela_state == XFS_DAS_DONE) 777 break; 778 goto next_state; 779 780 case XFS_DAS_LEAF_REPLACE: 781 case XFS_DAS_NODE_REPLACE: 782 /* 783 * We must "flip" the incomplete flags on the "new" and "old" 784 * attribute/value pairs so that one disappears and one appears 785 * atomically. 786 */ 787 error = xfs_attr3_leaf_flipflags(args); 788 if (error) 789 return error; 790 /* 791 * We must commit the flag value change now to make it atomic 792 * and then we can start the next trans in series at REMOVE_OLD. 793 */ 794 attr->xattri_dela_state++; 795 break; 796 797 case XFS_DAS_LEAF_REMOVE_OLD: 798 case XFS_DAS_NODE_REMOVE_OLD: 799 /* 800 * If we have a remote attr, start the process of removing it 801 * by invalidating any cached buffers. 802 * 803 * If we don't have a remote attr, we skip the remote block 804 * removal state altogether with a second state increment. 805 */ 806 xfs_attr_restore_rmt_blk(args); 807 if (args->rmtblkno) { 808 error = xfs_attr_rmtval_invalidate(args); 809 if (error) 810 return error; 811 } else { 812 attr->xattri_dela_state++; 813 } 814 815 attr->xattri_dela_state++; 816 goto next_state; 817 818 case XFS_DAS_LEAF_REMOVE_RMT: 819 case XFS_DAS_NODE_REMOVE_RMT: 820 error = xfs_attr_rmtval_remove(attr); 821 if (error == -EAGAIN) { 822 error = 0; 823 break; 824 } 825 if (error) 826 return error; 827 828 /* 829 * We've finished removing the remote attr blocks, so commit the 830 * transaction and move on to removing the attr name from the 831 * leaf/node block. Removing the attr might require a full 832 * transaction reservation for btree block freeing, so we 833 * can't do that in the same transaction where we removed the 834 * remote attr blocks. 835 */ 836 attr->xattri_dela_state++; 837 break; 838 839 case XFS_DAS_LEAF_REMOVE_ATTR: 840 error = xfs_attr_leaf_remove_attr(attr); 841 attr->xattri_dela_state = xfs_attr_complete_op(attr, 842 xfs_attr_init_add_state(args)); 843 break; 844 845 case XFS_DAS_NODE_REMOVE_ATTR: 846 error = xfs_attr_node_remove_attr(attr); 847 if (!error) 848 error = xfs_attr_leaf_shrink(args); 849 attr->xattri_dela_state = xfs_attr_complete_op(attr, 850 xfs_attr_init_add_state(args)); 851 break; 852 default: 853 ASSERT(0); 854 break; 855 } 856 857 trace_xfs_attr_set_iter_return(attr->xattri_dela_state, args->dp); 858 return error; 859 } 860 861 862 /* 863 * Return EEXIST if attr is found, or ENOATTR if not 864 */ 865 static int 866 xfs_attr_lookup( 867 struct xfs_da_args *args) 868 { 869 struct xfs_inode *dp = args->dp; 870 struct xfs_buf *bp = NULL; 871 struct xfs_da_state *state; 872 int error; 873 874 if (!xfs_inode_hasattr(dp)) 875 return -ENOATTR; 876 877 if (dp->i_afp->if_format == XFS_DINODE_FMT_LOCAL) 878 return xfs_attr_sf_findname(args, NULL, NULL); 879 880 if (xfs_attr_is_leaf(dp)) { 881 error = xfs_attr_leaf_hasname(args, &bp); 882 883 if (bp) 884 xfs_trans_brelse(args->trans, bp); 885 886 return error; 887 } 888 889 state = xfs_da_state_alloc(args); 890 error = xfs_attr_node_lookup(args, state); 891 xfs_da_state_free(state); 892 return error; 893 } 894 895 static int 896 xfs_attr_intent_init( 897 struct xfs_da_args *args, 898 unsigned int op_flags, /* op flag (set or remove) */ 899 struct xfs_attr_intent **attr) /* new xfs_attr_intent */ 900 { 901 902 struct xfs_attr_intent *new; 903 904 new = kmem_cache_zalloc(xfs_attr_intent_cache, GFP_NOFS | __GFP_NOFAIL); 905 new->xattri_op_flags = op_flags; 906 new->xattri_da_args = args; 907 908 *attr = new; 909 return 0; 910 } 911 912 /* Sets an attribute for an inode as a deferred operation */ 913 static int 914 xfs_attr_defer_add( 915 struct xfs_da_args *args) 916 { 917 struct xfs_attr_intent *new; 918 int error = 0; 919 920 error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_SET, &new); 921 if (error) 922 return error; 923 924 new->xattri_dela_state = xfs_attr_init_add_state(args); 925 xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); 926 trace_xfs_attr_defer_add(new->xattri_dela_state, args->dp); 927 928 return 0; 929 } 930 931 /* Sets an attribute for an inode as a deferred operation */ 932 static int 933 xfs_attr_defer_replace( 934 struct xfs_da_args *args) 935 { 936 struct xfs_attr_intent *new; 937 int error = 0; 938 939 error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REPLACE, &new); 940 if (error) 941 return error; 942 943 new->xattri_dela_state = xfs_attr_init_replace_state(args); 944 xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); 945 trace_xfs_attr_defer_replace(new->xattri_dela_state, args->dp); 946 947 return 0; 948 } 949 950 /* Removes an attribute for an inode as a deferred operation */ 951 static int 952 xfs_attr_defer_remove( 953 struct xfs_da_args *args) 954 { 955 956 struct xfs_attr_intent *new; 957 int error; 958 959 error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REMOVE, &new); 960 if (error) 961 return error; 962 963 new->xattri_dela_state = xfs_attr_init_remove_state(args); 964 xfs_defer_add(args->trans, XFS_DEFER_OPS_TYPE_ATTR, &new->xattri_list); 965 trace_xfs_attr_defer_remove(new->xattri_dela_state, args->dp); 966 967 return 0; 968 } 969 970 /* 971 * Note: If args->value is NULL the attribute will be removed, just like the 972 * Linux ->setattr API. 973 */ 974 int 975 xfs_attr_set( 976 struct xfs_da_args *args) 977 { 978 struct xfs_inode *dp = args->dp; 979 struct xfs_mount *mp = dp->i_mount; 980 struct xfs_trans_res tres; 981 bool rsvd = (args->attr_filter & XFS_ATTR_ROOT); 982 int error, local; 983 int rmt_blks = 0; 984 unsigned int total; 985 986 if (xfs_is_shutdown(dp->i_mount)) 987 return -EIO; 988 989 error = xfs_qm_dqattach(dp); 990 if (error) 991 return error; 992 993 args->geo = mp->m_attr_geo; 994 args->whichfork = XFS_ATTR_FORK; 995 args->hashval = xfs_da_hashname(args->name, args->namelen); 996 997 /* 998 * We have no control over the attribute names that userspace passes us 999 * to remove, so we have to allow the name lookup prior to attribute 1000 * removal to fail as well. Preserve the logged flag, since we need 1001 * to pass that through to the logging code. 1002 */ 1003 args->op_flags = XFS_DA_OP_OKNOENT | 1004 (args->op_flags & XFS_DA_OP_LOGGED); 1005 1006 if (args->value) { 1007 XFS_STATS_INC(mp, xs_attr_set); 1008 args->total = xfs_attr_calc_size(args, &local); 1009 1010 /* 1011 * If the inode doesn't have an attribute fork, add one. 1012 * (inode must not be locked when we call this routine) 1013 */ 1014 if (XFS_IFORK_Q(dp) == 0) { 1015 int sf_size = sizeof(struct xfs_attr_sf_hdr) + 1016 xfs_attr_sf_entsize_byname(args->namelen, 1017 args->valuelen); 1018 1019 error = xfs_bmap_add_attrfork(dp, sf_size, rsvd); 1020 if (error) 1021 return error; 1022 } 1023 1024 if (!local) 1025 rmt_blks = xfs_attr3_rmt_blocks(mp, args->valuelen); 1026 } else { 1027 XFS_STATS_INC(mp, xs_attr_remove); 1028 rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX); 1029 } 1030 1031 /* 1032 * Root fork attributes can use reserved data blocks for this 1033 * operation if necessary 1034 */ 1035 xfs_init_attr_trans(args, &tres, &total); 1036 error = xfs_trans_alloc_inode(dp, &tres, total, 0, rsvd, &args->trans); 1037 if (error) 1038 return error; 1039 1040 if (args->value || xfs_inode_hasattr(dp)) { 1041 error = xfs_iext_count_may_overflow(dp, XFS_ATTR_FORK, 1042 XFS_IEXT_ATTR_MANIP_CNT(rmt_blks)); 1043 if (error == -EFBIG) 1044 error = xfs_iext_count_upgrade(args->trans, dp, 1045 XFS_IEXT_ATTR_MANIP_CNT(rmt_blks)); 1046 if (error) 1047 goto out_trans_cancel; 1048 } 1049 1050 error = xfs_attr_lookup(args); 1051 switch (error) { 1052 case -EEXIST: 1053 /* if no value, we are performing a remove operation */ 1054 if (!args->value) { 1055 error = xfs_attr_defer_remove(args); 1056 break; 1057 } 1058 /* Pure create fails if the attr already exists */ 1059 if (args->attr_flags & XATTR_CREATE) 1060 goto out_trans_cancel; 1061 1062 error = xfs_attr_defer_replace(args); 1063 break; 1064 case -ENOATTR: 1065 /* Can't remove what isn't there. */ 1066 if (!args->value) 1067 goto out_trans_cancel; 1068 1069 /* Pure replace fails if no existing attr to replace. */ 1070 if (args->attr_flags & XATTR_REPLACE) 1071 goto out_trans_cancel; 1072 1073 error = xfs_attr_defer_add(args); 1074 break; 1075 default: 1076 goto out_trans_cancel; 1077 } 1078 if (error) 1079 goto out_trans_cancel; 1080 1081 /* 1082 * If this is a synchronous mount, make sure that the 1083 * transaction goes to disk before returning to the user. 1084 */ 1085 if (xfs_has_wsync(mp)) 1086 xfs_trans_set_sync(args->trans); 1087 1088 if (!(args->op_flags & XFS_DA_OP_NOTIME)) 1089 xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG); 1090 1091 /* 1092 * Commit the last in the sequence of transactions. 1093 */ 1094 xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); 1095 error = xfs_trans_commit(args->trans); 1096 out_unlock: 1097 xfs_iunlock(dp, XFS_ILOCK_EXCL); 1098 return error; 1099 1100 out_trans_cancel: 1101 if (args->trans) 1102 xfs_trans_cancel(args->trans); 1103 goto out_unlock; 1104 } 1105 1106 /*======================================================================== 1107 * External routines when attribute list is inside the inode 1108 *========================================================================*/ 1109 1110 static inline int xfs_attr_sf_totsize(struct xfs_inode *dp) 1111 { 1112 struct xfs_attr_shortform *sf; 1113 1114 sf = (struct xfs_attr_shortform *)dp->i_afp->if_u1.if_data; 1115 return be16_to_cpu(sf->hdr.totsize); 1116 } 1117 1118 /* 1119 * Add a name to the shortform attribute list structure 1120 * This is the external routine. 1121 */ 1122 static int 1123 xfs_attr_shortform_addname( 1124 struct xfs_da_args *args) 1125 { 1126 int newsize, forkoff; 1127 int error; 1128 1129 trace_xfs_attr_sf_addname(args); 1130 1131 error = xfs_attr_shortform_lookup(args); 1132 switch (error) { 1133 case -ENOATTR: 1134 if (args->op_flags & XFS_DA_OP_REPLACE) 1135 return error; 1136 break; 1137 case -EEXIST: 1138 if (!(args->op_flags & XFS_DA_OP_REPLACE)) 1139 return error; 1140 1141 error = xfs_attr_sf_removename(args); 1142 if (error) 1143 return error; 1144 1145 /* 1146 * Since we have removed the old attr, clear XFS_DA_OP_REPLACE 1147 * so that the new attr doesn't fit in shortform format, the 1148 * leaf format add routine won't trip over the attr not being 1149 * around. 1150 */ 1151 args->op_flags &= ~XFS_DA_OP_REPLACE; 1152 break; 1153 case 0: 1154 break; 1155 default: 1156 return error; 1157 } 1158 1159 if (args->namelen >= XFS_ATTR_SF_ENTSIZE_MAX || 1160 args->valuelen >= XFS_ATTR_SF_ENTSIZE_MAX) 1161 return -ENOSPC; 1162 1163 newsize = xfs_attr_sf_totsize(args->dp); 1164 newsize += xfs_attr_sf_entsize_byname(args->namelen, args->valuelen); 1165 1166 forkoff = xfs_attr_shortform_bytesfit(args->dp, newsize); 1167 if (!forkoff) 1168 return -ENOSPC; 1169 1170 xfs_attr_shortform_add(args, forkoff); 1171 return 0; 1172 } 1173 1174 1175 /*======================================================================== 1176 * External routines when attribute list is one block 1177 *========================================================================*/ 1178 1179 /* Save the current remote block info and clear the current pointers. */ 1180 static void 1181 xfs_attr_save_rmt_blk( 1182 struct xfs_da_args *args) 1183 { 1184 args->blkno2 = args->blkno; 1185 args->index2 = args->index; 1186 args->rmtblkno2 = args->rmtblkno; 1187 args->rmtblkcnt2 = args->rmtblkcnt; 1188 args->rmtvaluelen2 = args->rmtvaluelen; 1189 args->rmtblkno = 0; 1190 args->rmtblkcnt = 0; 1191 args->rmtvaluelen = 0; 1192 } 1193 1194 /* Set stored info about a remote block */ 1195 static void 1196 xfs_attr_restore_rmt_blk( 1197 struct xfs_da_args *args) 1198 { 1199 args->blkno = args->blkno2; 1200 args->index = args->index2; 1201 args->rmtblkno = args->rmtblkno2; 1202 args->rmtblkcnt = args->rmtblkcnt2; 1203 args->rmtvaluelen = args->rmtvaluelen2; 1204 } 1205 1206 /* 1207 * Tries to add an attribute to an inode in leaf form 1208 * 1209 * This function is meant to execute as part of a delayed operation and leaves 1210 * the transaction handling to the caller. On success the attribute is added 1211 * and the inode and transaction are left dirty. If there is not enough space, 1212 * the attr data is converted to node format and -ENOSPC is returned. Caller is 1213 * responsible for handling the dirty inode and transaction or adding the attr 1214 * in node format. 1215 */ 1216 STATIC int 1217 xfs_attr_leaf_try_add( 1218 struct xfs_da_args *args, 1219 struct xfs_buf *bp) 1220 { 1221 int error; 1222 1223 /* 1224 * If the caller provided a buffer to us, it is locked and held in 1225 * the transaction because it just did a shortform to leaf conversion. 1226 * Hence we don't need to read it again. Otherwise read in the leaf 1227 * buffer. 1228 */ 1229 if (bp) { 1230 xfs_trans_bhold_release(args->trans, bp); 1231 } else { 1232 error = xfs_attr3_leaf_read(args->trans, args->dp, 0, &bp); 1233 if (error) 1234 return error; 1235 } 1236 1237 /* 1238 * Look up the xattr name to set the insertion point for the new xattr. 1239 */ 1240 error = xfs_attr3_leaf_lookup_int(bp, args); 1241 switch (error) { 1242 case -ENOATTR: 1243 if (args->op_flags & XFS_DA_OP_REPLACE) 1244 goto out_brelse; 1245 break; 1246 case -EEXIST: 1247 if (!(args->op_flags & XFS_DA_OP_REPLACE)) 1248 goto out_brelse; 1249 1250 trace_xfs_attr_leaf_replace(args); 1251 /* 1252 * Save the existing remote attr state so that the current 1253 * values reflect the state of the new attribute we are about to 1254 * add, not the attribute we just found and will remove later. 1255 */ 1256 xfs_attr_save_rmt_blk(args); 1257 break; 1258 case 0: 1259 break; 1260 default: 1261 goto out_brelse; 1262 } 1263 1264 return xfs_attr3_leaf_add(bp, args); 1265 1266 out_brelse: 1267 xfs_trans_brelse(args->trans, bp); 1268 return error; 1269 } 1270 1271 /* 1272 * Return EEXIST if attr is found, or ENOATTR if not 1273 */ 1274 STATIC int 1275 xfs_attr_leaf_hasname( 1276 struct xfs_da_args *args, 1277 struct xfs_buf **bp) 1278 { 1279 int error = 0; 1280 1281 error = xfs_attr3_leaf_read(args->trans, args->dp, 0, bp); 1282 if (error) 1283 return error; 1284 1285 error = xfs_attr3_leaf_lookup_int(*bp, args); 1286 if (error != -ENOATTR && error != -EEXIST) 1287 xfs_trans_brelse(args->trans, *bp); 1288 1289 return error; 1290 } 1291 1292 /* 1293 * Remove a name from the leaf attribute list structure 1294 * 1295 * This leaf block cannot have a "remote" value, we only call this routine 1296 * if bmap_one_block() says there is only one block (ie: no remote blks). 1297 */ 1298 STATIC int 1299 xfs_attr_leaf_removename( 1300 struct xfs_da_args *args) 1301 { 1302 struct xfs_inode *dp; 1303 struct xfs_buf *bp; 1304 int error, forkoff; 1305 1306 trace_xfs_attr_leaf_removename(args); 1307 1308 /* 1309 * Remove the attribute. 1310 */ 1311 dp = args->dp; 1312 1313 error = xfs_attr_leaf_hasname(args, &bp); 1314 if (error == -ENOATTR) { 1315 xfs_trans_brelse(args->trans, bp); 1316 if (args->op_flags & XFS_DA_OP_RECOVERY) 1317 return 0; 1318 return error; 1319 } else if (error != -EEXIST) 1320 return error; 1321 1322 xfs_attr3_leaf_remove(bp, args); 1323 1324 /* 1325 * If the result is small enough, shrink it all into the inode. 1326 */ 1327 forkoff = xfs_attr_shortform_allfit(bp, dp); 1328 if (forkoff) 1329 return xfs_attr3_leaf_to_shortform(bp, args, forkoff); 1330 /* bp is gone due to xfs_da_shrink_inode */ 1331 1332 return 0; 1333 } 1334 1335 /* 1336 * Look up a name in a leaf attribute list structure. 1337 * 1338 * This leaf block cannot have a "remote" value, we only call this routine 1339 * if bmap_one_block() says there is only one block (ie: no remote blks). 1340 * 1341 * Returns 0 on successful retrieval, otherwise an error. 1342 */ 1343 STATIC int 1344 xfs_attr_leaf_get(xfs_da_args_t *args) 1345 { 1346 struct xfs_buf *bp; 1347 int error; 1348 1349 trace_xfs_attr_leaf_get(args); 1350 1351 error = xfs_attr_leaf_hasname(args, &bp); 1352 1353 if (error == -ENOATTR) { 1354 xfs_trans_brelse(args->trans, bp); 1355 return error; 1356 } else if (error != -EEXIST) 1357 return error; 1358 1359 1360 error = xfs_attr3_leaf_getvalue(bp, args); 1361 xfs_trans_brelse(args->trans, bp); 1362 return error; 1363 } 1364 1365 /* Return EEXIST if attr is found, or ENOATTR if not. */ 1366 STATIC int 1367 xfs_attr_node_lookup( 1368 struct xfs_da_args *args, 1369 struct xfs_da_state *state) 1370 { 1371 int retval, error; 1372 1373 /* 1374 * Search to see if name exists, and get back a pointer to it. 1375 */ 1376 error = xfs_da3_node_lookup_int(state, &retval); 1377 if (error) 1378 return error; 1379 1380 return retval; 1381 } 1382 1383 /*======================================================================== 1384 * External routines when attribute list size > geo->blksize 1385 *========================================================================*/ 1386 1387 STATIC int 1388 xfs_attr_node_addname_find_attr( 1389 struct xfs_attr_intent *attr) 1390 { 1391 struct xfs_da_args *args = attr->xattri_da_args; 1392 int error; 1393 1394 /* 1395 * Search to see if name already exists, and get back a pointer 1396 * to where it should go. 1397 */ 1398 xfs_attr_item_init_da_state(attr); 1399 error = xfs_attr_node_lookup(args, attr->xattri_da_state); 1400 switch (error) { 1401 case -ENOATTR: 1402 if (args->op_flags & XFS_DA_OP_REPLACE) 1403 goto error; 1404 break; 1405 case -EEXIST: 1406 if (!(args->op_flags & XFS_DA_OP_REPLACE)) 1407 goto error; 1408 1409 1410 trace_xfs_attr_node_replace(args); 1411 /* 1412 * Save the existing remote attr state so that the current 1413 * values reflect the state of the new attribute we are about to 1414 * add, not the attribute we just found and will remove later. 1415 */ 1416 xfs_attr_save_rmt_blk(args); 1417 break; 1418 case 0: 1419 break; 1420 default: 1421 goto error; 1422 } 1423 1424 return 0; 1425 error: 1426 if (attr->xattri_da_state) { 1427 xfs_da_state_free(attr->xattri_da_state); 1428 attr->xattri_da_state = NULL; 1429 } 1430 return error; 1431 } 1432 1433 /* 1434 * Add a name to a Btree-format attribute list. 1435 * 1436 * This will involve walking down the Btree, and may involve splitting 1437 * leaf nodes and even splitting intermediate nodes up to and including 1438 * the root node (a special case of an intermediate node). 1439 */ 1440 static int 1441 xfs_attr_node_try_addname( 1442 struct xfs_attr_intent *attr) 1443 { 1444 struct xfs_da_state *state = attr->xattri_da_state; 1445 struct xfs_da_state_blk *blk; 1446 int error; 1447 1448 trace_xfs_attr_node_addname(state->args); 1449 1450 blk = &state->path.blk[state->path.active-1]; 1451 ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); 1452 1453 error = xfs_attr3_leaf_add(blk->bp, state->args); 1454 if (error == -ENOSPC) { 1455 if (state->path.active == 1) { 1456 /* 1457 * Its really a single leaf node, but it had 1458 * out-of-line values so it looked like it *might* 1459 * have been a b-tree. Let the caller deal with this. 1460 */ 1461 goto out; 1462 } 1463 1464 /* 1465 * Split as many Btree elements as required. 1466 * This code tracks the new and old attr's location 1467 * in the index/blkno/rmtblkno/rmtblkcnt fields and 1468 * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. 1469 */ 1470 error = xfs_da3_split(state); 1471 if (error) 1472 goto out; 1473 } else { 1474 /* 1475 * Addition succeeded, update Btree hashvals. 1476 */ 1477 xfs_da3_fixhashpath(state, &state->path); 1478 } 1479 1480 out: 1481 xfs_da_state_free(state); 1482 attr->xattri_da_state = NULL; 1483 return error; 1484 } 1485 1486 static int 1487 xfs_attr_node_removename( 1488 struct xfs_da_args *args, 1489 struct xfs_da_state *state) 1490 { 1491 struct xfs_da_state_blk *blk; 1492 int retval; 1493 1494 /* 1495 * Remove the name and update the hashvals in the tree. 1496 */ 1497 blk = &state->path.blk[state->path.active-1]; 1498 ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC); 1499 retval = xfs_attr3_leaf_remove(blk->bp, args); 1500 xfs_da3_fixhashpath(state, &state->path); 1501 1502 return retval; 1503 } 1504 1505 static int 1506 xfs_attr_node_remove_attr( 1507 struct xfs_attr_intent *attr) 1508 { 1509 struct xfs_da_args *args = attr->xattri_da_args; 1510 struct xfs_da_state *state = xfs_da_state_alloc(args); 1511 int retval = 0; 1512 int error = 0; 1513 1514 /* 1515 * The attr we are removing has already been marked incomplete, so 1516 * we need to set the filter appropriately to re-find the "old" 1517 * attribute entry after any split ops. 1518 */ 1519 args->attr_filter |= XFS_ATTR_INCOMPLETE; 1520 error = xfs_da3_node_lookup_int(state, &retval); 1521 if (error) 1522 goto out; 1523 1524 error = xfs_attr_node_removename(args, state); 1525 1526 /* 1527 * Check to see if the tree needs to be collapsed. 1528 */ 1529 if (retval && (state->path.active > 1)) { 1530 error = xfs_da3_join(state); 1531 if (error) 1532 goto out; 1533 } 1534 retval = error = 0; 1535 1536 out: 1537 xfs_da_state_free(state); 1538 if (error) 1539 return error; 1540 return retval; 1541 } 1542 1543 /* 1544 * Retrieve the attribute data from a node attribute list. 1545 * 1546 * This routine gets called for any attribute fork that has more than one 1547 * block, ie: both true Btree attr lists and for single-leaf-blocks with 1548 * "remote" values taking up more blocks. 1549 * 1550 * Returns 0 on successful retrieval, otherwise an error. 1551 */ 1552 STATIC int 1553 xfs_attr_node_get( 1554 struct xfs_da_args *args) 1555 { 1556 struct xfs_da_state *state; 1557 struct xfs_da_state_blk *blk; 1558 int i; 1559 int error; 1560 1561 trace_xfs_attr_node_get(args); 1562 1563 /* 1564 * Search to see if name exists, and get back a pointer to it. 1565 */ 1566 state = xfs_da_state_alloc(args); 1567 error = xfs_attr_node_lookup(args, state); 1568 if (error != -EEXIST) 1569 goto out_release; 1570 1571 /* 1572 * Get the value, local or "remote" 1573 */ 1574 blk = &state->path.blk[state->path.active - 1]; 1575 error = xfs_attr3_leaf_getvalue(blk->bp, args); 1576 1577 /* 1578 * If not in a transaction, we have to release all the buffers. 1579 */ 1580 out_release: 1581 for (i = 0; state != NULL && i < state->path.active; i++) { 1582 xfs_trans_brelse(args->trans, state->path.blk[i].bp); 1583 state->path.blk[i].bp = NULL; 1584 } 1585 1586 xfs_da_state_free(state); 1587 return error; 1588 } 1589 1590 /* Returns true if the attribute entry name is valid. */ 1591 bool 1592 xfs_attr_namecheck( 1593 const void *name, 1594 size_t length) 1595 { 1596 /* 1597 * MAXNAMELEN includes the trailing null, but (name/length) leave it 1598 * out, so use >= for the length check. 1599 */ 1600 if (length >= MAXNAMELEN) 1601 return false; 1602 1603 /* There shouldn't be any nulls here */ 1604 return !memchr(name, 0, length); 1605 } 1606 1607 int __init 1608 xfs_attr_intent_init_cache(void) 1609 { 1610 xfs_attr_intent_cache = kmem_cache_create("xfs_attr_intent", 1611 sizeof(struct xfs_attr_intent), 1612 0, 0, NULL); 1613 1614 return xfs_attr_intent_cache != NULL ? 0 : -ENOMEM; 1615 } 1616 1617 void 1618 xfs_attr_intent_destroy_cache(void) 1619 { 1620 kmem_cache_destroy(xfs_attr_intent_cache); 1621 xfs_attr_intent_cache = NULL; 1622 } 1623