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_bit.h" 13 #include "xfs_mount.h" 14 #include "xfs_inode.h" 15 #include "xfs_bmap.h" 16 #include "xfs_trans.h" 17 #include "xfs_rtalloc.h" 18 #include "xfs_error.h" 19 #include "xfs_rtbitmap.h" 20 #include "xfs_health.h" 21 22 /* 23 * Realtime allocator bitmap functions shared with userspace. 24 */ 25 26 /* 27 * Real time buffers need verifiers to avoid runtime warnings during IO. 28 * We don't have anything to verify, however, so these are just dummy 29 * operations. 30 */ 31 static void 32 xfs_rtbuf_verify_read( 33 struct xfs_buf *bp) 34 { 35 return; 36 } 37 38 static void 39 xfs_rtbuf_verify_write( 40 struct xfs_buf *bp) 41 { 42 return; 43 } 44 45 const struct xfs_buf_ops xfs_rtbuf_ops = { 46 .name = "rtbuf", 47 .verify_read = xfs_rtbuf_verify_read, 48 .verify_write = xfs_rtbuf_verify_write, 49 }; 50 51 /* Release cached rt bitmap and summary buffers. */ 52 void 53 xfs_rtbuf_cache_relse( 54 struct xfs_rtalloc_args *args) 55 { 56 if (args->rbmbp) { 57 xfs_trans_brelse(args->tp, args->rbmbp); 58 args->rbmbp = NULL; 59 args->rbmoff = NULLFILEOFF; 60 } 61 if (args->sumbp) { 62 xfs_trans_brelse(args->tp, args->sumbp); 63 args->sumbp = NULL; 64 args->sumoff = NULLFILEOFF; 65 } 66 } 67 68 /* 69 * Get a buffer for the bitmap or summary file block specified. 70 * The buffer is returned read and locked. 71 */ 72 int 73 xfs_rtbuf_get( 74 struct xfs_rtalloc_args *args, 75 xfs_fileoff_t block, /* block number in bitmap or summary */ 76 int issum) /* is summary not bitmap */ 77 { 78 struct xfs_mount *mp = args->mp; 79 struct xfs_buf **cbpp; /* cached block buffer */ 80 xfs_fileoff_t *coffp; /* cached block number */ 81 struct xfs_buf *bp; /* block buffer, result */ 82 struct xfs_inode *ip; /* bitmap or summary inode */ 83 struct xfs_bmbt_irec map; 84 enum xfs_blft type; 85 int nmap = 1; 86 int error; 87 88 if (issum) { 89 cbpp = &args->sumbp; 90 coffp = &args->sumoff; 91 ip = mp->m_rsumip; 92 type = XFS_BLFT_RTSUMMARY_BUF; 93 } else { 94 cbpp = &args->rbmbp; 95 coffp = &args->rbmoff; 96 ip = mp->m_rbmip; 97 type = XFS_BLFT_RTBITMAP_BUF; 98 } 99 100 /* 101 * If we have a cached buffer, and the block number matches, use that. 102 */ 103 if (*cbpp && *coffp == block) 104 return 0; 105 106 /* 107 * Otherwise we have to have to get the buffer. If there was an old 108 * one, get rid of it first. 109 */ 110 if (*cbpp) { 111 xfs_trans_brelse(args->tp, *cbpp); 112 *cbpp = NULL; 113 } 114 115 error = xfs_bmapi_read(ip, block, 1, &map, &nmap, 0); 116 if (error) 117 return error; 118 119 if (XFS_IS_CORRUPT(mp, nmap == 0 || !xfs_bmap_is_written_extent(&map))) { 120 xfs_rt_mark_sick(mp, issum ? XFS_SICK_RT_SUMMARY : 121 XFS_SICK_RT_BITMAP); 122 return -EFSCORRUPTED; 123 } 124 125 ASSERT(map.br_startblock != NULLFSBLOCK); 126 error = xfs_trans_read_buf(mp, args->tp, mp->m_ddev_targp, 127 XFS_FSB_TO_DADDR(mp, map.br_startblock), 128 mp->m_bsize, 0, &bp, &xfs_rtbuf_ops); 129 if (xfs_metadata_is_sick(error)) 130 xfs_rt_mark_sick(mp, issum ? XFS_SICK_RT_SUMMARY : 131 XFS_SICK_RT_BITMAP); 132 if (error) 133 return error; 134 135 xfs_trans_buf_set_type(args->tp, bp, type); 136 *cbpp = bp; 137 *coffp = block; 138 return 0; 139 } 140 141 /* 142 * Searching backward from start to limit, find the first block whose 143 * allocated/free state is different from start's. 144 */ 145 int 146 xfs_rtfind_back( 147 struct xfs_rtalloc_args *args, 148 xfs_rtxnum_t start, /* starting rtext to look at */ 149 xfs_rtxnum_t limit, /* last rtext to look at */ 150 xfs_rtxnum_t *rtx) /* out: start rtext found */ 151 { 152 struct xfs_mount *mp = args->mp; 153 int bit; /* bit number in the word */ 154 xfs_fileoff_t block; /* bitmap block number */ 155 int error; /* error value */ 156 xfs_rtxnum_t firstbit; /* first useful bit in the word */ 157 xfs_rtxnum_t i; /* current bit number rel. to start */ 158 xfs_rtxnum_t len; /* length of inspected area */ 159 xfs_rtword_t mask; /* mask of relevant bits for value */ 160 xfs_rtword_t want; /* mask for "good" values */ 161 xfs_rtword_t wdiff; /* difference from wanted value */ 162 xfs_rtword_t incore; 163 unsigned int word; /* word number in the buffer */ 164 165 /* 166 * Compute and read in starting bitmap block for starting block. 167 */ 168 block = xfs_rtx_to_rbmblock(mp, start); 169 error = xfs_rtbitmap_read_buf(args, block); 170 if (error) 171 return error; 172 173 /* 174 * Get the first word's index & point to it. 175 */ 176 word = xfs_rtx_to_rbmword(mp, start); 177 bit = (int)(start & (XFS_NBWORD - 1)); 178 len = start - limit + 1; 179 /* 180 * Compute match value, based on the bit at start: if 1 (free) 181 * then all-ones, else all-zeroes. 182 */ 183 incore = xfs_rtbitmap_getword(args, word); 184 want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; 185 /* 186 * If the starting position is not word-aligned, deal with the 187 * partial word. 188 */ 189 if (bit < XFS_NBWORD - 1) { 190 /* 191 * Calculate first (leftmost) bit number to look at, 192 * and mask for all the relevant bits in this word. 193 */ 194 firstbit = max_t(xfs_srtblock_t, bit - len + 1, 0); 195 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << 196 firstbit; 197 /* 198 * Calculate the difference between the value there 199 * and what we're looking for. 200 */ 201 if ((wdiff = (incore ^ want) & mask)) { 202 /* 203 * Different. Mark where we are and return. 204 */ 205 i = bit - xfs_highbit32(wdiff); 206 *rtx = start - i + 1; 207 return 0; 208 } 209 i = bit - firstbit + 1; 210 /* 211 * Go on to previous block if that's where the previous word is 212 * and we need the previous word. 213 */ 214 if (--word == -1 && i < len) { 215 /* 216 * If done with this block, get the previous one. 217 */ 218 error = xfs_rtbitmap_read_buf(args, --block); 219 if (error) 220 return error; 221 222 word = mp->m_blockwsize - 1; 223 } 224 } else { 225 /* 226 * Starting on a word boundary, no partial word. 227 */ 228 i = 0; 229 } 230 /* 231 * Loop over whole words in buffers. When we use up one buffer 232 * we move on to the previous one. 233 */ 234 while (len - i >= XFS_NBWORD) { 235 /* 236 * Compute difference between actual and desired value. 237 */ 238 incore = xfs_rtbitmap_getword(args, word); 239 if ((wdiff = incore ^ want)) { 240 /* 241 * Different, mark where we are and return. 242 */ 243 i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); 244 *rtx = start - i + 1; 245 return 0; 246 } 247 i += XFS_NBWORD; 248 /* 249 * Go on to previous block if that's where the previous word is 250 * and we need the previous word. 251 */ 252 if (--word == -1 && i < len) { 253 /* 254 * If done with this block, get the previous one. 255 */ 256 error = xfs_rtbitmap_read_buf(args, --block); 257 if (error) 258 return error; 259 260 word = mp->m_blockwsize - 1; 261 } 262 } 263 /* 264 * If not ending on a word boundary, deal with the last 265 * (partial) word. 266 */ 267 if (len - i) { 268 /* 269 * Calculate first (leftmost) bit number to look at, 270 * and mask for all the relevant bits in this word. 271 */ 272 firstbit = XFS_NBWORD - (len - i); 273 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; 274 /* 275 * Compute difference between actual and desired value. 276 */ 277 incore = xfs_rtbitmap_getword(args, word); 278 if ((wdiff = (incore ^ want) & mask)) { 279 /* 280 * Different, mark where we are and return. 281 */ 282 i += XFS_NBWORD - 1 - xfs_highbit32(wdiff); 283 *rtx = start - i + 1; 284 return 0; 285 } else 286 i = len; 287 } 288 /* 289 * No match, return that we scanned the whole area. 290 */ 291 *rtx = start - i + 1; 292 return 0; 293 } 294 295 /* 296 * Searching forward from start to limit, find the first block whose 297 * allocated/free state is different from start's. 298 */ 299 int 300 xfs_rtfind_forw( 301 struct xfs_rtalloc_args *args, 302 xfs_rtxnum_t start, /* starting rtext to look at */ 303 xfs_rtxnum_t limit, /* last rtext to look at */ 304 xfs_rtxnum_t *rtx) /* out: start rtext found */ 305 { 306 struct xfs_mount *mp = args->mp; 307 int bit; /* bit number in the word */ 308 xfs_fileoff_t block; /* bitmap block number */ 309 int error; 310 xfs_rtxnum_t i; /* current bit number rel. to start */ 311 xfs_rtxnum_t lastbit;/* last useful bit in the word */ 312 xfs_rtxnum_t len; /* length of inspected area */ 313 xfs_rtword_t mask; /* mask of relevant bits for value */ 314 xfs_rtword_t want; /* mask for "good" values */ 315 xfs_rtword_t wdiff; /* difference from wanted value */ 316 xfs_rtword_t incore; 317 unsigned int word; /* word number in the buffer */ 318 319 /* 320 * Compute and read in starting bitmap block for starting block. 321 */ 322 block = xfs_rtx_to_rbmblock(mp, start); 323 error = xfs_rtbitmap_read_buf(args, block); 324 if (error) 325 return error; 326 327 /* 328 * Get the first word's index & point to it. 329 */ 330 word = xfs_rtx_to_rbmword(mp, start); 331 bit = (int)(start & (XFS_NBWORD - 1)); 332 len = limit - start + 1; 333 /* 334 * Compute match value, based on the bit at start: if 1 (free) 335 * then all-ones, else all-zeroes. 336 */ 337 incore = xfs_rtbitmap_getword(args, word); 338 want = (incore & ((xfs_rtword_t)1 << bit)) ? -1 : 0; 339 /* 340 * If the starting position is not word-aligned, deal with the 341 * partial word. 342 */ 343 if (bit) { 344 /* 345 * Calculate last (rightmost) bit number to look at, 346 * and mask for all the relevant bits in this word. 347 */ 348 lastbit = min(bit + len, XFS_NBWORD); 349 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 350 /* 351 * Calculate the difference between the value there 352 * and what we're looking for. 353 */ 354 if ((wdiff = (incore ^ want) & mask)) { 355 /* 356 * Different. Mark where we are and return. 357 */ 358 i = xfs_lowbit32(wdiff) - bit; 359 *rtx = start + i - 1; 360 return 0; 361 } 362 i = lastbit - bit; 363 /* 364 * Go on to next block if that's where the next word is 365 * and we need the next word. 366 */ 367 if (++word == mp->m_blockwsize && i < len) { 368 /* 369 * If done with this block, get the previous one. 370 */ 371 error = xfs_rtbitmap_read_buf(args, ++block); 372 if (error) 373 return error; 374 375 word = 0; 376 } 377 } else { 378 /* 379 * Starting on a word boundary, no partial word. 380 */ 381 i = 0; 382 } 383 /* 384 * Loop over whole words in buffers. When we use up one buffer 385 * we move on to the next one. 386 */ 387 while (len - i >= XFS_NBWORD) { 388 /* 389 * Compute difference between actual and desired value. 390 */ 391 incore = xfs_rtbitmap_getword(args, word); 392 if ((wdiff = incore ^ want)) { 393 /* 394 * Different, mark where we are and return. 395 */ 396 i += xfs_lowbit32(wdiff); 397 *rtx = start + i - 1; 398 return 0; 399 } 400 i += XFS_NBWORD; 401 /* 402 * Go on to next block if that's where the next word is 403 * and we need the next word. 404 */ 405 if (++word == mp->m_blockwsize && i < len) { 406 /* 407 * If done with this block, get the next one. 408 */ 409 error = xfs_rtbitmap_read_buf(args, ++block); 410 if (error) 411 return error; 412 413 word = 0; 414 } 415 } 416 /* 417 * If not ending on a word boundary, deal with the last 418 * (partial) word. 419 */ 420 if ((lastbit = len - i)) { 421 /* 422 * Calculate mask for all the relevant bits in this word. 423 */ 424 mask = ((xfs_rtword_t)1 << lastbit) - 1; 425 /* 426 * Compute difference between actual and desired value. 427 */ 428 incore = xfs_rtbitmap_getword(args, word); 429 if ((wdiff = (incore ^ want) & mask)) { 430 /* 431 * Different, mark where we are and return. 432 */ 433 i += xfs_lowbit32(wdiff); 434 *rtx = start + i - 1; 435 return 0; 436 } else 437 i = len; 438 } 439 /* 440 * No match, return that we scanned the whole area. 441 */ 442 *rtx = start + i - 1; 443 return 0; 444 } 445 446 /* Log rtsummary counter at @infoword. */ 447 static inline void 448 xfs_trans_log_rtsummary( 449 struct xfs_rtalloc_args *args, 450 unsigned int infoword) 451 { 452 struct xfs_buf *bp = args->sumbp; 453 size_t first, last; 454 455 first = (void *)xfs_rsumblock_infoptr(args, infoword) - bp->b_addr; 456 last = first + sizeof(xfs_suminfo_t) - 1; 457 458 xfs_trans_log_buf(args->tp, bp, first, last); 459 } 460 461 /* 462 * Modify the summary information for a given extent size, bitmap block 463 * combination. 464 */ 465 int 466 xfs_rtmodify_summary( 467 struct xfs_rtalloc_args *args, 468 int log, /* log2 of extent size */ 469 xfs_fileoff_t bbno, /* bitmap block number */ 470 int delta) /* in/out: summary block number */ 471 { 472 struct xfs_mount *mp = args->mp; 473 xfs_rtsumoff_t so = xfs_rtsumoffs(mp, log, bbno); 474 unsigned int infoword; 475 xfs_suminfo_t val; 476 int error; 477 478 error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so)); 479 if (error) 480 return error; 481 482 infoword = xfs_rtsumoffs_to_infoword(mp, so); 483 val = xfs_suminfo_add(args, infoword, delta); 484 485 if (mp->m_rsum_cache) { 486 if (val == 0 && log + 1 == mp->m_rsum_cache[bbno]) 487 mp->m_rsum_cache[bbno] = log; 488 if (val != 0 && log >= mp->m_rsum_cache[bbno]) 489 mp->m_rsum_cache[bbno] = log + 1; 490 } 491 492 xfs_trans_log_rtsummary(args, infoword); 493 return 0; 494 } 495 496 /* 497 * Read and return the summary information for a given extent size, bitmap block 498 * combination. 499 */ 500 int 501 xfs_rtget_summary( 502 struct xfs_rtalloc_args *args, 503 int log, /* log2 of extent size */ 504 xfs_fileoff_t bbno, /* bitmap block number */ 505 xfs_suminfo_t *sum) /* out: summary info for this block */ 506 { 507 struct xfs_mount *mp = args->mp; 508 xfs_rtsumoff_t so = xfs_rtsumoffs(mp, log, bbno); 509 int error; 510 511 error = xfs_rtsummary_read_buf(args, xfs_rtsumoffs_to_block(mp, so)); 512 if (!error) 513 *sum = xfs_suminfo_get(args, xfs_rtsumoffs_to_infoword(mp, so)); 514 return error; 515 } 516 517 /* Log rtbitmap block from the word @from to the byte before @next. */ 518 static inline void 519 xfs_trans_log_rtbitmap( 520 struct xfs_rtalloc_args *args, 521 unsigned int from, 522 unsigned int next) 523 { 524 struct xfs_buf *bp = args->rbmbp; 525 size_t first, last; 526 527 first = (void *)xfs_rbmblock_wordptr(args, from) - bp->b_addr; 528 last = ((void *)xfs_rbmblock_wordptr(args, next) - 1) - bp->b_addr; 529 530 xfs_trans_log_buf(args->tp, bp, first, last); 531 } 532 533 /* 534 * Set the given range of bitmap bits to the given value. 535 * Do whatever I/O and logging is required. 536 */ 537 int 538 xfs_rtmodify_range( 539 struct xfs_rtalloc_args *args, 540 xfs_rtxnum_t start, /* starting rtext to modify */ 541 xfs_rtxlen_t len, /* length of extent to modify */ 542 int val) /* 1 for free, 0 for allocated */ 543 { 544 struct xfs_mount *mp = args->mp; 545 int bit; /* bit number in the word */ 546 xfs_fileoff_t block; /* bitmap block number */ 547 int error; 548 int i; /* current bit number rel. to start */ 549 int lastbit; /* last useful bit in word */ 550 xfs_rtword_t mask; /* mask of relevant bits for value */ 551 xfs_rtword_t incore; 552 unsigned int firstword; /* first word used in the buffer */ 553 unsigned int word; /* word number in the buffer */ 554 555 /* 556 * Compute starting bitmap block number. 557 */ 558 block = xfs_rtx_to_rbmblock(mp, start); 559 /* 560 * Read the bitmap block, and point to its data. 561 */ 562 error = xfs_rtbitmap_read_buf(args, block); 563 if (error) 564 return error; 565 566 /* 567 * Compute the starting word's address, and starting bit. 568 */ 569 firstword = word = xfs_rtx_to_rbmword(mp, start); 570 bit = (int)(start & (XFS_NBWORD - 1)); 571 /* 572 * 0 (allocated) => all zeroes; 1 (free) => all ones. 573 */ 574 val = -val; 575 /* 576 * If not starting on a word boundary, deal with the first 577 * (partial) word. 578 */ 579 if (bit) { 580 /* 581 * Compute first bit not changed and mask of relevant bits. 582 */ 583 lastbit = min(bit + len, XFS_NBWORD); 584 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 585 /* 586 * Set/clear the active bits. 587 */ 588 incore = xfs_rtbitmap_getword(args, word); 589 if (val) 590 incore |= mask; 591 else 592 incore &= ~mask; 593 xfs_rtbitmap_setword(args, word, incore); 594 i = lastbit - bit; 595 /* 596 * Go on to the next block if that's where the next word is 597 * and we need the next word. 598 */ 599 if (++word == mp->m_blockwsize && i < len) { 600 /* 601 * Log the changed part of this block. 602 * Get the next one. 603 */ 604 xfs_trans_log_rtbitmap(args, firstword, word); 605 error = xfs_rtbitmap_read_buf(args, ++block); 606 if (error) 607 return error; 608 609 firstword = word = 0; 610 } 611 } else { 612 /* 613 * Starting on a word boundary, no partial word. 614 */ 615 i = 0; 616 } 617 /* 618 * Loop over whole words in buffers. When we use up one buffer 619 * we move on to the next one. 620 */ 621 while (len - i >= XFS_NBWORD) { 622 /* 623 * Set the word value correctly. 624 */ 625 xfs_rtbitmap_setword(args, word, val); 626 i += XFS_NBWORD; 627 /* 628 * Go on to the next block if that's where the next word is 629 * and we need the next word. 630 */ 631 if (++word == mp->m_blockwsize && i < len) { 632 /* 633 * Log the changed part of this block. 634 * Get the next one. 635 */ 636 xfs_trans_log_rtbitmap(args, firstword, word); 637 error = xfs_rtbitmap_read_buf(args, ++block); 638 if (error) 639 return error; 640 641 firstword = word = 0; 642 } 643 } 644 /* 645 * If not ending on a word boundary, deal with the last 646 * (partial) word. 647 */ 648 if ((lastbit = len - i)) { 649 /* 650 * Compute a mask of relevant bits. 651 */ 652 mask = ((xfs_rtword_t)1 << lastbit) - 1; 653 /* 654 * Set/clear the active bits. 655 */ 656 incore = xfs_rtbitmap_getword(args, word); 657 if (val) 658 incore |= mask; 659 else 660 incore &= ~mask; 661 xfs_rtbitmap_setword(args, word, incore); 662 word++; 663 } 664 /* 665 * Log any remaining changed bytes. 666 */ 667 if (word > firstword) 668 xfs_trans_log_rtbitmap(args, firstword, word); 669 return 0; 670 } 671 672 /* 673 * Mark an extent specified by start and len freed. 674 * Updates all the summary information as well as the bitmap. 675 */ 676 int 677 xfs_rtfree_range( 678 struct xfs_rtalloc_args *args, 679 xfs_rtxnum_t start, /* starting rtext to free */ 680 xfs_rtxlen_t len) /* in/out: summary block number */ 681 { 682 struct xfs_mount *mp = args->mp; 683 xfs_rtxnum_t end; /* end of the freed extent */ 684 int error; /* error value */ 685 xfs_rtxnum_t postblock; /* first rtext freed > end */ 686 xfs_rtxnum_t preblock; /* first rtext freed < start */ 687 688 end = start + len - 1; 689 /* 690 * Modify the bitmap to mark this extent freed. 691 */ 692 error = xfs_rtmodify_range(args, start, len, 1); 693 if (error) { 694 return error; 695 } 696 /* 697 * Assume we're freeing out of the middle of an allocated extent. 698 * We need to find the beginning and end of the extent so we can 699 * properly update the summary. 700 */ 701 error = xfs_rtfind_back(args, start, 0, &preblock); 702 if (error) { 703 return error; 704 } 705 /* 706 * Find the next allocated block (end of allocated extent). 707 */ 708 error = xfs_rtfind_forw(args, end, mp->m_sb.sb_rextents - 1, 709 &postblock); 710 if (error) 711 return error; 712 /* 713 * If there are blocks not being freed at the front of the 714 * old extent, add summary data for them to be allocated. 715 */ 716 if (preblock < start) { 717 error = xfs_rtmodify_summary(args, 718 xfs_highbit64(start - preblock), 719 xfs_rtx_to_rbmblock(mp, preblock), -1); 720 if (error) { 721 return error; 722 } 723 } 724 /* 725 * If there are blocks not being freed at the end of the 726 * old extent, add summary data for them to be allocated. 727 */ 728 if (postblock > end) { 729 error = xfs_rtmodify_summary(args, 730 xfs_highbit64(postblock - end), 731 xfs_rtx_to_rbmblock(mp, end + 1), -1); 732 if (error) { 733 return error; 734 } 735 } 736 /* 737 * Increment the summary information corresponding to the entire 738 * (new) free extent. 739 */ 740 return xfs_rtmodify_summary(args, 741 xfs_highbit64(postblock + 1 - preblock), 742 xfs_rtx_to_rbmblock(mp, preblock), 1); 743 } 744 745 /* 746 * Check that the given range is either all allocated (val = 0) or 747 * all free (val = 1). 748 */ 749 int 750 xfs_rtcheck_range( 751 struct xfs_rtalloc_args *args, 752 xfs_rtxnum_t start, /* starting rtext number of extent */ 753 xfs_rtxlen_t len, /* length of extent */ 754 int val, /* 1 for free, 0 for allocated */ 755 xfs_rtxnum_t *new, /* out: first rtext not matching */ 756 int *stat) /* out: 1 for matches, 0 for not */ 757 { 758 struct xfs_mount *mp = args->mp; 759 int bit; /* bit number in the word */ 760 xfs_fileoff_t block; /* bitmap block number */ 761 int error; 762 xfs_rtxnum_t i; /* current bit number rel. to start */ 763 xfs_rtxnum_t lastbit; /* last useful bit in word */ 764 xfs_rtword_t mask; /* mask of relevant bits for value */ 765 xfs_rtword_t wdiff; /* difference from wanted value */ 766 xfs_rtword_t incore; 767 unsigned int word; /* word number in the buffer */ 768 769 /* 770 * Compute starting bitmap block number 771 */ 772 block = xfs_rtx_to_rbmblock(mp, start); 773 /* 774 * Read the bitmap block. 775 */ 776 error = xfs_rtbitmap_read_buf(args, block); 777 if (error) 778 return error; 779 780 /* 781 * Compute the starting word's address, and starting bit. 782 */ 783 word = xfs_rtx_to_rbmword(mp, start); 784 bit = (int)(start & (XFS_NBWORD - 1)); 785 /* 786 * 0 (allocated) => all zero's; 1 (free) => all one's. 787 */ 788 val = -val; 789 /* 790 * If not starting on a word boundary, deal with the first 791 * (partial) word. 792 */ 793 if (bit) { 794 /* 795 * Compute first bit not examined. 796 */ 797 lastbit = min(bit + len, XFS_NBWORD); 798 /* 799 * Mask of relevant bits. 800 */ 801 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 802 /* 803 * Compute difference between actual and desired value. 804 */ 805 incore = xfs_rtbitmap_getword(args, word); 806 if ((wdiff = (incore ^ val) & mask)) { 807 /* 808 * Different, compute first wrong bit and return. 809 */ 810 i = xfs_lowbit32(wdiff) - bit; 811 *new = start + i; 812 *stat = 0; 813 return 0; 814 } 815 i = lastbit - bit; 816 /* 817 * Go on to next block if that's where the next word is 818 * and we need the next word. 819 */ 820 if (++word == mp->m_blockwsize && i < len) { 821 /* 822 * If done with this block, get the next one. 823 */ 824 error = xfs_rtbitmap_read_buf(args, ++block); 825 if (error) 826 return error; 827 828 word = 0; 829 } 830 } else { 831 /* 832 * Starting on a word boundary, no partial word. 833 */ 834 i = 0; 835 } 836 /* 837 * Loop over whole words in buffers. When we use up one buffer 838 * we move on to the next one. 839 */ 840 while (len - i >= XFS_NBWORD) { 841 /* 842 * Compute difference between actual and desired value. 843 */ 844 incore = xfs_rtbitmap_getword(args, word); 845 if ((wdiff = incore ^ val)) { 846 /* 847 * Different, compute first wrong bit and return. 848 */ 849 i += xfs_lowbit32(wdiff); 850 *new = start + i; 851 *stat = 0; 852 return 0; 853 } 854 i += XFS_NBWORD; 855 /* 856 * Go on to next block if that's where the next word is 857 * and we need the next word. 858 */ 859 if (++word == mp->m_blockwsize && i < len) { 860 /* 861 * If done with this block, get the next one. 862 */ 863 error = xfs_rtbitmap_read_buf(args, ++block); 864 if (error) 865 return error; 866 867 word = 0; 868 } 869 } 870 /* 871 * If not ending on a word boundary, deal with the last 872 * (partial) word. 873 */ 874 if ((lastbit = len - i)) { 875 /* 876 * Mask of relevant bits. 877 */ 878 mask = ((xfs_rtword_t)1 << lastbit) - 1; 879 /* 880 * Compute difference between actual and desired value. 881 */ 882 incore = xfs_rtbitmap_getword(args, word); 883 if ((wdiff = (incore ^ val) & mask)) { 884 /* 885 * Different, compute first wrong bit and return. 886 */ 887 i += xfs_lowbit32(wdiff); 888 *new = start + i; 889 *stat = 0; 890 return 0; 891 } else 892 i = len; 893 } 894 /* 895 * Successful, return. 896 */ 897 *new = start + i; 898 *stat = 1; 899 return 0; 900 } 901 902 #ifdef DEBUG 903 /* 904 * Check that the given extent (block range) is allocated already. 905 */ 906 STATIC int 907 xfs_rtcheck_alloc_range( 908 struct xfs_rtalloc_args *args, 909 xfs_rtxnum_t start, /* starting rtext number of extent */ 910 xfs_rtxlen_t len) /* length of extent */ 911 { 912 xfs_rtxnum_t new; /* dummy for xfs_rtcheck_range */ 913 int stat; 914 int error; 915 916 error = xfs_rtcheck_range(args, start, len, 0, &new, &stat); 917 if (error) 918 return error; 919 ASSERT(stat); 920 return 0; 921 } 922 #else 923 #define xfs_rtcheck_alloc_range(a,b,l) (0) 924 #endif 925 /* 926 * Free an extent in the realtime subvolume. Length is expressed in 927 * realtime extents, as is the block number. 928 */ 929 int 930 xfs_rtfree_extent( 931 struct xfs_trans *tp, /* transaction pointer */ 932 xfs_rtxnum_t start, /* starting rtext number to free */ 933 xfs_rtxlen_t len) /* length of extent freed */ 934 { 935 struct xfs_mount *mp = tp->t_mountp; 936 struct xfs_rtalloc_args args = { 937 .mp = mp, 938 .tp = tp, 939 }; 940 int error; 941 struct timespec64 atime; 942 943 ASSERT(mp->m_rbmip->i_itemp != NULL); 944 xfs_assert_ilocked(mp->m_rbmip, XFS_ILOCK_EXCL); 945 946 error = xfs_rtcheck_alloc_range(&args, start, len); 947 if (error) 948 return error; 949 950 /* 951 * Free the range of realtime blocks. 952 */ 953 error = xfs_rtfree_range(&args, start, len); 954 if (error) 955 goto out; 956 957 /* 958 * Mark more blocks free in the superblock. 959 */ 960 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); 961 /* 962 * If we've now freed all the blocks, reset the file sequence 963 * number to 0. 964 */ 965 if (tp->t_frextents_delta + mp->m_sb.sb_frextents == 966 mp->m_sb.sb_rextents) { 967 if (!(mp->m_rbmip->i_diflags & XFS_DIFLAG_NEWRTBM)) 968 mp->m_rbmip->i_diflags |= XFS_DIFLAG_NEWRTBM; 969 970 atime = inode_get_atime(VFS_I(mp->m_rbmip)); 971 atime.tv_sec = 0; 972 inode_set_atime_to_ts(VFS_I(mp->m_rbmip), atime); 973 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 974 } 975 error = 0; 976 out: 977 xfs_rtbuf_cache_relse(&args); 978 return error; 979 } 980 981 /* 982 * Free some blocks in the realtime subvolume. rtbno and rtlen are in units of 983 * rt blocks, not rt extents; must be aligned to the rt extent size; and rtlen 984 * cannot exceed XFS_MAX_BMBT_EXTLEN. 985 */ 986 int 987 xfs_rtfree_blocks( 988 struct xfs_trans *tp, 989 xfs_fsblock_t rtbno, 990 xfs_filblks_t rtlen) 991 { 992 struct xfs_mount *mp = tp->t_mountp; 993 xfs_rtxnum_t start; 994 xfs_filblks_t len; 995 xfs_extlen_t mod; 996 997 ASSERT(rtlen <= XFS_MAX_BMBT_EXTLEN); 998 999 len = xfs_rtb_to_rtxrem(mp, rtlen, &mod); 1000 if (mod) { 1001 ASSERT(mod == 0); 1002 return -EIO; 1003 } 1004 1005 start = xfs_rtb_to_rtxrem(mp, rtbno, &mod); 1006 if (mod) { 1007 ASSERT(mod == 0); 1008 return -EIO; 1009 } 1010 1011 return xfs_rtfree_extent(tp, start, len); 1012 } 1013 1014 /* Find all the free records within a given range. */ 1015 int 1016 xfs_rtalloc_query_range( 1017 struct xfs_mount *mp, 1018 struct xfs_trans *tp, 1019 const struct xfs_rtalloc_rec *low_rec, 1020 const struct xfs_rtalloc_rec *high_rec, 1021 xfs_rtalloc_query_range_fn fn, 1022 void *priv) 1023 { 1024 struct xfs_rtalloc_args args = { 1025 .mp = mp, 1026 .tp = tp, 1027 }; 1028 struct xfs_rtalloc_rec rec; 1029 xfs_rtxnum_t rtstart; 1030 xfs_rtxnum_t rtend; 1031 xfs_rtxnum_t high_key; 1032 int is_free; 1033 int error = 0; 1034 1035 if (low_rec->ar_startext > high_rec->ar_startext) 1036 return -EINVAL; 1037 if (low_rec->ar_startext >= mp->m_sb.sb_rextents || 1038 low_rec->ar_startext == high_rec->ar_startext) 1039 return 0; 1040 1041 high_key = min(high_rec->ar_startext, mp->m_sb.sb_rextents - 1); 1042 1043 /* Iterate the bitmap, looking for discrepancies. */ 1044 rtstart = low_rec->ar_startext; 1045 while (rtstart <= high_key) { 1046 /* Is the first block free? */ 1047 error = xfs_rtcheck_range(&args, rtstart, 1, 1, &rtend, 1048 &is_free); 1049 if (error) 1050 break; 1051 1052 /* How long does the extent go for? */ 1053 error = xfs_rtfind_forw(&args, rtstart, high_key, &rtend); 1054 if (error) 1055 break; 1056 1057 if (is_free) { 1058 rec.ar_startext = rtstart; 1059 rec.ar_extcount = rtend - rtstart + 1; 1060 1061 error = fn(mp, tp, &rec, priv); 1062 if (error) 1063 break; 1064 } 1065 1066 rtstart = rtend + 1; 1067 } 1068 1069 xfs_rtbuf_cache_relse(&args); 1070 return error; 1071 } 1072 1073 /* Find all the free records. */ 1074 int 1075 xfs_rtalloc_query_all( 1076 struct xfs_mount *mp, 1077 struct xfs_trans *tp, 1078 xfs_rtalloc_query_range_fn fn, 1079 void *priv) 1080 { 1081 struct xfs_rtalloc_rec keys[2]; 1082 1083 keys[0].ar_startext = 0; 1084 keys[1].ar_startext = mp->m_sb.sb_rextents - 1; 1085 keys[0].ar_extcount = keys[1].ar_extcount = 0; 1086 1087 return xfs_rtalloc_query_range(mp, tp, &keys[0], &keys[1], fn, priv); 1088 } 1089 1090 /* Is the given extent all free? */ 1091 int 1092 xfs_rtalloc_extent_is_free( 1093 struct xfs_mount *mp, 1094 struct xfs_trans *tp, 1095 xfs_rtxnum_t start, 1096 xfs_rtxlen_t len, 1097 bool *is_free) 1098 { 1099 struct xfs_rtalloc_args args = { 1100 .mp = mp, 1101 .tp = tp, 1102 }; 1103 xfs_rtxnum_t end; 1104 int matches; 1105 int error; 1106 1107 error = xfs_rtcheck_range(&args, start, len, 1, &end, &matches); 1108 xfs_rtbuf_cache_relse(&args); 1109 if (error) 1110 return error; 1111 1112 *is_free = matches; 1113 return 0; 1114 } 1115 1116 /* 1117 * Compute the number of rtbitmap blocks needed to track the given number of rt 1118 * extents. 1119 */ 1120 xfs_filblks_t 1121 xfs_rtbitmap_blockcount( 1122 struct xfs_mount *mp, 1123 xfs_rtbxlen_t rtextents) 1124 { 1125 return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize); 1126 } 1127 1128 /* 1129 * Compute the number of rtbitmap words needed to populate every block of a 1130 * bitmap that is large enough to track the given number of rt extents. 1131 */ 1132 unsigned long long 1133 xfs_rtbitmap_wordcount( 1134 struct xfs_mount *mp, 1135 xfs_rtbxlen_t rtextents) 1136 { 1137 xfs_filblks_t blocks; 1138 1139 blocks = xfs_rtbitmap_blockcount(mp, rtextents); 1140 return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG; 1141 } 1142 1143 /* Compute the number of rtsummary blocks needed to track the given rt space. */ 1144 xfs_filblks_t 1145 xfs_rtsummary_blockcount( 1146 struct xfs_mount *mp, 1147 unsigned int rsumlevels, 1148 xfs_extlen_t rbmblocks) 1149 { 1150 unsigned long long rsumwords; 1151 1152 rsumwords = (unsigned long long)rsumlevels * rbmblocks; 1153 return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG); 1154 } 1155 1156 /* 1157 * Compute the number of rtsummary info words needed to populate every block of 1158 * a summary file that is large enough to track the given rt space. 1159 */ 1160 unsigned long long 1161 xfs_rtsummary_wordcount( 1162 struct xfs_mount *mp, 1163 unsigned int rsumlevels, 1164 xfs_extlen_t rbmblocks) 1165 { 1166 xfs_filblks_t blocks; 1167 1168 blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks); 1169 return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG; 1170 } 1171