1 /* 2 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #include "xfs.h" 19 #include "xfs_fs.h" 20 #include "xfs_shared.h" 21 #include "xfs_format.h" 22 #include "xfs_log_format.h" 23 #include "xfs_trans_resv.h" 24 #include "xfs_bit.h" 25 #include "xfs_mount.h" 26 #include "xfs_inode.h" 27 #include "xfs_bmap.h" 28 #include "xfs_bmap_util.h" 29 #include "xfs_bmap_btree.h" 30 #include "xfs_alloc.h" 31 #include "xfs_error.h" 32 #include "xfs_trans.h" 33 #include "xfs_trans_space.h" 34 #include "xfs_trace.h" 35 #include "xfs_buf.h" 36 #include "xfs_icache.h" 37 #include "xfs_rtalloc.h" 38 39 40 /* 41 * Read and return the summary information for a given extent size, 42 * bitmap block combination. 43 * Keeps track of a current summary block, so we don't keep reading 44 * it from the buffer cache. 45 */ 46 static int 47 xfs_rtget_summary( 48 xfs_mount_t *mp, /* file system mount structure */ 49 xfs_trans_t *tp, /* transaction pointer */ 50 int log, /* log2 of extent size */ 51 xfs_rtblock_t bbno, /* bitmap block number */ 52 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 53 xfs_fsblock_t *rsb, /* in/out: summary block number */ 54 xfs_suminfo_t *sum) /* out: summary info for this block */ 55 { 56 return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum); 57 } 58 59 /* 60 * Return whether there are any free extents in the size range given 61 * by low and high, for the bitmap block bbno. 62 */ 63 STATIC int /* error */ 64 xfs_rtany_summary( 65 xfs_mount_t *mp, /* file system mount structure */ 66 xfs_trans_t *tp, /* transaction pointer */ 67 int low, /* low log2 extent size */ 68 int high, /* high log2 extent size */ 69 xfs_rtblock_t bbno, /* bitmap block number */ 70 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 71 xfs_fsblock_t *rsb, /* in/out: summary block number */ 72 int *stat) /* out: any good extents here? */ 73 { 74 int error; /* error value */ 75 int log; /* loop counter, log2 of ext. size */ 76 xfs_suminfo_t sum; /* summary data */ 77 78 /* 79 * Loop over logs of extent sizes. Order is irrelevant. 80 */ 81 for (log = low; log <= high; log++) { 82 /* 83 * Get one summary datum. 84 */ 85 error = xfs_rtget_summary(mp, tp, log, bbno, rbpp, rsb, &sum); 86 if (error) { 87 return error; 88 } 89 /* 90 * If there are any, return success. 91 */ 92 if (sum) { 93 *stat = 1; 94 return 0; 95 } 96 } 97 /* 98 * Found nothing, return failure. 99 */ 100 *stat = 0; 101 return 0; 102 } 103 104 105 /* 106 * Copy and transform the summary file, given the old and new 107 * parameters in the mount structures. 108 */ 109 STATIC int /* error */ 110 xfs_rtcopy_summary( 111 xfs_mount_t *omp, /* old file system mount point */ 112 xfs_mount_t *nmp, /* new file system mount point */ 113 xfs_trans_t *tp) /* transaction pointer */ 114 { 115 xfs_rtblock_t bbno; /* bitmap block number */ 116 xfs_buf_t *bp; /* summary buffer */ 117 int error; /* error return value */ 118 int log; /* summary level number (log length) */ 119 xfs_suminfo_t sum; /* summary data */ 120 xfs_fsblock_t sumbno; /* summary block number */ 121 122 bp = NULL; 123 for (log = omp->m_rsumlevels - 1; log >= 0; log--) { 124 for (bbno = omp->m_sb.sb_rbmblocks - 1; 125 (xfs_srtblock_t)bbno >= 0; 126 bbno--) { 127 error = xfs_rtget_summary(omp, tp, log, bbno, &bp, 128 &sumbno, &sum); 129 if (error) 130 return error; 131 if (sum == 0) 132 continue; 133 error = xfs_rtmodify_summary(omp, tp, log, bbno, -sum, 134 &bp, &sumbno); 135 if (error) 136 return error; 137 error = xfs_rtmodify_summary(nmp, tp, log, bbno, sum, 138 &bp, &sumbno); 139 if (error) 140 return error; 141 ASSERT(sum > 0); 142 } 143 } 144 return 0; 145 } 146 /* 147 * Mark an extent specified by start and len allocated. 148 * Updates all the summary information as well as the bitmap. 149 */ 150 STATIC int /* error */ 151 xfs_rtallocate_range( 152 xfs_mount_t *mp, /* file system mount point */ 153 xfs_trans_t *tp, /* transaction pointer */ 154 xfs_rtblock_t start, /* start block to allocate */ 155 xfs_extlen_t len, /* length to allocate */ 156 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 157 xfs_fsblock_t *rsb) /* in/out: summary block number */ 158 { 159 xfs_rtblock_t end; /* end of the allocated extent */ 160 int error; /* error value */ 161 xfs_rtblock_t postblock = 0; /* first block allocated > end */ 162 xfs_rtblock_t preblock = 0; /* first block allocated < start */ 163 164 end = start + len - 1; 165 /* 166 * Assume we're allocating out of the middle of a free extent. 167 * We need to find the beginning and end of the extent so we can 168 * properly update the summary. 169 */ 170 error = xfs_rtfind_back(mp, tp, start, 0, &preblock); 171 if (error) { 172 return error; 173 } 174 /* 175 * Find the next allocated block (end of free extent). 176 */ 177 error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, 178 &postblock); 179 if (error) { 180 return error; 181 } 182 /* 183 * Decrement the summary information corresponding to the entire 184 * (old) free extent. 185 */ 186 error = xfs_rtmodify_summary(mp, tp, 187 XFS_RTBLOCKLOG(postblock + 1 - preblock), 188 XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); 189 if (error) { 190 return error; 191 } 192 /* 193 * If there are blocks not being allocated at the front of the 194 * old extent, add summary data for them to be free. 195 */ 196 if (preblock < start) { 197 error = xfs_rtmodify_summary(mp, tp, 198 XFS_RTBLOCKLOG(start - preblock), 199 XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); 200 if (error) { 201 return error; 202 } 203 } 204 /* 205 * If there are blocks not being allocated at the end of the 206 * old extent, add summary data for them to be free. 207 */ 208 if (postblock > end) { 209 error = xfs_rtmodify_summary(mp, tp, 210 XFS_RTBLOCKLOG(postblock - end), 211 XFS_BITTOBLOCK(mp, end + 1), 1, rbpp, rsb); 212 if (error) { 213 return error; 214 } 215 } 216 /* 217 * Modify the bitmap to mark this extent allocated. 218 */ 219 error = xfs_rtmodify_range(mp, tp, start, len, 0); 220 return error; 221 } 222 223 /* 224 * Attempt to allocate an extent minlen<=len<=maxlen starting from 225 * bitmap block bbno. If we don't get maxlen then use prod to trim 226 * the length, if given. Returns error; returns starting block in *rtblock. 227 * The lengths are all in rtextents. 228 */ 229 STATIC int /* error */ 230 xfs_rtallocate_extent_block( 231 xfs_mount_t *mp, /* file system mount point */ 232 xfs_trans_t *tp, /* transaction pointer */ 233 xfs_rtblock_t bbno, /* bitmap block number */ 234 xfs_extlen_t minlen, /* minimum length to allocate */ 235 xfs_extlen_t maxlen, /* maximum length to allocate */ 236 xfs_extlen_t *len, /* out: actual length allocated */ 237 xfs_rtblock_t *nextp, /* out: next block to try */ 238 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 239 xfs_fsblock_t *rsb, /* in/out: summary block number */ 240 xfs_extlen_t prod, /* extent product factor */ 241 xfs_rtblock_t *rtblock) /* out: start block allocated */ 242 { 243 xfs_rtblock_t besti; /* best rtblock found so far */ 244 xfs_rtblock_t bestlen; /* best length found so far */ 245 xfs_rtblock_t end; /* last rtblock in chunk */ 246 int error; /* error value */ 247 xfs_rtblock_t i; /* current rtblock trying */ 248 xfs_rtblock_t next; /* next rtblock to try */ 249 int stat; /* status from internal calls */ 250 251 /* 252 * Loop over all the extents starting in this bitmap block, 253 * looking for one that's long enough. 254 */ 255 for (i = XFS_BLOCKTOBIT(mp, bbno), besti = -1, bestlen = 0, 256 end = XFS_BLOCKTOBIT(mp, bbno + 1) - 1; 257 i <= end; 258 i++) { 259 /* 260 * See if there's a free extent of maxlen starting at i. 261 * If it's not so then next will contain the first non-free. 262 */ 263 error = xfs_rtcheck_range(mp, tp, i, maxlen, 1, &next, &stat); 264 if (error) { 265 return error; 266 } 267 if (stat) { 268 /* 269 * i for maxlen is all free, allocate and return that. 270 */ 271 error = xfs_rtallocate_range(mp, tp, i, maxlen, rbpp, 272 rsb); 273 if (error) { 274 return error; 275 } 276 *len = maxlen; 277 *rtblock = i; 278 return 0; 279 } 280 /* 281 * In the case where we have a variable-sized allocation 282 * request, figure out how big this free piece is, 283 * and if it's big enough for the minimum, and the best 284 * so far, remember it. 285 */ 286 if (minlen < maxlen) { 287 xfs_rtblock_t thislen; /* this extent size */ 288 289 thislen = next - i; 290 if (thislen >= minlen && thislen > bestlen) { 291 besti = i; 292 bestlen = thislen; 293 } 294 } 295 /* 296 * If not done yet, find the start of the next free space. 297 */ 298 if (next < end) { 299 error = xfs_rtfind_forw(mp, tp, next, end, &i); 300 if (error) { 301 return error; 302 } 303 } else 304 break; 305 } 306 /* 307 * Searched the whole thing & didn't find a maxlen free extent. 308 */ 309 if (minlen < maxlen && besti != -1) { 310 xfs_extlen_t p; /* amount to trim length by */ 311 312 /* 313 * If size should be a multiple of prod, make that so. 314 */ 315 if (prod > 1 && (p = do_mod(bestlen, prod))) 316 bestlen -= p; 317 /* 318 * Allocate besti for bestlen & return that. 319 */ 320 error = xfs_rtallocate_range(mp, tp, besti, bestlen, rbpp, rsb); 321 if (error) { 322 return error; 323 } 324 *len = bestlen; 325 *rtblock = besti; 326 return 0; 327 } 328 /* 329 * Allocation failed. Set *nextp to the next block to try. 330 */ 331 *nextp = next; 332 *rtblock = NULLRTBLOCK; 333 return 0; 334 } 335 336 /* 337 * Allocate an extent of length minlen<=len<=maxlen, starting at block 338 * bno. If we don't get maxlen then use prod to trim the length, if given. 339 * Returns error; returns starting block in *rtblock. 340 * The lengths are all in rtextents. 341 */ 342 STATIC int /* error */ 343 xfs_rtallocate_extent_exact( 344 xfs_mount_t *mp, /* file system mount point */ 345 xfs_trans_t *tp, /* transaction pointer */ 346 xfs_rtblock_t bno, /* starting block number to allocate */ 347 xfs_extlen_t minlen, /* minimum length to allocate */ 348 xfs_extlen_t maxlen, /* maximum length to allocate */ 349 xfs_extlen_t *len, /* out: actual length allocated */ 350 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 351 xfs_fsblock_t *rsb, /* in/out: summary block number */ 352 xfs_extlen_t prod, /* extent product factor */ 353 xfs_rtblock_t *rtblock) /* out: start block allocated */ 354 { 355 int error; /* error value */ 356 xfs_extlen_t i; /* extent length trimmed due to prod */ 357 int isfree; /* extent is free */ 358 xfs_rtblock_t next; /* next block to try (dummy) */ 359 360 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 361 /* 362 * Check if the range in question (for maxlen) is free. 363 */ 364 error = xfs_rtcheck_range(mp, tp, bno, maxlen, 1, &next, &isfree); 365 if (error) { 366 return error; 367 } 368 if (isfree) { 369 /* 370 * If it is, allocate it and return success. 371 */ 372 error = xfs_rtallocate_range(mp, tp, bno, maxlen, rbpp, rsb); 373 if (error) { 374 return error; 375 } 376 *len = maxlen; 377 *rtblock = bno; 378 return 0; 379 } 380 /* 381 * If not, allocate what there is, if it's at least minlen. 382 */ 383 maxlen = next - bno; 384 if (maxlen < minlen) { 385 /* 386 * Failed, return failure status. 387 */ 388 *rtblock = NULLRTBLOCK; 389 return 0; 390 } 391 /* 392 * Trim off tail of extent, if prod is specified. 393 */ 394 if (prod > 1 && (i = maxlen % prod)) { 395 maxlen -= i; 396 if (maxlen < minlen) { 397 /* 398 * Now we can't do it, return failure status. 399 */ 400 *rtblock = NULLRTBLOCK; 401 return 0; 402 } 403 } 404 /* 405 * Allocate what we can and return it. 406 */ 407 error = xfs_rtallocate_range(mp, tp, bno, maxlen, rbpp, rsb); 408 if (error) { 409 return error; 410 } 411 *len = maxlen; 412 *rtblock = bno; 413 return 0; 414 } 415 416 /* 417 * Allocate an extent of length minlen<=len<=maxlen, starting as near 418 * to bno as possible. If we don't get maxlen then use prod to trim 419 * the length, if given. The lengths are all in rtextents. 420 */ 421 STATIC int /* error */ 422 xfs_rtallocate_extent_near( 423 xfs_mount_t *mp, /* file system mount point */ 424 xfs_trans_t *tp, /* transaction pointer */ 425 xfs_rtblock_t bno, /* starting block number to allocate */ 426 xfs_extlen_t minlen, /* minimum length to allocate */ 427 xfs_extlen_t maxlen, /* maximum length to allocate */ 428 xfs_extlen_t *len, /* out: actual length allocated */ 429 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 430 xfs_fsblock_t *rsb, /* in/out: summary block number */ 431 xfs_extlen_t prod, /* extent product factor */ 432 xfs_rtblock_t *rtblock) /* out: start block allocated */ 433 { 434 int any; /* any useful extents from summary */ 435 xfs_rtblock_t bbno; /* bitmap block number */ 436 int error; /* error value */ 437 int i; /* bitmap block offset (loop control) */ 438 int j; /* secondary loop control */ 439 int log2len; /* log2 of minlen */ 440 xfs_rtblock_t n; /* next block to try */ 441 xfs_rtblock_t r; /* result block */ 442 443 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 444 /* 445 * If the block number given is off the end, silently set it to 446 * the last block. 447 */ 448 if (bno >= mp->m_sb.sb_rextents) 449 bno = mp->m_sb.sb_rextents - 1; 450 /* 451 * Try the exact allocation first. 452 */ 453 error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen, len, 454 rbpp, rsb, prod, &r); 455 if (error) { 456 return error; 457 } 458 /* 459 * If the exact allocation worked, return that. 460 */ 461 if (r != NULLRTBLOCK) { 462 *rtblock = r; 463 return 0; 464 } 465 bbno = XFS_BITTOBLOCK(mp, bno); 466 i = 0; 467 ASSERT(minlen != 0); 468 log2len = xfs_highbit32(minlen); 469 /* 470 * Loop over all bitmap blocks (bbno + i is current block). 471 */ 472 for (;;) { 473 /* 474 * Get summary information of extents of all useful levels 475 * starting in this bitmap block. 476 */ 477 error = xfs_rtany_summary(mp, tp, log2len, mp->m_rsumlevels - 1, 478 bbno + i, rbpp, rsb, &any); 479 if (error) { 480 return error; 481 } 482 /* 483 * If there are any useful extents starting here, try 484 * allocating one. 485 */ 486 if (any) { 487 /* 488 * On the positive side of the starting location. 489 */ 490 if (i >= 0) { 491 /* 492 * Try to allocate an extent starting in 493 * this block. 494 */ 495 error = xfs_rtallocate_extent_block(mp, tp, 496 bbno + i, minlen, maxlen, len, &n, rbpp, 497 rsb, prod, &r); 498 if (error) { 499 return error; 500 } 501 /* 502 * If it worked, return it. 503 */ 504 if (r != NULLRTBLOCK) { 505 *rtblock = r; 506 return 0; 507 } 508 } 509 /* 510 * On the negative side of the starting location. 511 */ 512 else { /* i < 0 */ 513 /* 514 * Loop backwards through the bitmap blocks from 515 * the starting point-1 up to where we are now. 516 * There should be an extent which ends in this 517 * bitmap block and is long enough. 518 */ 519 for (j = -1; j > i; j--) { 520 /* 521 * Grab the summary information for 522 * this bitmap block. 523 */ 524 error = xfs_rtany_summary(mp, tp, 525 log2len, mp->m_rsumlevels - 1, 526 bbno + j, rbpp, rsb, &any); 527 if (error) { 528 return error; 529 } 530 /* 531 * If there's no extent given in the 532 * summary that means the extent we 533 * found must carry over from an 534 * earlier block. If there is an 535 * extent given, we've already tried 536 * that allocation, don't do it again. 537 */ 538 if (any) 539 continue; 540 error = xfs_rtallocate_extent_block(mp, 541 tp, bbno + j, minlen, maxlen, 542 len, &n, rbpp, rsb, prod, &r); 543 if (error) { 544 return error; 545 } 546 /* 547 * If it works, return the extent. 548 */ 549 if (r != NULLRTBLOCK) { 550 *rtblock = r; 551 return 0; 552 } 553 } 554 /* 555 * There weren't intervening bitmap blocks 556 * with a long enough extent, or the 557 * allocation didn't work for some reason 558 * (i.e. it's a little * too short). 559 * Try to allocate from the summary block 560 * that we found. 561 */ 562 error = xfs_rtallocate_extent_block(mp, tp, 563 bbno + i, minlen, maxlen, len, &n, rbpp, 564 rsb, prod, &r); 565 if (error) { 566 return error; 567 } 568 /* 569 * If it works, return the extent. 570 */ 571 if (r != NULLRTBLOCK) { 572 *rtblock = r; 573 return 0; 574 } 575 } 576 } 577 /* 578 * Loop control. If we were on the positive side, and there's 579 * still more blocks on the negative side, go there. 580 */ 581 if (i > 0 && (int)bbno - i >= 0) 582 i = -i; 583 /* 584 * If positive, and no more negative, but there are more 585 * positive, go there. 586 */ 587 else if (i > 0 && (int)bbno + i < mp->m_sb.sb_rbmblocks - 1) 588 i++; 589 /* 590 * If negative or 0 (just started), and there are positive 591 * blocks to go, go there. The 0 case moves to block 1. 592 */ 593 else if (i <= 0 && (int)bbno - i < mp->m_sb.sb_rbmblocks - 1) 594 i = 1 - i; 595 /* 596 * If negative or 0 and there are more negative blocks, 597 * go there. 598 */ 599 else if (i <= 0 && (int)bbno + i > 0) 600 i--; 601 /* 602 * Must be done. Return failure. 603 */ 604 else 605 break; 606 } 607 *rtblock = NULLRTBLOCK; 608 return 0; 609 } 610 611 /* 612 * Allocate an extent of length minlen<=len<=maxlen, with no position 613 * specified. If we don't get maxlen then use prod to trim 614 * the length, if given. The lengths are all in rtextents. 615 */ 616 STATIC int /* error */ 617 xfs_rtallocate_extent_size( 618 xfs_mount_t *mp, /* file system mount point */ 619 xfs_trans_t *tp, /* transaction pointer */ 620 xfs_extlen_t minlen, /* minimum length to allocate */ 621 xfs_extlen_t maxlen, /* maximum length to allocate */ 622 xfs_extlen_t *len, /* out: actual length allocated */ 623 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 624 xfs_fsblock_t *rsb, /* in/out: summary block number */ 625 xfs_extlen_t prod, /* extent product factor */ 626 xfs_rtblock_t *rtblock) /* out: start block allocated */ 627 { 628 int error; /* error value */ 629 int i; /* bitmap block number */ 630 int l; /* level number (loop control) */ 631 xfs_rtblock_t n; /* next block to be tried */ 632 xfs_rtblock_t r; /* result block number */ 633 xfs_suminfo_t sum; /* summary information for extents */ 634 635 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 636 ASSERT(maxlen != 0); 637 638 /* 639 * Loop over all the levels starting with maxlen. 640 * At each level, look at all the bitmap blocks, to see if there 641 * are extents starting there that are long enough (>= maxlen). 642 * Note, only on the initial level can the allocation fail if 643 * the summary says there's an extent. 644 */ 645 for (l = xfs_highbit32(maxlen); l < mp->m_rsumlevels; l++) { 646 /* 647 * Loop over all the bitmap blocks. 648 */ 649 for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { 650 /* 651 * Get the summary for this level/block. 652 */ 653 error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, 654 &sum); 655 if (error) { 656 return error; 657 } 658 /* 659 * Nothing there, on to the next block. 660 */ 661 if (!sum) 662 continue; 663 /* 664 * Try allocating the extent. 665 */ 666 error = xfs_rtallocate_extent_block(mp, tp, i, maxlen, 667 maxlen, len, &n, rbpp, rsb, prod, &r); 668 if (error) { 669 return error; 670 } 671 /* 672 * If it worked, return that. 673 */ 674 if (r != NULLRTBLOCK) { 675 *rtblock = r; 676 return 0; 677 } 678 /* 679 * If the "next block to try" returned from the 680 * allocator is beyond the next bitmap block, 681 * skip to that bitmap block. 682 */ 683 if (XFS_BITTOBLOCK(mp, n) > i + 1) 684 i = XFS_BITTOBLOCK(mp, n) - 1; 685 } 686 } 687 /* 688 * Didn't find any maxlen blocks. Try smaller ones, unless 689 * we're asking for a fixed size extent. 690 */ 691 if (minlen > --maxlen) { 692 *rtblock = NULLRTBLOCK; 693 return 0; 694 } 695 ASSERT(minlen != 0); 696 ASSERT(maxlen != 0); 697 698 /* 699 * Loop over sizes, from maxlen down to minlen. 700 * This time, when we do the allocations, allow smaller ones 701 * to succeed. 702 */ 703 for (l = xfs_highbit32(maxlen); l >= xfs_highbit32(minlen); l--) { 704 /* 705 * Loop over all the bitmap blocks, try an allocation 706 * starting in that block. 707 */ 708 for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { 709 /* 710 * Get the summary information for this level/block. 711 */ 712 error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, 713 &sum); 714 if (error) { 715 return error; 716 } 717 /* 718 * If nothing there, go on to next. 719 */ 720 if (!sum) 721 continue; 722 /* 723 * Try the allocation. Make sure the specified 724 * minlen/maxlen are in the possible range for 725 * this summary level. 726 */ 727 error = xfs_rtallocate_extent_block(mp, tp, i, 728 XFS_RTMAX(minlen, 1 << l), 729 XFS_RTMIN(maxlen, (1 << (l + 1)) - 1), 730 len, &n, rbpp, rsb, prod, &r); 731 if (error) { 732 return error; 733 } 734 /* 735 * If it worked, return that extent. 736 */ 737 if (r != NULLRTBLOCK) { 738 *rtblock = r; 739 return 0; 740 } 741 /* 742 * If the "next block to try" returned from the 743 * allocator is beyond the next bitmap block, 744 * skip to that bitmap block. 745 */ 746 if (XFS_BITTOBLOCK(mp, n) > i + 1) 747 i = XFS_BITTOBLOCK(mp, n) - 1; 748 } 749 } 750 /* 751 * Got nothing, return failure. 752 */ 753 *rtblock = NULLRTBLOCK; 754 return 0; 755 } 756 757 /* 758 * Allocate space to the bitmap or summary file, and zero it, for growfs. 759 */ 760 STATIC int 761 xfs_growfs_rt_alloc( 762 struct xfs_mount *mp, /* file system mount point */ 763 xfs_extlen_t oblocks, /* old count of blocks */ 764 xfs_extlen_t nblocks, /* new count of blocks */ 765 struct xfs_inode *ip) /* inode (bitmap/summary) */ 766 { 767 xfs_fileoff_t bno; /* block number in file */ 768 struct xfs_buf *bp; /* temporary buffer for zeroing */ 769 xfs_daddr_t d; /* disk block address */ 770 int error; /* error return value */ 771 xfs_fsblock_t firstblock;/* first block allocated in xaction */ 772 struct xfs_bmap_free flist; /* list of freed blocks */ 773 xfs_fsblock_t fsbno; /* filesystem block for bno */ 774 struct xfs_bmbt_irec map; /* block map output */ 775 int nmap; /* number of block maps */ 776 int resblks; /* space reservation */ 777 struct xfs_trans *tp; 778 779 /* 780 * Allocate space to the file, as necessary. 781 */ 782 while (oblocks < nblocks) { 783 resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); 784 /* 785 * Reserve space & log for one extent added to the file. 786 */ 787 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtalloc, resblks, 788 0, 0, &tp); 789 if (error) 790 return error; 791 /* 792 * Lock the inode. 793 */ 794 xfs_ilock(ip, XFS_ILOCK_EXCL); 795 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 796 797 xfs_bmap_init(&flist, &firstblock); 798 /* 799 * Allocate blocks to the bitmap file. 800 */ 801 nmap = 1; 802 error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, 803 XFS_BMAPI_METADATA, &firstblock, 804 resblks, &map, &nmap, &flist); 805 if (!error && nmap < 1) 806 error = -ENOSPC; 807 if (error) 808 goto out_bmap_cancel; 809 /* 810 * Free any blocks freed up in the transaction, then commit. 811 */ 812 error = xfs_bmap_finish(&tp, &flist, NULL); 813 if (error) 814 goto out_bmap_cancel; 815 error = xfs_trans_commit(tp); 816 if (error) 817 return error; 818 /* 819 * Now we need to clear the allocated blocks. 820 * Do this one block per transaction, to keep it simple. 821 */ 822 for (bno = map.br_startoff, fsbno = map.br_startblock; 823 bno < map.br_startoff + map.br_blockcount; 824 bno++, fsbno++) { 825 /* 826 * Reserve log for one block zeroing. 827 */ 828 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtzero, 829 0, 0, 0, &tp); 830 if (error) 831 return error; 832 /* 833 * Lock the bitmap inode. 834 */ 835 xfs_ilock(ip, XFS_ILOCK_EXCL); 836 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 837 /* 838 * Get a buffer for the block. 839 */ 840 d = XFS_FSB_TO_DADDR(mp, fsbno); 841 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, 842 mp->m_bsize, 0); 843 if (bp == NULL) { 844 error = -EIO; 845 goto out_trans_cancel; 846 } 847 memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); 848 xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); 849 /* 850 * Commit the transaction. 851 */ 852 error = xfs_trans_commit(tp); 853 if (error) 854 return error; 855 } 856 /* 857 * Go on to the next extent, if any. 858 */ 859 oblocks = map.br_startoff + map.br_blockcount; 860 } 861 862 return 0; 863 864 out_bmap_cancel: 865 xfs_bmap_cancel(&flist); 866 out_trans_cancel: 867 xfs_trans_cancel(tp); 868 return error; 869 } 870 871 /* 872 * Visible (exported) functions. 873 */ 874 875 /* 876 * Grow the realtime area of the filesystem. 877 */ 878 int 879 xfs_growfs_rt( 880 xfs_mount_t *mp, /* mount point for filesystem */ 881 xfs_growfs_rt_t *in) /* growfs rt input struct */ 882 { 883 xfs_rtblock_t bmbno; /* bitmap block number */ 884 xfs_buf_t *bp; /* temporary buffer */ 885 int error; /* error return value */ 886 xfs_mount_t *nmp; /* new (fake) mount structure */ 887 xfs_rfsblock_t nrblocks; /* new number of realtime blocks */ 888 xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */ 889 xfs_rtblock_t nrextents; /* new number of realtime extents */ 890 uint8_t nrextslog; /* new log2 of sb_rextents */ 891 xfs_extlen_t nrsumblocks; /* new number of summary blocks */ 892 uint nrsumlevels; /* new rt summary levels */ 893 uint nrsumsize; /* new size of rt summary, bytes */ 894 xfs_sb_t *nsbp; /* new superblock */ 895 xfs_extlen_t rbmblocks; /* current number of rt bitmap blocks */ 896 xfs_extlen_t rsumblocks; /* current number of rt summary blks */ 897 xfs_sb_t *sbp; /* old superblock */ 898 xfs_fsblock_t sumbno; /* summary block number */ 899 900 sbp = &mp->m_sb; 901 /* 902 * Initial error checking. 903 */ 904 if (!capable(CAP_SYS_ADMIN)) 905 return -EPERM; 906 if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL || 907 (nrblocks = in->newblocks) <= sbp->sb_rblocks || 908 (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize))) 909 return -EINVAL; 910 if ((error = xfs_sb_validate_fsb_count(sbp, nrblocks))) 911 return error; 912 /* 913 * Read in the last block of the device, make sure it exists. 914 */ 915 error = xfs_buf_read_uncached(mp->m_rtdev_targp, 916 XFS_FSB_TO_BB(mp, nrblocks - 1), 917 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL); 918 if (error) 919 return error; 920 xfs_buf_relse(bp); 921 922 /* 923 * Calculate new parameters. These are the final values to be reached. 924 */ 925 nrextents = nrblocks; 926 do_div(nrextents, in->extsize); 927 nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize); 928 nrextslog = xfs_highbit32(nrextents); 929 nrsumlevels = nrextslog + 1; 930 nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks; 931 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 932 nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 933 /* 934 * New summary size can't be more than half the size of 935 * the log. This prevents us from getting a log overflow, 936 * since we'll log basically the whole summary file at once. 937 */ 938 if (nrsumblocks > (mp->m_sb.sb_logblocks >> 1)) 939 return -EINVAL; 940 /* 941 * Get the old block counts for bitmap and summary inodes. 942 * These can't change since other growfs callers are locked out. 943 */ 944 rbmblocks = XFS_B_TO_FSB(mp, mp->m_rbmip->i_d.di_size); 945 rsumblocks = XFS_B_TO_FSB(mp, mp->m_rsumip->i_d.di_size); 946 /* 947 * Allocate space to the bitmap and summary files, as necessary. 948 */ 949 error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip); 950 if (error) 951 return error; 952 error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip); 953 if (error) 954 return error; 955 /* 956 * Allocate a new (fake) mount/sb. 957 */ 958 nmp = kmem_alloc(sizeof(*nmp), KM_SLEEP); 959 /* 960 * Loop over the bitmap blocks. 961 * We will do everything one bitmap block at a time. 962 * Skip the current block if it is exactly full. 963 * This also deals with the case where there were no rtextents before. 964 */ 965 for (bmbno = sbp->sb_rbmblocks - 966 ((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0); 967 bmbno < nrbmblocks; 968 bmbno++) { 969 xfs_trans_t *tp; 970 971 *nmp = *mp; 972 nsbp = &nmp->m_sb; 973 /* 974 * Calculate new sb and mount fields for this round. 975 */ 976 nsbp->sb_rextsize = in->extsize; 977 nsbp->sb_rbmblocks = bmbno + 1; 978 nsbp->sb_rblocks = 979 XFS_RTMIN(nrblocks, 980 nsbp->sb_rbmblocks * NBBY * 981 nsbp->sb_blocksize * nsbp->sb_rextsize); 982 nsbp->sb_rextents = nsbp->sb_rblocks; 983 do_div(nsbp->sb_rextents, nsbp->sb_rextsize); 984 ASSERT(nsbp->sb_rextents != 0); 985 nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); 986 nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; 987 nrsumsize = 988 (uint)sizeof(xfs_suminfo_t) * nrsumlevels * 989 nsbp->sb_rbmblocks; 990 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 991 nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 992 /* 993 * Start a transaction, get the log reservation. 994 */ 995 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtfree, 0, 0, 0, 996 &tp); 997 if (error) 998 break; 999 /* 1000 * Lock out other callers by grabbing the bitmap inode lock. 1001 */ 1002 xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); 1003 xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); 1004 /* 1005 * Update the bitmap inode's size. 1006 */ 1007 mp->m_rbmip->i_d.di_size = 1008 nsbp->sb_rbmblocks * nsbp->sb_blocksize; 1009 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 1010 /* 1011 * Get the summary inode into the transaction. 1012 */ 1013 xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL); 1014 xfs_trans_ijoin(tp, mp->m_rsumip, XFS_ILOCK_EXCL); 1015 /* 1016 * Update the summary inode's size. 1017 */ 1018 mp->m_rsumip->i_d.di_size = nmp->m_rsumsize; 1019 xfs_trans_log_inode(tp, mp->m_rsumip, XFS_ILOG_CORE); 1020 /* 1021 * Copy summary data from old to new sizes. 1022 * Do this when the real size (not block-aligned) changes. 1023 */ 1024 if (sbp->sb_rbmblocks != nsbp->sb_rbmblocks || 1025 mp->m_rsumlevels != nmp->m_rsumlevels) { 1026 error = xfs_rtcopy_summary(mp, nmp, tp); 1027 if (error) 1028 goto error_cancel; 1029 } 1030 /* 1031 * Update superblock fields. 1032 */ 1033 if (nsbp->sb_rextsize != sbp->sb_rextsize) 1034 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSIZE, 1035 nsbp->sb_rextsize - sbp->sb_rextsize); 1036 if (nsbp->sb_rbmblocks != sbp->sb_rbmblocks) 1037 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBMBLOCKS, 1038 nsbp->sb_rbmblocks - sbp->sb_rbmblocks); 1039 if (nsbp->sb_rblocks != sbp->sb_rblocks) 1040 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBLOCKS, 1041 nsbp->sb_rblocks - sbp->sb_rblocks); 1042 if (nsbp->sb_rextents != sbp->sb_rextents) 1043 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTENTS, 1044 nsbp->sb_rextents - sbp->sb_rextents); 1045 if (nsbp->sb_rextslog != sbp->sb_rextslog) 1046 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSLOG, 1047 nsbp->sb_rextslog - sbp->sb_rextslog); 1048 /* 1049 * Free new extent. 1050 */ 1051 bp = NULL; 1052 error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents, 1053 nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno); 1054 if (error) { 1055 error_cancel: 1056 xfs_trans_cancel(tp); 1057 break; 1058 } 1059 /* 1060 * Mark more blocks free in the superblock. 1061 */ 1062 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, 1063 nsbp->sb_rextents - sbp->sb_rextents); 1064 /* 1065 * Update mp values into the real mp structure. 1066 */ 1067 mp->m_rsumlevels = nrsumlevels; 1068 mp->m_rsumsize = nrsumsize; 1069 1070 error = xfs_trans_commit(tp); 1071 if (error) 1072 break; 1073 } 1074 1075 /* 1076 * Free the fake mp structure. 1077 */ 1078 kmem_free(nmp); 1079 1080 return error; 1081 } 1082 1083 /* 1084 * Allocate an extent in the realtime subvolume, with the usual allocation 1085 * parameters. The length units are all in realtime extents, as is the 1086 * result block number. 1087 */ 1088 int /* error */ 1089 xfs_rtallocate_extent( 1090 xfs_trans_t *tp, /* transaction pointer */ 1091 xfs_rtblock_t bno, /* starting block number to allocate */ 1092 xfs_extlen_t minlen, /* minimum length to allocate */ 1093 xfs_extlen_t maxlen, /* maximum length to allocate */ 1094 xfs_extlen_t *len, /* out: actual length allocated */ 1095 xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */ 1096 int wasdel, /* was a delayed allocation extent */ 1097 xfs_extlen_t prod, /* extent product factor */ 1098 xfs_rtblock_t *rtblock) /* out: start block allocated */ 1099 { 1100 xfs_mount_t *mp = tp->t_mountp; 1101 int error; /* error value */ 1102 xfs_rtblock_t r; /* result allocated block */ 1103 xfs_fsblock_t sb; /* summary file block number */ 1104 xfs_buf_t *sumbp; /* summary file block buffer */ 1105 1106 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 1107 ASSERT(minlen > 0 && minlen <= maxlen); 1108 1109 /* 1110 * If prod is set then figure out what to do to minlen and maxlen. 1111 */ 1112 if (prod > 1) { 1113 xfs_extlen_t i; 1114 1115 if ((i = maxlen % prod)) 1116 maxlen -= i; 1117 if ((i = minlen % prod)) 1118 minlen += prod - i; 1119 if (maxlen < minlen) { 1120 *rtblock = NULLRTBLOCK; 1121 return 0; 1122 } 1123 } 1124 1125 sumbp = NULL; 1126 /* 1127 * Allocate by size, or near another block, or exactly at some block. 1128 */ 1129 switch (type) { 1130 case XFS_ALLOCTYPE_ANY_AG: 1131 error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len, 1132 &sumbp, &sb, prod, &r); 1133 break; 1134 case XFS_ALLOCTYPE_NEAR_BNO: 1135 error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen, 1136 len, &sumbp, &sb, prod, &r); 1137 break; 1138 case XFS_ALLOCTYPE_THIS_BNO: 1139 error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen, 1140 len, &sumbp, &sb, prod, &r); 1141 break; 1142 default: 1143 error = -EIO; 1144 ASSERT(0); 1145 } 1146 if (error) 1147 return error; 1148 1149 /* 1150 * If it worked, update the superblock. 1151 */ 1152 if (r != NULLRTBLOCK) { 1153 long slen = (long)*len; 1154 1155 ASSERT(*len >= minlen && *len <= maxlen); 1156 if (wasdel) 1157 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen); 1158 else 1159 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen); 1160 } 1161 *rtblock = r; 1162 return 0; 1163 } 1164 1165 /* 1166 * Initialize realtime fields in the mount structure. 1167 */ 1168 int /* error */ 1169 xfs_rtmount_init( 1170 struct xfs_mount *mp) /* file system mount structure */ 1171 { 1172 struct xfs_buf *bp; /* buffer for last block of subvolume */ 1173 struct xfs_sb *sbp; /* filesystem superblock copy in mount */ 1174 xfs_daddr_t d; /* address of last block of subvolume */ 1175 int error; 1176 1177 sbp = &mp->m_sb; 1178 if (sbp->sb_rblocks == 0) 1179 return 0; 1180 if (mp->m_rtdev_targp == NULL) { 1181 xfs_warn(mp, 1182 "Filesystem has a realtime volume, use rtdev=device option"); 1183 return -ENODEV; 1184 } 1185 mp->m_rsumlevels = sbp->sb_rextslog + 1; 1186 mp->m_rsumsize = 1187 (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels * 1188 sbp->sb_rbmblocks; 1189 mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize); 1190 mp->m_rbmip = mp->m_rsumip = NULL; 1191 /* 1192 * Check that the realtime section is an ok size. 1193 */ 1194 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); 1195 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_rblocks) { 1196 xfs_warn(mp, "realtime mount -- %llu != %llu", 1197 (unsigned long long) XFS_BB_TO_FSB(mp, d), 1198 (unsigned long long) mp->m_sb.sb_rblocks); 1199 return -EFBIG; 1200 } 1201 error = xfs_buf_read_uncached(mp->m_rtdev_targp, 1202 d - XFS_FSB_TO_BB(mp, 1), 1203 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL); 1204 if (error) { 1205 xfs_warn(mp, "realtime device size check failed"); 1206 return error; 1207 } 1208 xfs_buf_relse(bp); 1209 return 0; 1210 } 1211 1212 /* 1213 * Get the bitmap and summary inodes into the mount structure 1214 * at mount time. 1215 */ 1216 int /* error */ 1217 xfs_rtmount_inodes( 1218 xfs_mount_t *mp) /* file system mount structure */ 1219 { 1220 int error; /* error return value */ 1221 xfs_sb_t *sbp; 1222 1223 sbp = &mp->m_sb; 1224 if (sbp->sb_rbmino == NULLFSINO) 1225 return 0; 1226 error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); 1227 if (error) 1228 return error; 1229 ASSERT(mp->m_rbmip != NULL); 1230 ASSERT(sbp->sb_rsumino != NULLFSINO); 1231 error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); 1232 if (error) { 1233 IRELE(mp->m_rbmip); 1234 return error; 1235 } 1236 ASSERT(mp->m_rsumip != NULL); 1237 return 0; 1238 } 1239 1240 void 1241 xfs_rtunmount_inodes( 1242 struct xfs_mount *mp) 1243 { 1244 if (mp->m_rbmip) 1245 IRELE(mp->m_rbmip); 1246 if (mp->m_rsumip) 1247 IRELE(mp->m_rsumip); 1248 } 1249 1250 /* 1251 * Pick an extent for allocation at the start of a new realtime file. 1252 * Use the sequence number stored in the atime field of the bitmap inode. 1253 * Translate this to a fraction of the rtextents, and return the product 1254 * of rtextents and the fraction. 1255 * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ... 1256 */ 1257 int /* error */ 1258 xfs_rtpick_extent( 1259 xfs_mount_t *mp, /* file system mount point */ 1260 xfs_trans_t *tp, /* transaction pointer */ 1261 xfs_extlen_t len, /* allocation length (rtextents) */ 1262 xfs_rtblock_t *pick) /* result rt extent */ 1263 { 1264 xfs_rtblock_t b; /* result block */ 1265 int log2; /* log of sequence number */ 1266 __uint64_t resid; /* residual after log removed */ 1267 __uint64_t seq; /* sequence number of file creation */ 1268 __uint64_t *seqp; /* pointer to seqno in inode */ 1269 1270 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 1271 1272 seqp = (__uint64_t *)&VFS_I(mp->m_rbmip)->i_atime; 1273 if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { 1274 mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; 1275 *seqp = 0; 1276 } 1277 seq = *seqp; 1278 if ((log2 = xfs_highbit64(seq)) == -1) 1279 b = 0; 1280 else { 1281 resid = seq - (1ULL << log2); 1282 b = (mp->m_sb.sb_rextents * ((resid << 1) + 1ULL)) >> 1283 (log2 + 1); 1284 if (b >= mp->m_sb.sb_rextents) 1285 b = do_mod(b, mp->m_sb.sb_rextents); 1286 if (b + len > mp->m_sb.sb_rextents) 1287 b = mp->m_sb.sb_rextents - len; 1288 } 1289 *seqp = seq + 1; 1290 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 1291 *pick = b; 1292 return 0; 1293 } 1294