1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2016 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <darrick.wong@oracle.com> 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_btree.h" 15 #include "xfs_bmap.h" 16 #include "xfs_refcount_btree.h" 17 #include "xfs_alloc.h" 18 #include "xfs_errortag.h" 19 #include "xfs_error.h" 20 #include "xfs_trace.h" 21 #include "xfs_trans.h" 22 #include "xfs_bit.h" 23 #include "xfs_refcount.h" 24 #include "xfs_rmap.h" 25 #include "xfs_ag.h" 26 27 struct kmem_cache *xfs_refcount_intent_cache; 28 29 /* Allowable refcount adjustment amounts. */ 30 enum xfs_refc_adjust_op { 31 XFS_REFCOUNT_ADJUST_INCREASE = 1, 32 XFS_REFCOUNT_ADJUST_DECREASE = -1, 33 XFS_REFCOUNT_ADJUST_COW_ALLOC = 0, 34 XFS_REFCOUNT_ADJUST_COW_FREE = -1, 35 }; 36 37 STATIC int __xfs_refcount_cow_alloc(struct xfs_btree_cur *rcur, 38 xfs_agblock_t agbno, xfs_extlen_t aglen); 39 STATIC int __xfs_refcount_cow_free(struct xfs_btree_cur *rcur, 40 xfs_agblock_t agbno, xfs_extlen_t aglen); 41 42 /* 43 * Look up the first record less than or equal to [bno, len] in the btree 44 * given by cur. 45 */ 46 int 47 xfs_refcount_lookup_le( 48 struct xfs_btree_cur *cur, 49 enum xfs_refc_domain domain, 50 xfs_agblock_t bno, 51 int *stat) 52 { 53 trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.pag->pag_agno, 54 xfs_refcount_encode_startblock(bno, domain), 55 XFS_LOOKUP_LE); 56 cur->bc_rec.rc.rc_startblock = bno; 57 cur->bc_rec.rc.rc_blockcount = 0; 58 cur->bc_rec.rc.rc_domain = domain; 59 return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); 60 } 61 62 /* 63 * Look up the first record greater than or equal to [bno, len] in the btree 64 * given by cur. 65 */ 66 int 67 xfs_refcount_lookup_ge( 68 struct xfs_btree_cur *cur, 69 enum xfs_refc_domain domain, 70 xfs_agblock_t bno, 71 int *stat) 72 { 73 trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.pag->pag_agno, 74 xfs_refcount_encode_startblock(bno, domain), 75 XFS_LOOKUP_GE); 76 cur->bc_rec.rc.rc_startblock = bno; 77 cur->bc_rec.rc.rc_blockcount = 0; 78 cur->bc_rec.rc.rc_domain = domain; 79 return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat); 80 } 81 82 /* 83 * Look up the first record equal to [bno, len] in the btree 84 * given by cur. 85 */ 86 int 87 xfs_refcount_lookup_eq( 88 struct xfs_btree_cur *cur, 89 enum xfs_refc_domain domain, 90 xfs_agblock_t bno, 91 int *stat) 92 { 93 trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_ag.pag->pag_agno, 94 xfs_refcount_encode_startblock(bno, domain), 95 XFS_LOOKUP_LE); 96 cur->bc_rec.rc.rc_startblock = bno; 97 cur->bc_rec.rc.rc_blockcount = 0; 98 cur->bc_rec.rc.rc_domain = domain; 99 return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat); 100 } 101 102 /* Convert on-disk record to in-core format. */ 103 void 104 xfs_refcount_btrec_to_irec( 105 const union xfs_btree_rec *rec, 106 struct xfs_refcount_irec *irec) 107 { 108 uint32_t start; 109 110 start = be32_to_cpu(rec->refc.rc_startblock); 111 if (start & XFS_REFC_COWFLAG) { 112 start &= ~XFS_REFC_COWFLAG; 113 irec->rc_domain = XFS_REFC_DOMAIN_COW; 114 } else { 115 irec->rc_domain = XFS_REFC_DOMAIN_SHARED; 116 } 117 118 irec->rc_startblock = start; 119 irec->rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); 120 irec->rc_refcount = be32_to_cpu(rec->refc.rc_refcount); 121 } 122 123 /* 124 * Get the data from the pointed-to record. 125 */ 126 int 127 xfs_refcount_get_rec( 128 struct xfs_btree_cur *cur, 129 struct xfs_refcount_irec *irec, 130 int *stat) 131 { 132 struct xfs_mount *mp = cur->bc_mp; 133 struct xfs_perag *pag = cur->bc_ag.pag; 134 union xfs_btree_rec *rec; 135 int error; 136 137 error = xfs_btree_get_rec(cur, &rec, stat); 138 if (error || !*stat) 139 return error; 140 141 xfs_refcount_btrec_to_irec(rec, irec); 142 if (irec->rc_blockcount == 0 || irec->rc_blockcount > MAXREFCEXTLEN) 143 goto out_bad_rec; 144 145 if (!xfs_refcount_check_domain(irec)) 146 goto out_bad_rec; 147 148 /* check for valid extent range, including overflow */ 149 if (!xfs_verify_agbext(pag, irec->rc_startblock, irec->rc_blockcount)) 150 goto out_bad_rec; 151 152 if (irec->rc_refcount == 0 || irec->rc_refcount > MAXREFCOUNT) 153 goto out_bad_rec; 154 155 trace_xfs_refcount_get(cur->bc_mp, pag->pag_agno, irec); 156 return 0; 157 158 out_bad_rec: 159 xfs_warn(mp, 160 "Refcount BTree record corruption in AG %d detected!", 161 pag->pag_agno); 162 xfs_warn(mp, 163 "Start block 0x%x, block count 0x%x, references 0x%x", 164 irec->rc_startblock, irec->rc_blockcount, irec->rc_refcount); 165 return -EFSCORRUPTED; 166 } 167 168 /* 169 * Update the record referred to by cur to the value given 170 * by [bno, len, refcount]. 171 * This either works (return 0) or gets an EFSCORRUPTED error. 172 */ 173 STATIC int 174 xfs_refcount_update( 175 struct xfs_btree_cur *cur, 176 struct xfs_refcount_irec *irec) 177 { 178 union xfs_btree_rec rec; 179 uint32_t start; 180 int error; 181 182 trace_xfs_refcount_update(cur->bc_mp, cur->bc_ag.pag->pag_agno, irec); 183 184 start = xfs_refcount_encode_startblock(irec->rc_startblock, 185 irec->rc_domain); 186 rec.refc.rc_startblock = cpu_to_be32(start); 187 rec.refc.rc_blockcount = cpu_to_be32(irec->rc_blockcount); 188 rec.refc.rc_refcount = cpu_to_be32(irec->rc_refcount); 189 190 error = xfs_btree_update(cur, &rec); 191 if (error) 192 trace_xfs_refcount_update_error(cur->bc_mp, 193 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 194 return error; 195 } 196 197 /* 198 * Insert the record referred to by cur to the value given 199 * by [bno, len, refcount]. 200 * This either works (return 0) or gets an EFSCORRUPTED error. 201 */ 202 int 203 xfs_refcount_insert( 204 struct xfs_btree_cur *cur, 205 struct xfs_refcount_irec *irec, 206 int *i) 207 { 208 int error; 209 210 trace_xfs_refcount_insert(cur->bc_mp, cur->bc_ag.pag->pag_agno, irec); 211 212 cur->bc_rec.rc.rc_startblock = irec->rc_startblock; 213 cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount; 214 cur->bc_rec.rc.rc_refcount = irec->rc_refcount; 215 cur->bc_rec.rc.rc_domain = irec->rc_domain; 216 217 error = xfs_btree_insert(cur, i); 218 if (error) 219 goto out_error; 220 if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { 221 error = -EFSCORRUPTED; 222 goto out_error; 223 } 224 225 out_error: 226 if (error) 227 trace_xfs_refcount_insert_error(cur->bc_mp, 228 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 229 return error; 230 } 231 232 /* 233 * Remove the record referred to by cur, then set the pointer to the spot 234 * where the record could be re-inserted, in case we want to increment or 235 * decrement the cursor. 236 * This either works (return 0) or gets an EFSCORRUPTED error. 237 */ 238 STATIC int 239 xfs_refcount_delete( 240 struct xfs_btree_cur *cur, 241 int *i) 242 { 243 struct xfs_refcount_irec irec; 244 int found_rec; 245 int error; 246 247 error = xfs_refcount_get_rec(cur, &irec, &found_rec); 248 if (error) 249 goto out_error; 250 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 251 error = -EFSCORRUPTED; 252 goto out_error; 253 } 254 trace_xfs_refcount_delete(cur->bc_mp, cur->bc_ag.pag->pag_agno, &irec); 255 error = xfs_btree_delete(cur, i); 256 if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { 257 error = -EFSCORRUPTED; 258 goto out_error; 259 } 260 if (error) 261 goto out_error; 262 error = xfs_refcount_lookup_ge(cur, irec.rc_domain, irec.rc_startblock, 263 &found_rec); 264 out_error: 265 if (error) 266 trace_xfs_refcount_delete_error(cur->bc_mp, 267 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 268 return error; 269 } 270 271 /* 272 * Adjusting the Reference Count 273 * 274 * As stated elsewhere, the reference count btree (refcbt) stores 275 * >1 reference counts for extents of physical blocks. In this 276 * operation, we're either raising or lowering the reference count of 277 * some subrange stored in the tree: 278 * 279 * <------ adjustment range ------> 280 * ----+ +---+-----+ +--+--------+--------- 281 * 2 | | 3 | 4 | |17| 55 | 10 282 * ----+ +---+-----+ +--+--------+--------- 283 * X axis is physical blocks number; 284 * reference counts are the numbers inside the rectangles 285 * 286 * The first thing we need to do is to ensure that there are no 287 * refcount extents crossing either boundary of the range to be 288 * adjusted. For any extent that does cross a boundary, split it into 289 * two extents so that we can increment the refcount of one of the 290 * pieces later: 291 * 292 * <------ adjustment range ------> 293 * ----+ +---+-----+ +--+--------+----+---- 294 * 2 | | 3 | 2 | |17| 55 | 10 | 10 295 * ----+ +---+-----+ +--+--------+----+---- 296 * 297 * For this next step, let's assume that all the physical blocks in 298 * the adjustment range are mapped to a file and are therefore in use 299 * at least once. Therefore, we can infer that any gap in the 300 * refcount tree within the adjustment range represents a physical 301 * extent with refcount == 1: 302 * 303 * <------ adjustment range ------> 304 * ----+---+---+-----+-+--+--------+----+---- 305 * 2 |"1"| 3 | 2 |1|17| 55 | 10 | 10 306 * ----+---+---+-----+-+--+--------+----+---- 307 * ^ 308 * 309 * For each extent that falls within the interval range, figure out 310 * which extent is to the left or the right of that extent. Now we 311 * have a left, current, and right extent. If the new reference count 312 * of the center extent enables us to merge left, center, and right 313 * into one record covering all three, do so. If the center extent is 314 * at the left end of the range, abuts the left extent, and its new 315 * reference count matches the left extent's record, then merge them. 316 * If the center extent is at the right end of the range, abuts the 317 * right extent, and the reference counts match, merge those. In the 318 * example, we can left merge (assuming an increment operation): 319 * 320 * <------ adjustment range ------> 321 * --------+---+-----+-+--+--------+----+---- 322 * 2 | 3 | 2 |1|17| 55 | 10 | 10 323 * --------+---+-----+-+--+--------+----+---- 324 * ^ 325 * 326 * For all other extents within the range, adjust the reference count 327 * or delete it if the refcount falls below 2. If we were 328 * incrementing, the end result looks like this: 329 * 330 * <------ adjustment range ------> 331 * --------+---+-----+-+--+--------+----+---- 332 * 2 | 4 | 3 |2|18| 56 | 11 | 10 333 * --------+---+-----+-+--+--------+----+---- 334 * 335 * The result of a decrement operation looks as such: 336 * 337 * <------ adjustment range ------> 338 * ----+ +---+ +--+--------+----+---- 339 * 2 | | 2 | |16| 54 | 9 | 10 340 * ----+ +---+ +--+--------+----+---- 341 * DDDD 111111DD 342 * 343 * The blocks marked "D" are freed; the blocks marked "1" are only 344 * referenced once and therefore the record is removed from the 345 * refcount btree. 346 */ 347 348 /* Next block after this extent. */ 349 static inline xfs_agblock_t 350 xfs_refc_next( 351 struct xfs_refcount_irec *rc) 352 { 353 return rc->rc_startblock + rc->rc_blockcount; 354 } 355 356 /* 357 * Split a refcount extent that crosses agbno. 358 */ 359 STATIC int 360 xfs_refcount_split_extent( 361 struct xfs_btree_cur *cur, 362 enum xfs_refc_domain domain, 363 xfs_agblock_t agbno, 364 bool *shape_changed) 365 { 366 struct xfs_refcount_irec rcext, tmp; 367 int found_rec; 368 int error; 369 370 *shape_changed = false; 371 error = xfs_refcount_lookup_le(cur, domain, agbno, &found_rec); 372 if (error) 373 goto out_error; 374 if (!found_rec) 375 return 0; 376 377 error = xfs_refcount_get_rec(cur, &rcext, &found_rec); 378 if (error) 379 goto out_error; 380 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 381 error = -EFSCORRUPTED; 382 goto out_error; 383 } 384 if (rcext.rc_domain != domain) 385 return 0; 386 if (rcext.rc_startblock == agbno || xfs_refc_next(&rcext) <= agbno) 387 return 0; 388 389 *shape_changed = true; 390 trace_xfs_refcount_split_extent(cur->bc_mp, cur->bc_ag.pag->pag_agno, 391 &rcext, agbno); 392 393 /* Establish the right extent. */ 394 tmp = rcext; 395 tmp.rc_startblock = agbno; 396 tmp.rc_blockcount -= (agbno - rcext.rc_startblock); 397 error = xfs_refcount_update(cur, &tmp); 398 if (error) 399 goto out_error; 400 401 /* Insert the left extent. */ 402 tmp = rcext; 403 tmp.rc_blockcount = agbno - rcext.rc_startblock; 404 error = xfs_refcount_insert(cur, &tmp, &found_rec); 405 if (error) 406 goto out_error; 407 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 408 error = -EFSCORRUPTED; 409 goto out_error; 410 } 411 return error; 412 413 out_error: 414 trace_xfs_refcount_split_extent_error(cur->bc_mp, 415 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 416 return error; 417 } 418 419 /* 420 * Merge the left, center, and right extents. 421 */ 422 STATIC int 423 xfs_refcount_merge_center_extents( 424 struct xfs_btree_cur *cur, 425 struct xfs_refcount_irec *left, 426 struct xfs_refcount_irec *center, 427 struct xfs_refcount_irec *right, 428 unsigned long long extlen, 429 xfs_extlen_t *aglen) 430 { 431 int error; 432 int found_rec; 433 434 trace_xfs_refcount_merge_center_extents(cur->bc_mp, 435 cur->bc_ag.pag->pag_agno, left, center, right); 436 437 ASSERT(left->rc_domain == center->rc_domain); 438 ASSERT(right->rc_domain == center->rc_domain); 439 440 /* 441 * Make sure the center and right extents are not in the btree. 442 * If the center extent was synthesized, the first delete call 443 * removes the right extent and we skip the second deletion. 444 * If center and right were in the btree, then the first delete 445 * call removes the center and the second one removes the right 446 * extent. 447 */ 448 error = xfs_refcount_lookup_ge(cur, center->rc_domain, 449 center->rc_startblock, &found_rec); 450 if (error) 451 goto out_error; 452 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 453 error = -EFSCORRUPTED; 454 goto out_error; 455 } 456 457 error = xfs_refcount_delete(cur, &found_rec); 458 if (error) 459 goto out_error; 460 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 461 error = -EFSCORRUPTED; 462 goto out_error; 463 } 464 465 if (center->rc_refcount > 1) { 466 error = xfs_refcount_delete(cur, &found_rec); 467 if (error) 468 goto out_error; 469 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 470 error = -EFSCORRUPTED; 471 goto out_error; 472 } 473 } 474 475 /* Enlarge the left extent. */ 476 error = xfs_refcount_lookup_le(cur, left->rc_domain, 477 left->rc_startblock, &found_rec); 478 if (error) 479 goto out_error; 480 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 481 error = -EFSCORRUPTED; 482 goto out_error; 483 } 484 485 left->rc_blockcount = extlen; 486 error = xfs_refcount_update(cur, left); 487 if (error) 488 goto out_error; 489 490 *aglen = 0; 491 return error; 492 493 out_error: 494 trace_xfs_refcount_merge_center_extents_error(cur->bc_mp, 495 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 496 return error; 497 } 498 499 /* 500 * Merge with the left extent. 501 */ 502 STATIC int 503 xfs_refcount_merge_left_extent( 504 struct xfs_btree_cur *cur, 505 struct xfs_refcount_irec *left, 506 struct xfs_refcount_irec *cleft, 507 xfs_agblock_t *agbno, 508 xfs_extlen_t *aglen) 509 { 510 int error; 511 int found_rec; 512 513 trace_xfs_refcount_merge_left_extent(cur->bc_mp, 514 cur->bc_ag.pag->pag_agno, left, cleft); 515 516 ASSERT(left->rc_domain == cleft->rc_domain); 517 518 /* If the extent at agbno (cleft) wasn't synthesized, remove it. */ 519 if (cleft->rc_refcount > 1) { 520 error = xfs_refcount_lookup_le(cur, cleft->rc_domain, 521 cleft->rc_startblock, &found_rec); 522 if (error) 523 goto out_error; 524 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 525 error = -EFSCORRUPTED; 526 goto out_error; 527 } 528 529 error = xfs_refcount_delete(cur, &found_rec); 530 if (error) 531 goto out_error; 532 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 533 error = -EFSCORRUPTED; 534 goto out_error; 535 } 536 } 537 538 /* Enlarge the left extent. */ 539 error = xfs_refcount_lookup_le(cur, left->rc_domain, 540 left->rc_startblock, &found_rec); 541 if (error) 542 goto out_error; 543 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 544 error = -EFSCORRUPTED; 545 goto out_error; 546 } 547 548 left->rc_blockcount += cleft->rc_blockcount; 549 error = xfs_refcount_update(cur, left); 550 if (error) 551 goto out_error; 552 553 *agbno += cleft->rc_blockcount; 554 *aglen -= cleft->rc_blockcount; 555 return error; 556 557 out_error: 558 trace_xfs_refcount_merge_left_extent_error(cur->bc_mp, 559 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 560 return error; 561 } 562 563 /* 564 * Merge with the right extent. 565 */ 566 STATIC int 567 xfs_refcount_merge_right_extent( 568 struct xfs_btree_cur *cur, 569 struct xfs_refcount_irec *right, 570 struct xfs_refcount_irec *cright, 571 xfs_extlen_t *aglen) 572 { 573 int error; 574 int found_rec; 575 576 trace_xfs_refcount_merge_right_extent(cur->bc_mp, 577 cur->bc_ag.pag->pag_agno, cright, right); 578 579 ASSERT(right->rc_domain == cright->rc_domain); 580 581 /* 582 * If the extent ending at agbno+aglen (cright) wasn't synthesized, 583 * remove it. 584 */ 585 if (cright->rc_refcount > 1) { 586 error = xfs_refcount_lookup_le(cur, cright->rc_domain, 587 cright->rc_startblock, &found_rec); 588 if (error) 589 goto out_error; 590 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 591 error = -EFSCORRUPTED; 592 goto out_error; 593 } 594 595 error = xfs_refcount_delete(cur, &found_rec); 596 if (error) 597 goto out_error; 598 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 599 error = -EFSCORRUPTED; 600 goto out_error; 601 } 602 } 603 604 /* Enlarge the right extent. */ 605 error = xfs_refcount_lookup_le(cur, right->rc_domain, 606 right->rc_startblock, &found_rec); 607 if (error) 608 goto out_error; 609 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 610 error = -EFSCORRUPTED; 611 goto out_error; 612 } 613 614 right->rc_startblock -= cright->rc_blockcount; 615 right->rc_blockcount += cright->rc_blockcount; 616 error = xfs_refcount_update(cur, right); 617 if (error) 618 goto out_error; 619 620 *aglen -= cright->rc_blockcount; 621 return error; 622 623 out_error: 624 trace_xfs_refcount_merge_right_extent_error(cur->bc_mp, 625 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 626 return error; 627 } 628 629 /* 630 * Find the left extent and the one after it (cleft). This function assumes 631 * that we've already split any extent crossing agbno. 632 */ 633 STATIC int 634 xfs_refcount_find_left_extents( 635 struct xfs_btree_cur *cur, 636 struct xfs_refcount_irec *left, 637 struct xfs_refcount_irec *cleft, 638 enum xfs_refc_domain domain, 639 xfs_agblock_t agbno, 640 xfs_extlen_t aglen) 641 { 642 struct xfs_refcount_irec tmp; 643 int error; 644 int found_rec; 645 646 left->rc_startblock = cleft->rc_startblock = NULLAGBLOCK; 647 error = xfs_refcount_lookup_le(cur, domain, agbno - 1, &found_rec); 648 if (error) 649 goto out_error; 650 if (!found_rec) 651 return 0; 652 653 error = xfs_refcount_get_rec(cur, &tmp, &found_rec); 654 if (error) 655 goto out_error; 656 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 657 error = -EFSCORRUPTED; 658 goto out_error; 659 } 660 661 if (tmp.rc_domain != domain) 662 return 0; 663 if (xfs_refc_next(&tmp) != agbno) 664 return 0; 665 /* We have a left extent; retrieve (or invent) the next right one */ 666 *left = tmp; 667 668 error = xfs_btree_increment(cur, 0, &found_rec); 669 if (error) 670 goto out_error; 671 if (found_rec) { 672 error = xfs_refcount_get_rec(cur, &tmp, &found_rec); 673 if (error) 674 goto out_error; 675 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 676 error = -EFSCORRUPTED; 677 goto out_error; 678 } 679 680 if (tmp.rc_domain != domain) 681 goto not_found; 682 683 /* if tmp starts at the end of our range, just use that */ 684 if (tmp.rc_startblock == agbno) 685 *cleft = tmp; 686 else { 687 /* 688 * There's a gap in the refcntbt at the start of the 689 * range we're interested in (refcount == 1) so 690 * synthesize the implied extent and pass it back. 691 * We assume here that the agbno/aglen range was 692 * passed in from a data fork extent mapping and 693 * therefore is allocated to exactly one owner. 694 */ 695 cleft->rc_startblock = agbno; 696 cleft->rc_blockcount = min(aglen, 697 tmp.rc_startblock - agbno); 698 cleft->rc_refcount = 1; 699 cleft->rc_domain = domain; 700 } 701 } else { 702 not_found: 703 /* 704 * No extents, so pretend that there's one covering the whole 705 * range. 706 */ 707 cleft->rc_startblock = agbno; 708 cleft->rc_blockcount = aglen; 709 cleft->rc_refcount = 1; 710 cleft->rc_domain = domain; 711 } 712 trace_xfs_refcount_find_left_extent(cur->bc_mp, cur->bc_ag.pag->pag_agno, 713 left, cleft, agbno); 714 return error; 715 716 out_error: 717 trace_xfs_refcount_find_left_extent_error(cur->bc_mp, 718 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 719 return error; 720 } 721 722 /* 723 * Find the right extent and the one before it (cright). This function 724 * assumes that we've already split any extents crossing agbno + aglen. 725 */ 726 STATIC int 727 xfs_refcount_find_right_extents( 728 struct xfs_btree_cur *cur, 729 struct xfs_refcount_irec *right, 730 struct xfs_refcount_irec *cright, 731 enum xfs_refc_domain domain, 732 xfs_agblock_t agbno, 733 xfs_extlen_t aglen) 734 { 735 struct xfs_refcount_irec tmp; 736 int error; 737 int found_rec; 738 739 right->rc_startblock = cright->rc_startblock = NULLAGBLOCK; 740 error = xfs_refcount_lookup_ge(cur, domain, agbno + aglen, &found_rec); 741 if (error) 742 goto out_error; 743 if (!found_rec) 744 return 0; 745 746 error = xfs_refcount_get_rec(cur, &tmp, &found_rec); 747 if (error) 748 goto out_error; 749 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 750 error = -EFSCORRUPTED; 751 goto out_error; 752 } 753 754 if (tmp.rc_domain != domain) 755 return 0; 756 if (tmp.rc_startblock != agbno + aglen) 757 return 0; 758 /* We have a right extent; retrieve (or invent) the next left one */ 759 *right = tmp; 760 761 error = xfs_btree_decrement(cur, 0, &found_rec); 762 if (error) 763 goto out_error; 764 if (found_rec) { 765 error = xfs_refcount_get_rec(cur, &tmp, &found_rec); 766 if (error) 767 goto out_error; 768 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 769 error = -EFSCORRUPTED; 770 goto out_error; 771 } 772 773 if (tmp.rc_domain != domain) 774 goto not_found; 775 776 /* if tmp ends at the end of our range, just use that */ 777 if (xfs_refc_next(&tmp) == agbno + aglen) 778 *cright = tmp; 779 else { 780 /* 781 * There's a gap in the refcntbt at the end of the 782 * range we're interested in (refcount == 1) so 783 * create the implied extent and pass it back. 784 * We assume here that the agbno/aglen range was 785 * passed in from a data fork extent mapping and 786 * therefore is allocated to exactly one owner. 787 */ 788 cright->rc_startblock = max(agbno, xfs_refc_next(&tmp)); 789 cright->rc_blockcount = right->rc_startblock - 790 cright->rc_startblock; 791 cright->rc_refcount = 1; 792 cright->rc_domain = domain; 793 } 794 } else { 795 not_found: 796 /* 797 * No extents, so pretend that there's one covering the whole 798 * range. 799 */ 800 cright->rc_startblock = agbno; 801 cright->rc_blockcount = aglen; 802 cright->rc_refcount = 1; 803 cright->rc_domain = domain; 804 } 805 trace_xfs_refcount_find_right_extent(cur->bc_mp, cur->bc_ag.pag->pag_agno, 806 cright, right, agbno + aglen); 807 return error; 808 809 out_error: 810 trace_xfs_refcount_find_right_extent_error(cur->bc_mp, 811 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 812 return error; 813 } 814 815 /* Is this extent valid? */ 816 static inline bool 817 xfs_refc_valid( 818 const struct xfs_refcount_irec *rc) 819 { 820 return rc->rc_startblock != NULLAGBLOCK; 821 } 822 823 static inline xfs_nlink_t 824 xfs_refc_merge_refcount( 825 const struct xfs_refcount_irec *irec, 826 enum xfs_refc_adjust_op adjust) 827 { 828 /* Once a record hits MAXREFCOUNT, it is pinned there forever */ 829 if (irec->rc_refcount == MAXREFCOUNT) 830 return MAXREFCOUNT; 831 return irec->rc_refcount + adjust; 832 } 833 834 static inline bool 835 xfs_refc_want_merge_center( 836 const struct xfs_refcount_irec *left, 837 const struct xfs_refcount_irec *cleft, 838 const struct xfs_refcount_irec *cright, 839 const struct xfs_refcount_irec *right, 840 bool cleft_is_cright, 841 enum xfs_refc_adjust_op adjust, 842 unsigned long long *ulenp) 843 { 844 unsigned long long ulen = left->rc_blockcount; 845 xfs_nlink_t new_refcount; 846 847 /* 848 * To merge with a center record, both shoulder records must be 849 * adjacent to the record we want to adjust. This is only true if 850 * find_left and find_right made all four records valid. 851 */ 852 if (!xfs_refc_valid(left) || !xfs_refc_valid(right) || 853 !xfs_refc_valid(cleft) || !xfs_refc_valid(cright)) 854 return false; 855 856 /* There must only be one record for the entire range. */ 857 if (!cleft_is_cright) 858 return false; 859 860 /* The shoulder record refcounts must match the new refcount. */ 861 new_refcount = xfs_refc_merge_refcount(cleft, adjust); 862 if (left->rc_refcount != new_refcount) 863 return false; 864 if (right->rc_refcount != new_refcount) 865 return false; 866 867 /* 868 * The new record cannot exceed the max length. ulen is a ULL as the 869 * individual record block counts can be up to (u32 - 1) in length 870 * hence we need to catch u32 addition overflows here. 871 */ 872 ulen += cleft->rc_blockcount + right->rc_blockcount; 873 if (ulen >= MAXREFCEXTLEN) 874 return false; 875 876 *ulenp = ulen; 877 return true; 878 } 879 880 static inline bool 881 xfs_refc_want_merge_left( 882 const struct xfs_refcount_irec *left, 883 const struct xfs_refcount_irec *cleft, 884 enum xfs_refc_adjust_op adjust) 885 { 886 unsigned long long ulen = left->rc_blockcount; 887 xfs_nlink_t new_refcount; 888 889 /* 890 * For a left merge, the left shoulder record must be adjacent to the 891 * start of the range. If this is true, find_left made left and cleft 892 * contain valid contents. 893 */ 894 if (!xfs_refc_valid(left) || !xfs_refc_valid(cleft)) 895 return false; 896 897 /* Left shoulder record refcount must match the new refcount. */ 898 new_refcount = xfs_refc_merge_refcount(cleft, adjust); 899 if (left->rc_refcount != new_refcount) 900 return false; 901 902 /* 903 * The new record cannot exceed the max length. ulen is a ULL as the 904 * individual record block counts can be up to (u32 - 1) in length 905 * hence we need to catch u32 addition overflows here. 906 */ 907 ulen += cleft->rc_blockcount; 908 if (ulen >= MAXREFCEXTLEN) 909 return false; 910 911 return true; 912 } 913 914 static inline bool 915 xfs_refc_want_merge_right( 916 const struct xfs_refcount_irec *cright, 917 const struct xfs_refcount_irec *right, 918 enum xfs_refc_adjust_op adjust) 919 { 920 unsigned long long ulen = right->rc_blockcount; 921 xfs_nlink_t new_refcount; 922 923 /* 924 * For a right merge, the right shoulder record must be adjacent to the 925 * end of the range. If this is true, find_right made cright and right 926 * contain valid contents. 927 */ 928 if (!xfs_refc_valid(right) || !xfs_refc_valid(cright)) 929 return false; 930 931 /* Right shoulder record refcount must match the new refcount. */ 932 new_refcount = xfs_refc_merge_refcount(cright, adjust); 933 if (right->rc_refcount != new_refcount) 934 return false; 935 936 /* 937 * The new record cannot exceed the max length. ulen is a ULL as the 938 * individual record block counts can be up to (u32 - 1) in length 939 * hence we need to catch u32 addition overflows here. 940 */ 941 ulen += cright->rc_blockcount; 942 if (ulen >= MAXREFCEXTLEN) 943 return false; 944 945 return true; 946 } 947 948 /* 949 * Try to merge with any extents on the boundaries of the adjustment range. 950 */ 951 STATIC int 952 xfs_refcount_merge_extents( 953 struct xfs_btree_cur *cur, 954 enum xfs_refc_domain domain, 955 xfs_agblock_t *agbno, 956 xfs_extlen_t *aglen, 957 enum xfs_refc_adjust_op adjust, 958 bool *shape_changed) 959 { 960 struct xfs_refcount_irec left = {0}, cleft = {0}; 961 struct xfs_refcount_irec cright = {0}, right = {0}; 962 int error; 963 unsigned long long ulen; 964 bool cequal; 965 966 *shape_changed = false; 967 /* 968 * Find the extent just below agbno [left], just above agbno [cleft], 969 * just below (agbno + aglen) [cright], and just above (agbno + aglen) 970 * [right]. 971 */ 972 error = xfs_refcount_find_left_extents(cur, &left, &cleft, domain, 973 *agbno, *aglen); 974 if (error) 975 return error; 976 error = xfs_refcount_find_right_extents(cur, &right, &cright, domain, 977 *agbno, *aglen); 978 if (error) 979 return error; 980 981 /* No left or right extent to merge; exit. */ 982 if (!xfs_refc_valid(&left) && !xfs_refc_valid(&right)) 983 return 0; 984 985 cequal = (cleft.rc_startblock == cright.rc_startblock) && 986 (cleft.rc_blockcount == cright.rc_blockcount); 987 988 /* Try to merge left, cleft, and right. cleft must == cright. */ 989 if (xfs_refc_want_merge_center(&left, &cleft, &cright, &right, cequal, 990 adjust, &ulen)) { 991 *shape_changed = true; 992 return xfs_refcount_merge_center_extents(cur, &left, &cleft, 993 &right, ulen, aglen); 994 } 995 996 /* Try to merge left and cleft. */ 997 if (xfs_refc_want_merge_left(&left, &cleft, adjust)) { 998 *shape_changed = true; 999 error = xfs_refcount_merge_left_extent(cur, &left, &cleft, 1000 agbno, aglen); 1001 if (error) 1002 return error; 1003 1004 /* 1005 * If we just merged left + cleft and cleft == cright, 1006 * we no longer have a cright to merge with right. We're done. 1007 */ 1008 if (cequal) 1009 return 0; 1010 } 1011 1012 /* Try to merge cright and right. */ 1013 if (xfs_refc_want_merge_right(&cright, &right, adjust)) { 1014 *shape_changed = true; 1015 return xfs_refcount_merge_right_extent(cur, &right, &cright, 1016 aglen); 1017 } 1018 1019 return 0; 1020 } 1021 1022 /* 1023 * XXX: This is a pretty hand-wavy estimate. The penalty for guessing 1024 * true incorrectly is a shutdown FS; the penalty for guessing false 1025 * incorrectly is more transaction rolls than might be necessary. 1026 * Be conservative here. 1027 */ 1028 static bool 1029 xfs_refcount_still_have_space( 1030 struct xfs_btree_cur *cur) 1031 { 1032 unsigned long overhead; 1033 1034 /* 1035 * Worst case estimate: full splits of the free space and rmap btrees 1036 * to handle each of the shape changes to the refcount btree. 1037 */ 1038 overhead = xfs_allocfree_block_count(cur->bc_mp, 1039 cur->bc_ag.refc.shape_changes); 1040 overhead += cur->bc_mp->m_refc_maxlevels; 1041 overhead *= cur->bc_mp->m_sb.sb_blocksize; 1042 1043 /* 1044 * Only allow 2 refcount extent updates per transaction if the 1045 * refcount continue update "error" has been injected. 1046 */ 1047 if (cur->bc_ag.refc.nr_ops > 2 && 1048 XFS_TEST_ERROR(false, cur->bc_mp, 1049 XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE)) 1050 return false; 1051 1052 if (cur->bc_ag.refc.nr_ops == 0) 1053 return true; 1054 else if (overhead > cur->bc_tp->t_log_res) 1055 return false; 1056 return cur->bc_tp->t_log_res - overhead > 1057 cur->bc_ag.refc.nr_ops * XFS_REFCOUNT_ITEM_OVERHEAD; 1058 } 1059 1060 /* 1061 * Adjust the refcounts of middle extents. At this point we should have 1062 * split extents that crossed the adjustment range; merged with adjacent 1063 * extents; and updated agbno/aglen to reflect the merges. Therefore, 1064 * all we have to do is update the extents inside [agbno, agbno + aglen]. 1065 */ 1066 STATIC int 1067 xfs_refcount_adjust_extents( 1068 struct xfs_btree_cur *cur, 1069 xfs_agblock_t *agbno, 1070 xfs_extlen_t *aglen, 1071 enum xfs_refc_adjust_op adj) 1072 { 1073 struct xfs_refcount_irec ext, tmp; 1074 int error; 1075 int found_rec, found_tmp; 1076 xfs_fsblock_t fsbno; 1077 1078 /* Merging did all the work already. */ 1079 if (*aglen == 0) 1080 return 0; 1081 1082 error = xfs_refcount_lookup_ge(cur, XFS_REFC_DOMAIN_SHARED, *agbno, 1083 &found_rec); 1084 if (error) 1085 goto out_error; 1086 1087 while (*aglen > 0 && xfs_refcount_still_have_space(cur)) { 1088 error = xfs_refcount_get_rec(cur, &ext, &found_rec); 1089 if (error) 1090 goto out_error; 1091 if (!found_rec || ext.rc_domain != XFS_REFC_DOMAIN_SHARED) { 1092 ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; 1093 ext.rc_blockcount = 0; 1094 ext.rc_refcount = 0; 1095 ext.rc_domain = XFS_REFC_DOMAIN_SHARED; 1096 } 1097 1098 /* 1099 * Deal with a hole in the refcount tree; if a file maps to 1100 * these blocks and there's no refcountbt record, pretend that 1101 * there is one with refcount == 1. 1102 */ 1103 if (ext.rc_startblock != *agbno) { 1104 tmp.rc_startblock = *agbno; 1105 tmp.rc_blockcount = min(*aglen, 1106 ext.rc_startblock - *agbno); 1107 tmp.rc_refcount = 1 + adj; 1108 tmp.rc_domain = XFS_REFC_DOMAIN_SHARED; 1109 1110 trace_xfs_refcount_modify_extent(cur->bc_mp, 1111 cur->bc_ag.pag->pag_agno, &tmp); 1112 1113 /* 1114 * Either cover the hole (increment) or 1115 * delete the range (decrement). 1116 */ 1117 cur->bc_ag.refc.nr_ops++; 1118 if (tmp.rc_refcount) { 1119 error = xfs_refcount_insert(cur, &tmp, 1120 &found_tmp); 1121 if (error) 1122 goto out_error; 1123 if (XFS_IS_CORRUPT(cur->bc_mp, 1124 found_tmp != 1)) { 1125 error = -EFSCORRUPTED; 1126 goto out_error; 1127 } 1128 } else { 1129 fsbno = XFS_AGB_TO_FSB(cur->bc_mp, 1130 cur->bc_ag.pag->pag_agno, 1131 tmp.rc_startblock); 1132 xfs_free_extent_later(cur->bc_tp, fsbno, 1133 tmp.rc_blockcount, NULL); 1134 } 1135 1136 (*agbno) += tmp.rc_blockcount; 1137 (*aglen) -= tmp.rc_blockcount; 1138 1139 /* Stop if there's nothing left to modify */ 1140 if (*aglen == 0 || !xfs_refcount_still_have_space(cur)) 1141 break; 1142 1143 /* Move the cursor to the start of ext. */ 1144 error = xfs_refcount_lookup_ge(cur, 1145 XFS_REFC_DOMAIN_SHARED, *agbno, 1146 &found_rec); 1147 if (error) 1148 goto out_error; 1149 } 1150 1151 /* 1152 * A previous step trimmed agbno/aglen such that the end of the 1153 * range would not be in the middle of the record. If this is 1154 * no longer the case, something is seriously wrong with the 1155 * btree. Make sure we never feed the synthesized record into 1156 * the processing loop below. 1157 */ 1158 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount == 0) || 1159 XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount > *aglen)) { 1160 error = -EFSCORRUPTED; 1161 goto out_error; 1162 } 1163 1164 /* 1165 * Adjust the reference count and either update the tree 1166 * (incr) or free the blocks (decr). 1167 */ 1168 if (ext.rc_refcount == MAXREFCOUNT) 1169 goto skip; 1170 ext.rc_refcount += adj; 1171 trace_xfs_refcount_modify_extent(cur->bc_mp, 1172 cur->bc_ag.pag->pag_agno, &ext); 1173 cur->bc_ag.refc.nr_ops++; 1174 if (ext.rc_refcount > 1) { 1175 error = xfs_refcount_update(cur, &ext); 1176 if (error) 1177 goto out_error; 1178 } else if (ext.rc_refcount == 1) { 1179 error = xfs_refcount_delete(cur, &found_rec); 1180 if (error) 1181 goto out_error; 1182 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 1183 error = -EFSCORRUPTED; 1184 goto out_error; 1185 } 1186 goto advloop; 1187 } else { 1188 fsbno = XFS_AGB_TO_FSB(cur->bc_mp, 1189 cur->bc_ag.pag->pag_agno, 1190 ext.rc_startblock); 1191 xfs_free_extent_later(cur->bc_tp, fsbno, 1192 ext.rc_blockcount, NULL); 1193 } 1194 1195 skip: 1196 error = xfs_btree_increment(cur, 0, &found_rec); 1197 if (error) 1198 goto out_error; 1199 1200 advloop: 1201 (*agbno) += ext.rc_blockcount; 1202 (*aglen) -= ext.rc_blockcount; 1203 } 1204 1205 return error; 1206 out_error: 1207 trace_xfs_refcount_modify_extent_error(cur->bc_mp, 1208 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 1209 return error; 1210 } 1211 1212 /* Adjust the reference count of a range of AG blocks. */ 1213 STATIC int 1214 xfs_refcount_adjust( 1215 struct xfs_btree_cur *cur, 1216 xfs_agblock_t *agbno, 1217 xfs_extlen_t *aglen, 1218 enum xfs_refc_adjust_op adj) 1219 { 1220 bool shape_changed; 1221 int shape_changes = 0; 1222 int error; 1223 1224 if (adj == XFS_REFCOUNT_ADJUST_INCREASE) 1225 trace_xfs_refcount_increase(cur->bc_mp, 1226 cur->bc_ag.pag->pag_agno, *agbno, *aglen); 1227 else 1228 trace_xfs_refcount_decrease(cur->bc_mp, 1229 cur->bc_ag.pag->pag_agno, *agbno, *aglen); 1230 1231 /* 1232 * Ensure that no rcextents cross the boundary of the adjustment range. 1233 */ 1234 error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_SHARED, 1235 *agbno, &shape_changed); 1236 if (error) 1237 goto out_error; 1238 if (shape_changed) 1239 shape_changes++; 1240 1241 error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_SHARED, 1242 *agbno + *aglen, &shape_changed); 1243 if (error) 1244 goto out_error; 1245 if (shape_changed) 1246 shape_changes++; 1247 1248 /* 1249 * Try to merge with the left or right extents of the range. 1250 */ 1251 error = xfs_refcount_merge_extents(cur, XFS_REFC_DOMAIN_SHARED, 1252 agbno, aglen, adj, &shape_changed); 1253 if (error) 1254 goto out_error; 1255 if (shape_changed) 1256 shape_changes++; 1257 if (shape_changes) 1258 cur->bc_ag.refc.shape_changes++; 1259 1260 /* Now that we've taken care of the ends, adjust the middle extents */ 1261 error = xfs_refcount_adjust_extents(cur, agbno, aglen, adj); 1262 if (error) 1263 goto out_error; 1264 1265 return 0; 1266 1267 out_error: 1268 trace_xfs_refcount_adjust_error(cur->bc_mp, cur->bc_ag.pag->pag_agno, 1269 error, _RET_IP_); 1270 return error; 1271 } 1272 1273 /* Clean up after calling xfs_refcount_finish_one. */ 1274 void 1275 xfs_refcount_finish_one_cleanup( 1276 struct xfs_trans *tp, 1277 struct xfs_btree_cur *rcur, 1278 int error) 1279 { 1280 struct xfs_buf *agbp; 1281 1282 if (rcur == NULL) 1283 return; 1284 agbp = rcur->bc_ag.agbp; 1285 xfs_btree_del_cursor(rcur, error); 1286 if (error) 1287 xfs_trans_brelse(tp, agbp); 1288 } 1289 1290 /* 1291 * Set up a continuation a deferred refcount operation by updating the intent. 1292 * Checks to make sure we're not going to run off the end of the AG. 1293 */ 1294 static inline int 1295 xfs_refcount_continue_op( 1296 struct xfs_btree_cur *cur, 1297 struct xfs_refcount_intent *ri, 1298 xfs_agblock_t new_agbno) 1299 { 1300 struct xfs_mount *mp = cur->bc_mp; 1301 struct xfs_perag *pag = cur->bc_ag.pag; 1302 1303 if (XFS_IS_CORRUPT(mp, !xfs_verify_agbext(pag, new_agbno, 1304 ri->ri_blockcount))) 1305 return -EFSCORRUPTED; 1306 1307 ri->ri_startblock = XFS_AGB_TO_FSB(mp, pag->pag_agno, new_agbno); 1308 1309 ASSERT(xfs_verify_fsbext(mp, ri->ri_startblock, ri->ri_blockcount)); 1310 ASSERT(pag->pag_agno == XFS_FSB_TO_AGNO(mp, ri->ri_startblock)); 1311 1312 return 0; 1313 } 1314 1315 /* 1316 * Process one of the deferred refcount operations. We pass back the 1317 * btree cursor to maintain our lock on the btree between calls. 1318 * This saves time and eliminates a buffer deadlock between the 1319 * superblock and the AGF because we'll always grab them in the same 1320 * order. 1321 */ 1322 int 1323 xfs_refcount_finish_one( 1324 struct xfs_trans *tp, 1325 struct xfs_refcount_intent *ri, 1326 struct xfs_btree_cur **pcur) 1327 { 1328 struct xfs_mount *mp = tp->t_mountp; 1329 struct xfs_btree_cur *rcur; 1330 struct xfs_buf *agbp = NULL; 1331 int error = 0; 1332 xfs_agblock_t bno; 1333 unsigned long nr_ops = 0; 1334 int shape_changes = 0; 1335 struct xfs_perag *pag; 1336 1337 pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, ri->ri_startblock)); 1338 bno = XFS_FSB_TO_AGBNO(mp, ri->ri_startblock); 1339 1340 trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, ri->ri_startblock), 1341 ri->ri_type, XFS_FSB_TO_AGBNO(mp, ri->ri_startblock), 1342 ri->ri_blockcount); 1343 1344 if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_REFCOUNT_FINISH_ONE)) { 1345 error = -EIO; 1346 goto out_drop; 1347 } 1348 1349 /* 1350 * If we haven't gotten a cursor or the cursor AG doesn't match 1351 * the startblock, get one now. 1352 */ 1353 rcur = *pcur; 1354 if (rcur != NULL && rcur->bc_ag.pag != pag) { 1355 nr_ops = rcur->bc_ag.refc.nr_ops; 1356 shape_changes = rcur->bc_ag.refc.shape_changes; 1357 xfs_refcount_finish_one_cleanup(tp, rcur, 0); 1358 rcur = NULL; 1359 *pcur = NULL; 1360 } 1361 if (rcur == NULL) { 1362 error = xfs_alloc_read_agf(pag, tp, XFS_ALLOC_FLAG_FREEING, 1363 &agbp); 1364 if (error) 1365 goto out_drop; 1366 1367 rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, pag); 1368 rcur->bc_ag.refc.nr_ops = nr_ops; 1369 rcur->bc_ag.refc.shape_changes = shape_changes; 1370 } 1371 *pcur = rcur; 1372 1373 switch (ri->ri_type) { 1374 case XFS_REFCOUNT_INCREASE: 1375 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, 1376 XFS_REFCOUNT_ADJUST_INCREASE); 1377 if (error) 1378 goto out_drop; 1379 if (ri->ri_blockcount > 0) 1380 error = xfs_refcount_continue_op(rcur, ri, bno); 1381 break; 1382 case XFS_REFCOUNT_DECREASE: 1383 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, 1384 XFS_REFCOUNT_ADJUST_DECREASE); 1385 if (error) 1386 goto out_drop; 1387 if (ri->ri_blockcount > 0) 1388 error = xfs_refcount_continue_op(rcur, ri, bno); 1389 break; 1390 case XFS_REFCOUNT_ALLOC_COW: 1391 error = __xfs_refcount_cow_alloc(rcur, bno, ri->ri_blockcount); 1392 if (error) 1393 goto out_drop; 1394 ri->ri_blockcount = 0; 1395 break; 1396 case XFS_REFCOUNT_FREE_COW: 1397 error = __xfs_refcount_cow_free(rcur, bno, ri->ri_blockcount); 1398 if (error) 1399 goto out_drop; 1400 ri->ri_blockcount = 0; 1401 break; 1402 default: 1403 ASSERT(0); 1404 error = -EFSCORRUPTED; 1405 } 1406 if (!error && ri->ri_blockcount > 0) 1407 trace_xfs_refcount_finish_one_leftover(mp, pag->pag_agno, 1408 ri->ri_type, bno, ri->ri_blockcount); 1409 out_drop: 1410 xfs_perag_put(pag); 1411 return error; 1412 } 1413 1414 /* 1415 * Record a refcount intent for later processing. 1416 */ 1417 static void 1418 __xfs_refcount_add( 1419 struct xfs_trans *tp, 1420 enum xfs_refcount_intent_type type, 1421 xfs_fsblock_t startblock, 1422 xfs_extlen_t blockcount) 1423 { 1424 struct xfs_refcount_intent *ri; 1425 1426 trace_xfs_refcount_defer(tp->t_mountp, 1427 XFS_FSB_TO_AGNO(tp->t_mountp, startblock), 1428 type, XFS_FSB_TO_AGBNO(tp->t_mountp, startblock), 1429 blockcount); 1430 1431 ri = kmem_cache_alloc(xfs_refcount_intent_cache, 1432 GFP_NOFS | __GFP_NOFAIL); 1433 INIT_LIST_HEAD(&ri->ri_list); 1434 ri->ri_type = type; 1435 ri->ri_startblock = startblock; 1436 ri->ri_blockcount = blockcount; 1437 1438 xfs_defer_add(tp, XFS_DEFER_OPS_TYPE_REFCOUNT, &ri->ri_list); 1439 } 1440 1441 /* 1442 * Increase the reference count of the blocks backing a file's extent. 1443 */ 1444 void 1445 xfs_refcount_increase_extent( 1446 struct xfs_trans *tp, 1447 struct xfs_bmbt_irec *PREV) 1448 { 1449 if (!xfs_has_reflink(tp->t_mountp)) 1450 return; 1451 1452 __xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, PREV->br_startblock, 1453 PREV->br_blockcount); 1454 } 1455 1456 /* 1457 * Decrease the reference count of the blocks backing a file's extent. 1458 */ 1459 void 1460 xfs_refcount_decrease_extent( 1461 struct xfs_trans *tp, 1462 struct xfs_bmbt_irec *PREV) 1463 { 1464 if (!xfs_has_reflink(tp->t_mountp)) 1465 return; 1466 1467 __xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, PREV->br_startblock, 1468 PREV->br_blockcount); 1469 } 1470 1471 /* 1472 * Given an AG extent, find the lowest-numbered run of shared blocks 1473 * within that range and return the range in fbno/flen. If 1474 * find_end_of_shared is set, return the longest contiguous extent of 1475 * shared blocks; if not, just return the first extent we find. If no 1476 * shared blocks are found, fbno and flen will be set to NULLAGBLOCK 1477 * and 0, respectively. 1478 */ 1479 int 1480 xfs_refcount_find_shared( 1481 struct xfs_btree_cur *cur, 1482 xfs_agblock_t agbno, 1483 xfs_extlen_t aglen, 1484 xfs_agblock_t *fbno, 1485 xfs_extlen_t *flen, 1486 bool find_end_of_shared) 1487 { 1488 struct xfs_refcount_irec tmp; 1489 int i; 1490 int have; 1491 int error; 1492 1493 trace_xfs_refcount_find_shared(cur->bc_mp, cur->bc_ag.pag->pag_agno, 1494 agbno, aglen); 1495 1496 /* By default, skip the whole range */ 1497 *fbno = NULLAGBLOCK; 1498 *flen = 0; 1499 1500 /* Try to find a refcount extent that crosses the start */ 1501 error = xfs_refcount_lookup_le(cur, XFS_REFC_DOMAIN_SHARED, agbno, 1502 &have); 1503 if (error) 1504 goto out_error; 1505 if (!have) { 1506 /* No left extent, look at the next one */ 1507 error = xfs_btree_increment(cur, 0, &have); 1508 if (error) 1509 goto out_error; 1510 if (!have) 1511 goto done; 1512 } 1513 error = xfs_refcount_get_rec(cur, &tmp, &i); 1514 if (error) 1515 goto out_error; 1516 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { 1517 error = -EFSCORRUPTED; 1518 goto out_error; 1519 } 1520 if (tmp.rc_domain != XFS_REFC_DOMAIN_SHARED) 1521 goto done; 1522 1523 /* If the extent ends before the start, look at the next one */ 1524 if (tmp.rc_startblock + tmp.rc_blockcount <= agbno) { 1525 error = xfs_btree_increment(cur, 0, &have); 1526 if (error) 1527 goto out_error; 1528 if (!have) 1529 goto done; 1530 error = xfs_refcount_get_rec(cur, &tmp, &i); 1531 if (error) 1532 goto out_error; 1533 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { 1534 error = -EFSCORRUPTED; 1535 goto out_error; 1536 } 1537 if (tmp.rc_domain != XFS_REFC_DOMAIN_SHARED) 1538 goto done; 1539 } 1540 1541 /* If the extent starts after the range we want, bail out */ 1542 if (tmp.rc_startblock >= agbno + aglen) 1543 goto done; 1544 1545 /* We found the start of a shared extent! */ 1546 if (tmp.rc_startblock < agbno) { 1547 tmp.rc_blockcount -= (agbno - tmp.rc_startblock); 1548 tmp.rc_startblock = agbno; 1549 } 1550 1551 *fbno = tmp.rc_startblock; 1552 *flen = min(tmp.rc_blockcount, agbno + aglen - *fbno); 1553 if (!find_end_of_shared) 1554 goto done; 1555 1556 /* Otherwise, find the end of this shared extent */ 1557 while (*fbno + *flen < agbno + aglen) { 1558 error = xfs_btree_increment(cur, 0, &have); 1559 if (error) 1560 goto out_error; 1561 if (!have) 1562 break; 1563 error = xfs_refcount_get_rec(cur, &tmp, &i); 1564 if (error) 1565 goto out_error; 1566 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { 1567 error = -EFSCORRUPTED; 1568 goto out_error; 1569 } 1570 if (tmp.rc_domain != XFS_REFC_DOMAIN_SHARED || 1571 tmp.rc_startblock >= agbno + aglen || 1572 tmp.rc_startblock != *fbno + *flen) 1573 break; 1574 *flen = min(*flen + tmp.rc_blockcount, agbno + aglen - *fbno); 1575 } 1576 1577 done: 1578 trace_xfs_refcount_find_shared_result(cur->bc_mp, 1579 cur->bc_ag.pag->pag_agno, *fbno, *flen); 1580 1581 out_error: 1582 if (error) 1583 trace_xfs_refcount_find_shared_error(cur->bc_mp, 1584 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 1585 return error; 1586 } 1587 1588 /* 1589 * Recovering CoW Blocks After a Crash 1590 * 1591 * Due to the way that the copy on write mechanism works, there's a window of 1592 * opportunity in which we can lose track of allocated blocks during a crash. 1593 * Because CoW uses delayed allocation in the in-core CoW fork, writeback 1594 * causes blocks to be allocated and stored in the CoW fork. The blocks are 1595 * no longer in the free space btree but are not otherwise recorded anywhere 1596 * until the write completes and the blocks are mapped into the file. A crash 1597 * in between allocation and remapping results in the replacement blocks being 1598 * lost. This situation is exacerbated by the CoW extent size hint because 1599 * allocations can hang around for long time. 1600 * 1601 * However, there is a place where we can record these allocations before they 1602 * become mappings -- the reference count btree. The btree does not record 1603 * extents with refcount == 1, so we can record allocations with a refcount of 1604 * 1. Blocks being used for CoW writeout cannot be shared, so there should be 1605 * no conflict with shared block records. These mappings should be created 1606 * when we allocate blocks to the CoW fork and deleted when they're removed 1607 * from the CoW fork. 1608 * 1609 * Minor nit: records for in-progress CoW allocations and records for shared 1610 * extents must never be merged, to preserve the property that (except for CoW 1611 * allocations) there are no refcount btree entries with refcount == 1. The 1612 * only time this could potentially happen is when unsharing a block that's 1613 * adjacent to CoW allocations, so we must be careful to avoid this. 1614 * 1615 * At mount time we recover lost CoW allocations by searching the refcount 1616 * btree for these refcount == 1 mappings. These represent CoW allocations 1617 * that were in progress at the time the filesystem went down, so we can free 1618 * them to get the space back. 1619 * 1620 * This mechanism is superior to creating EFIs for unmapped CoW extents for 1621 * several reasons -- first, EFIs pin the tail of the log and would have to be 1622 * periodically relogged to avoid filling up the log. Second, CoW completions 1623 * will have to file an EFD and create new EFIs for whatever remains in the 1624 * CoW fork; this partially takes care of (1) but extent-size reservations 1625 * will have to periodically relog even if there's no writeout in progress. 1626 * This can happen if the CoW extent size hint is set, which you really want. 1627 * Third, EFIs cannot currently be automatically relogged into newer 1628 * transactions to advance the log tail. Fourth, stuffing the log full of 1629 * EFIs places an upper bound on the number of CoW allocations that can be 1630 * held filesystem-wide at any given time. Recording them in the refcount 1631 * btree doesn't require us to maintain any state in memory and doesn't pin 1632 * the log. 1633 */ 1634 /* 1635 * Adjust the refcounts of CoW allocations. These allocations are "magic" 1636 * in that they're not referenced anywhere else in the filesystem, so we 1637 * stash them in the refcount btree with a refcount of 1 until either file 1638 * remapping (or CoW cancellation) happens. 1639 */ 1640 STATIC int 1641 xfs_refcount_adjust_cow_extents( 1642 struct xfs_btree_cur *cur, 1643 xfs_agblock_t agbno, 1644 xfs_extlen_t aglen, 1645 enum xfs_refc_adjust_op adj) 1646 { 1647 struct xfs_refcount_irec ext, tmp; 1648 int error; 1649 int found_rec, found_tmp; 1650 1651 if (aglen == 0) 1652 return 0; 1653 1654 /* Find any overlapping refcount records */ 1655 error = xfs_refcount_lookup_ge(cur, XFS_REFC_DOMAIN_COW, agbno, 1656 &found_rec); 1657 if (error) 1658 goto out_error; 1659 error = xfs_refcount_get_rec(cur, &ext, &found_rec); 1660 if (error) 1661 goto out_error; 1662 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec && 1663 ext.rc_domain != XFS_REFC_DOMAIN_COW)) { 1664 error = -EFSCORRUPTED; 1665 goto out_error; 1666 } 1667 if (!found_rec) { 1668 ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; 1669 ext.rc_blockcount = 0; 1670 ext.rc_refcount = 0; 1671 ext.rc_domain = XFS_REFC_DOMAIN_COW; 1672 } 1673 1674 switch (adj) { 1675 case XFS_REFCOUNT_ADJUST_COW_ALLOC: 1676 /* Adding a CoW reservation, there should be nothing here. */ 1677 if (XFS_IS_CORRUPT(cur->bc_mp, 1678 agbno + aglen > ext.rc_startblock)) { 1679 error = -EFSCORRUPTED; 1680 goto out_error; 1681 } 1682 1683 tmp.rc_startblock = agbno; 1684 tmp.rc_blockcount = aglen; 1685 tmp.rc_refcount = 1; 1686 tmp.rc_domain = XFS_REFC_DOMAIN_COW; 1687 1688 trace_xfs_refcount_modify_extent(cur->bc_mp, 1689 cur->bc_ag.pag->pag_agno, &tmp); 1690 1691 error = xfs_refcount_insert(cur, &tmp, 1692 &found_tmp); 1693 if (error) 1694 goto out_error; 1695 if (XFS_IS_CORRUPT(cur->bc_mp, found_tmp != 1)) { 1696 error = -EFSCORRUPTED; 1697 goto out_error; 1698 } 1699 break; 1700 case XFS_REFCOUNT_ADJUST_COW_FREE: 1701 /* Removing a CoW reservation, there should be one extent. */ 1702 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_startblock != agbno)) { 1703 error = -EFSCORRUPTED; 1704 goto out_error; 1705 } 1706 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount != aglen)) { 1707 error = -EFSCORRUPTED; 1708 goto out_error; 1709 } 1710 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_refcount != 1)) { 1711 error = -EFSCORRUPTED; 1712 goto out_error; 1713 } 1714 1715 ext.rc_refcount = 0; 1716 trace_xfs_refcount_modify_extent(cur->bc_mp, 1717 cur->bc_ag.pag->pag_agno, &ext); 1718 error = xfs_refcount_delete(cur, &found_rec); 1719 if (error) 1720 goto out_error; 1721 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { 1722 error = -EFSCORRUPTED; 1723 goto out_error; 1724 } 1725 break; 1726 default: 1727 ASSERT(0); 1728 } 1729 1730 return error; 1731 out_error: 1732 trace_xfs_refcount_modify_extent_error(cur->bc_mp, 1733 cur->bc_ag.pag->pag_agno, error, _RET_IP_); 1734 return error; 1735 } 1736 1737 /* 1738 * Add or remove refcount btree entries for CoW reservations. 1739 */ 1740 STATIC int 1741 xfs_refcount_adjust_cow( 1742 struct xfs_btree_cur *cur, 1743 xfs_agblock_t agbno, 1744 xfs_extlen_t aglen, 1745 enum xfs_refc_adjust_op adj) 1746 { 1747 bool shape_changed; 1748 int error; 1749 1750 /* 1751 * Ensure that no rcextents cross the boundary of the adjustment range. 1752 */ 1753 error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_COW, 1754 agbno, &shape_changed); 1755 if (error) 1756 goto out_error; 1757 1758 error = xfs_refcount_split_extent(cur, XFS_REFC_DOMAIN_COW, 1759 agbno + aglen, &shape_changed); 1760 if (error) 1761 goto out_error; 1762 1763 /* 1764 * Try to merge with the left or right extents of the range. 1765 */ 1766 error = xfs_refcount_merge_extents(cur, XFS_REFC_DOMAIN_COW, &agbno, 1767 &aglen, adj, &shape_changed); 1768 if (error) 1769 goto out_error; 1770 1771 /* Now that we've taken care of the ends, adjust the middle extents */ 1772 error = xfs_refcount_adjust_cow_extents(cur, agbno, aglen, adj); 1773 if (error) 1774 goto out_error; 1775 1776 return 0; 1777 1778 out_error: 1779 trace_xfs_refcount_adjust_cow_error(cur->bc_mp, cur->bc_ag.pag->pag_agno, 1780 error, _RET_IP_); 1781 return error; 1782 } 1783 1784 /* 1785 * Record a CoW allocation in the refcount btree. 1786 */ 1787 STATIC int 1788 __xfs_refcount_cow_alloc( 1789 struct xfs_btree_cur *rcur, 1790 xfs_agblock_t agbno, 1791 xfs_extlen_t aglen) 1792 { 1793 trace_xfs_refcount_cow_increase(rcur->bc_mp, rcur->bc_ag.pag->pag_agno, 1794 agbno, aglen); 1795 1796 /* Add refcount btree reservation */ 1797 return xfs_refcount_adjust_cow(rcur, agbno, aglen, 1798 XFS_REFCOUNT_ADJUST_COW_ALLOC); 1799 } 1800 1801 /* 1802 * Remove a CoW allocation from the refcount btree. 1803 */ 1804 STATIC int 1805 __xfs_refcount_cow_free( 1806 struct xfs_btree_cur *rcur, 1807 xfs_agblock_t agbno, 1808 xfs_extlen_t aglen) 1809 { 1810 trace_xfs_refcount_cow_decrease(rcur->bc_mp, rcur->bc_ag.pag->pag_agno, 1811 agbno, aglen); 1812 1813 /* Remove refcount btree reservation */ 1814 return xfs_refcount_adjust_cow(rcur, agbno, aglen, 1815 XFS_REFCOUNT_ADJUST_COW_FREE); 1816 } 1817 1818 /* Record a CoW staging extent in the refcount btree. */ 1819 void 1820 xfs_refcount_alloc_cow_extent( 1821 struct xfs_trans *tp, 1822 xfs_fsblock_t fsb, 1823 xfs_extlen_t len) 1824 { 1825 struct xfs_mount *mp = tp->t_mountp; 1826 1827 if (!xfs_has_reflink(mp)) 1828 return; 1829 1830 __xfs_refcount_add(tp, XFS_REFCOUNT_ALLOC_COW, fsb, len); 1831 1832 /* Add rmap entry */ 1833 xfs_rmap_alloc_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), 1834 XFS_FSB_TO_AGBNO(mp, fsb), len, XFS_RMAP_OWN_COW); 1835 } 1836 1837 /* Forget a CoW staging event in the refcount btree. */ 1838 void 1839 xfs_refcount_free_cow_extent( 1840 struct xfs_trans *tp, 1841 xfs_fsblock_t fsb, 1842 xfs_extlen_t len) 1843 { 1844 struct xfs_mount *mp = tp->t_mountp; 1845 1846 if (!xfs_has_reflink(mp)) 1847 return; 1848 1849 /* Remove rmap entry */ 1850 xfs_rmap_free_extent(tp, XFS_FSB_TO_AGNO(mp, fsb), 1851 XFS_FSB_TO_AGBNO(mp, fsb), len, XFS_RMAP_OWN_COW); 1852 __xfs_refcount_add(tp, XFS_REFCOUNT_FREE_COW, fsb, len); 1853 } 1854 1855 struct xfs_refcount_recovery { 1856 struct list_head rr_list; 1857 struct xfs_refcount_irec rr_rrec; 1858 }; 1859 1860 /* Stuff an extent on the recovery list. */ 1861 STATIC int 1862 xfs_refcount_recover_extent( 1863 struct xfs_btree_cur *cur, 1864 const union xfs_btree_rec *rec, 1865 void *priv) 1866 { 1867 struct list_head *debris = priv; 1868 struct xfs_refcount_recovery *rr; 1869 1870 if (XFS_IS_CORRUPT(cur->bc_mp, 1871 be32_to_cpu(rec->refc.rc_refcount) != 1)) 1872 return -EFSCORRUPTED; 1873 1874 rr = kmalloc(sizeof(struct xfs_refcount_recovery), 1875 GFP_KERNEL | __GFP_NOFAIL); 1876 INIT_LIST_HEAD(&rr->rr_list); 1877 xfs_refcount_btrec_to_irec(rec, &rr->rr_rrec); 1878 1879 if (XFS_IS_CORRUPT(cur->bc_mp, 1880 rr->rr_rrec.rc_domain != XFS_REFC_DOMAIN_COW)) { 1881 kfree(rr); 1882 return -EFSCORRUPTED; 1883 } 1884 1885 list_add_tail(&rr->rr_list, debris); 1886 return 0; 1887 } 1888 1889 /* Find and remove leftover CoW reservations. */ 1890 int 1891 xfs_refcount_recover_cow_leftovers( 1892 struct xfs_mount *mp, 1893 struct xfs_perag *pag) 1894 { 1895 struct xfs_trans *tp; 1896 struct xfs_btree_cur *cur; 1897 struct xfs_buf *agbp; 1898 struct xfs_refcount_recovery *rr, *n; 1899 struct list_head debris; 1900 union xfs_btree_irec low; 1901 union xfs_btree_irec high; 1902 xfs_fsblock_t fsb; 1903 int error; 1904 1905 /* reflink filesystems mustn't have AGs larger than 2^31-1 blocks */ 1906 BUILD_BUG_ON(XFS_MAX_CRC_AG_BLOCKS >= XFS_REFC_COWFLAG); 1907 if (mp->m_sb.sb_agblocks > XFS_MAX_CRC_AG_BLOCKS) 1908 return -EOPNOTSUPP; 1909 1910 INIT_LIST_HEAD(&debris); 1911 1912 /* 1913 * In this first part, we use an empty transaction to gather up 1914 * all the leftover CoW extents so that we can subsequently 1915 * delete them. The empty transaction is used to avoid 1916 * a buffer lock deadlock if there happens to be a loop in the 1917 * refcountbt because we're allowed to re-grab a buffer that is 1918 * already attached to our transaction. When we're done 1919 * recording the CoW debris we cancel the (empty) transaction 1920 * and everything goes away cleanly. 1921 */ 1922 error = xfs_trans_alloc_empty(mp, &tp); 1923 if (error) 1924 return error; 1925 1926 error = xfs_alloc_read_agf(pag, tp, 0, &agbp); 1927 if (error) 1928 goto out_trans; 1929 cur = xfs_refcountbt_init_cursor(mp, tp, agbp, pag); 1930 1931 /* Find all the leftover CoW staging extents. */ 1932 memset(&low, 0, sizeof(low)); 1933 memset(&high, 0, sizeof(high)); 1934 low.rc.rc_domain = high.rc.rc_domain = XFS_REFC_DOMAIN_COW; 1935 high.rc.rc_startblock = -1U; 1936 error = xfs_btree_query_range(cur, &low, &high, 1937 xfs_refcount_recover_extent, &debris); 1938 xfs_btree_del_cursor(cur, error); 1939 xfs_trans_brelse(tp, agbp); 1940 xfs_trans_cancel(tp); 1941 if (error) 1942 goto out_free; 1943 1944 /* Now iterate the list to free the leftovers */ 1945 list_for_each_entry_safe(rr, n, &debris, rr_list) { 1946 /* Set up transaction. */ 1947 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, 0, &tp); 1948 if (error) 1949 goto out_free; 1950 1951 trace_xfs_refcount_recover_extent(mp, pag->pag_agno, 1952 &rr->rr_rrec); 1953 1954 /* Free the orphan record */ 1955 fsb = XFS_AGB_TO_FSB(mp, pag->pag_agno, 1956 rr->rr_rrec.rc_startblock); 1957 xfs_refcount_free_cow_extent(tp, fsb, 1958 rr->rr_rrec.rc_blockcount); 1959 1960 /* Free the block. */ 1961 xfs_free_extent_later(tp, fsb, rr->rr_rrec.rc_blockcount, NULL); 1962 1963 error = xfs_trans_commit(tp); 1964 if (error) 1965 goto out_free; 1966 1967 list_del(&rr->rr_list); 1968 kfree(rr); 1969 } 1970 1971 return error; 1972 out_trans: 1973 xfs_trans_cancel(tp); 1974 out_free: 1975 /* Free the leftover list */ 1976 list_for_each_entry_safe(rr, n, &debris, rr_list) { 1977 list_del(&rr->rr_list); 1978 kfree(rr); 1979 } 1980 return error; 1981 } 1982 1983 /* Is there a record covering a given extent? */ 1984 int 1985 xfs_refcount_has_record( 1986 struct xfs_btree_cur *cur, 1987 enum xfs_refc_domain domain, 1988 xfs_agblock_t bno, 1989 xfs_extlen_t len, 1990 bool *exists) 1991 { 1992 union xfs_btree_irec low; 1993 union xfs_btree_irec high; 1994 1995 memset(&low, 0, sizeof(low)); 1996 low.rc.rc_startblock = bno; 1997 memset(&high, 0xFF, sizeof(high)); 1998 high.rc.rc_startblock = bno + len - 1; 1999 low.rc.rc_domain = high.rc.rc_domain = domain; 2000 2001 return xfs_btree_has_record(cur, &low, &high, exists); 2002 } 2003 2004 int __init 2005 xfs_refcount_intent_init_cache(void) 2006 { 2007 xfs_refcount_intent_cache = kmem_cache_create("xfs_refc_intent", 2008 sizeof(struct xfs_refcount_intent), 2009 0, 0, NULL); 2010 2011 return xfs_refcount_intent_cache != NULL ? 0 : -ENOMEM; 2012 } 2013 2014 void 2015 xfs_refcount_intent_destroy_cache(void) 2016 { 2017 kmem_cache_destroy(xfs_refcount_intent_cache); 2018 xfs_refcount_intent_cache = NULL; 2019 } 2020