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 int committed; /* transaction committed flag */ 770 xfs_daddr_t d; /* disk block address */ 771 int error; /* error return value */ 772 xfs_fsblock_t firstblock;/* first block allocated in xaction */ 773 struct xfs_bmap_free flist; /* list of freed blocks */ 774 xfs_fsblock_t fsbno; /* filesystem block for bno */ 775 struct xfs_bmbt_irec map; /* block map output */ 776 int nmap; /* number of block maps */ 777 int resblks; /* space reservation */ 778 struct xfs_trans *tp; 779 780 /* 781 * Allocate space to the file, as necessary. 782 */ 783 while (oblocks < nblocks) { 784 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); 785 resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); 786 /* 787 * Reserve space & log for one extent added to the file. 788 */ 789 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtalloc, 790 resblks, 0); 791 if (error) 792 goto out_trans_cancel; 793 /* 794 * Lock the inode. 795 */ 796 xfs_ilock(ip, XFS_ILOCK_EXCL); 797 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 798 799 xfs_bmap_init(&flist, &firstblock); 800 /* 801 * Allocate blocks to the bitmap file. 802 */ 803 nmap = 1; 804 error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, 805 XFS_BMAPI_METADATA, &firstblock, 806 resblks, &map, &nmap, &flist); 807 if (!error && nmap < 1) 808 error = -ENOSPC; 809 if (error) 810 goto out_bmap_cancel; 811 /* 812 * Free any blocks freed up in the transaction, then commit. 813 */ 814 error = xfs_bmap_finish(&tp, &flist, &committed); 815 if (error) 816 goto out_bmap_cancel; 817 error = xfs_trans_commit(tp); 818 if (error) 819 return error; 820 /* 821 * Now we need to clear the allocated blocks. 822 * Do this one block per transaction, to keep it simple. 823 */ 824 for (bno = map.br_startoff, fsbno = map.br_startblock; 825 bno < map.br_startoff + map.br_blockcount; 826 bno++, fsbno++) { 827 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ZERO); 828 /* 829 * Reserve log for one block zeroing. 830 */ 831 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtzero, 832 0, 0); 833 if (error) 834 goto out_trans_cancel; 835 /* 836 * Lock the bitmap inode. 837 */ 838 xfs_ilock(ip, XFS_ILOCK_EXCL); 839 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 840 /* 841 * Get a buffer for the block. 842 */ 843 d = XFS_FSB_TO_DADDR(mp, fsbno); 844 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, 845 mp->m_bsize, 0); 846 if (bp == NULL) { 847 error = -EIO; 848 goto out_trans_cancel; 849 } 850 memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); 851 xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); 852 /* 853 * Commit the transaction. 854 */ 855 error = xfs_trans_commit(tp); 856 if (error) 857 return error; 858 } 859 /* 860 * Go on to the next extent, if any. 861 */ 862 oblocks = map.br_startoff + map.br_blockcount; 863 } 864 865 return 0; 866 867 out_bmap_cancel: 868 xfs_bmap_cancel(&flist); 869 out_trans_cancel: 870 xfs_trans_cancel(tp); 871 return error; 872 } 873 874 /* 875 * Visible (exported) functions. 876 */ 877 878 /* 879 * Grow the realtime area of the filesystem. 880 */ 881 int 882 xfs_growfs_rt( 883 xfs_mount_t *mp, /* mount point for filesystem */ 884 xfs_growfs_rt_t *in) /* growfs rt input struct */ 885 { 886 xfs_rtblock_t bmbno; /* bitmap block number */ 887 xfs_buf_t *bp; /* temporary buffer */ 888 int error; /* error return value */ 889 xfs_mount_t *nmp; /* new (fake) mount structure */ 890 xfs_rfsblock_t nrblocks; /* new number of realtime blocks */ 891 xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */ 892 xfs_rtblock_t nrextents; /* new number of realtime extents */ 893 uint8_t nrextslog; /* new log2 of sb_rextents */ 894 xfs_extlen_t nrsumblocks; /* new number of summary blocks */ 895 uint nrsumlevels; /* new rt summary levels */ 896 uint nrsumsize; /* new size of rt summary, bytes */ 897 xfs_sb_t *nsbp; /* new superblock */ 898 xfs_extlen_t rbmblocks; /* current number of rt bitmap blocks */ 899 xfs_extlen_t rsumblocks; /* current number of rt summary blks */ 900 xfs_sb_t *sbp; /* old superblock */ 901 xfs_fsblock_t sumbno; /* summary block number */ 902 903 sbp = &mp->m_sb; 904 /* 905 * Initial error checking. 906 */ 907 if (!capable(CAP_SYS_ADMIN)) 908 return -EPERM; 909 if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL || 910 (nrblocks = in->newblocks) <= sbp->sb_rblocks || 911 (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize))) 912 return -EINVAL; 913 if ((error = xfs_sb_validate_fsb_count(sbp, nrblocks))) 914 return error; 915 /* 916 * Read in the last block of the device, make sure it exists. 917 */ 918 error = xfs_buf_read_uncached(mp->m_rtdev_targp, 919 XFS_FSB_TO_BB(mp, nrblocks - 1), 920 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL); 921 if (error) 922 return error; 923 xfs_buf_relse(bp); 924 925 /* 926 * Calculate new parameters. These are the final values to be reached. 927 */ 928 nrextents = nrblocks; 929 do_div(nrextents, in->extsize); 930 nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize); 931 nrextslog = xfs_highbit32(nrextents); 932 nrsumlevels = nrextslog + 1; 933 nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks; 934 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 935 nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 936 /* 937 * New summary size can't be more than half the size of 938 * the log. This prevents us from getting a log overflow, 939 * since we'll log basically the whole summary file at once. 940 */ 941 if (nrsumblocks > (mp->m_sb.sb_logblocks >> 1)) 942 return -EINVAL; 943 /* 944 * Get the old block counts for bitmap and summary inodes. 945 * These can't change since other growfs callers are locked out. 946 */ 947 rbmblocks = XFS_B_TO_FSB(mp, mp->m_rbmip->i_d.di_size); 948 rsumblocks = XFS_B_TO_FSB(mp, mp->m_rsumip->i_d.di_size); 949 /* 950 * Allocate space to the bitmap and summary files, as necessary. 951 */ 952 error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip); 953 if (error) 954 return error; 955 error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip); 956 if (error) 957 return error; 958 /* 959 * Allocate a new (fake) mount/sb. 960 */ 961 nmp = kmem_alloc(sizeof(*nmp), KM_SLEEP); 962 /* 963 * Loop over the bitmap blocks. 964 * We will do everything one bitmap block at a time. 965 * Skip the current block if it is exactly full. 966 * This also deals with the case where there were no rtextents before. 967 */ 968 for (bmbno = sbp->sb_rbmblocks - 969 ((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0); 970 bmbno < nrbmblocks; 971 bmbno++) { 972 xfs_trans_t *tp; 973 974 *nmp = *mp; 975 nsbp = &nmp->m_sb; 976 /* 977 * Calculate new sb and mount fields for this round. 978 */ 979 nsbp->sb_rextsize = in->extsize; 980 nsbp->sb_rbmblocks = bmbno + 1; 981 nsbp->sb_rblocks = 982 XFS_RTMIN(nrblocks, 983 nsbp->sb_rbmblocks * NBBY * 984 nsbp->sb_blocksize * nsbp->sb_rextsize); 985 nsbp->sb_rextents = nsbp->sb_rblocks; 986 do_div(nsbp->sb_rextents, nsbp->sb_rextsize); 987 ASSERT(nsbp->sb_rextents != 0); 988 nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); 989 nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; 990 nrsumsize = 991 (uint)sizeof(xfs_suminfo_t) * nrsumlevels * 992 nsbp->sb_rbmblocks; 993 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 994 nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 995 /* 996 * Start a transaction, get the log reservation. 997 */ 998 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE); 999 error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtfree, 1000 0, 0); 1001 if (error) 1002 goto error_cancel; 1003 /* 1004 * Lock out other callers by grabbing the bitmap inode lock. 1005 */ 1006 xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); 1007 xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); 1008 /* 1009 * Update the bitmap inode's size. 1010 */ 1011 mp->m_rbmip->i_d.di_size = 1012 nsbp->sb_rbmblocks * nsbp->sb_blocksize; 1013 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 1014 /* 1015 * Get the summary inode into the transaction. 1016 */ 1017 xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL); 1018 xfs_trans_ijoin(tp, mp->m_rsumip, XFS_ILOCK_EXCL); 1019 /* 1020 * Update the summary inode's size. 1021 */ 1022 mp->m_rsumip->i_d.di_size = nmp->m_rsumsize; 1023 xfs_trans_log_inode(tp, mp->m_rsumip, XFS_ILOG_CORE); 1024 /* 1025 * Copy summary data from old to new sizes. 1026 * Do this when the real size (not block-aligned) changes. 1027 */ 1028 if (sbp->sb_rbmblocks != nsbp->sb_rbmblocks || 1029 mp->m_rsumlevels != nmp->m_rsumlevels) { 1030 error = xfs_rtcopy_summary(mp, nmp, tp); 1031 if (error) 1032 goto error_cancel; 1033 } 1034 /* 1035 * Update superblock fields. 1036 */ 1037 if (nsbp->sb_rextsize != sbp->sb_rextsize) 1038 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSIZE, 1039 nsbp->sb_rextsize - sbp->sb_rextsize); 1040 if (nsbp->sb_rbmblocks != sbp->sb_rbmblocks) 1041 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBMBLOCKS, 1042 nsbp->sb_rbmblocks - sbp->sb_rbmblocks); 1043 if (nsbp->sb_rblocks != sbp->sb_rblocks) 1044 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBLOCKS, 1045 nsbp->sb_rblocks - sbp->sb_rblocks); 1046 if (nsbp->sb_rextents != sbp->sb_rextents) 1047 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTENTS, 1048 nsbp->sb_rextents - sbp->sb_rextents); 1049 if (nsbp->sb_rextslog != sbp->sb_rextslog) 1050 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSLOG, 1051 nsbp->sb_rextslog - sbp->sb_rextslog); 1052 /* 1053 * Free new extent. 1054 */ 1055 bp = NULL; 1056 error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents, 1057 nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno); 1058 if (error) { 1059 error_cancel: 1060 xfs_trans_cancel(tp); 1061 break; 1062 } 1063 /* 1064 * Mark more blocks free in the superblock. 1065 */ 1066 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, 1067 nsbp->sb_rextents - sbp->sb_rextents); 1068 /* 1069 * Update mp values into the real mp structure. 1070 */ 1071 mp->m_rsumlevels = nrsumlevels; 1072 mp->m_rsumsize = nrsumsize; 1073 1074 error = xfs_trans_commit(tp); 1075 if (error) 1076 break; 1077 } 1078 1079 /* 1080 * Free the fake mp structure. 1081 */ 1082 kmem_free(nmp); 1083 1084 return error; 1085 } 1086 1087 /* 1088 * Allocate an extent in the realtime subvolume, with the usual allocation 1089 * parameters. The length units are all in realtime extents, as is the 1090 * result block number. 1091 */ 1092 int /* error */ 1093 xfs_rtallocate_extent( 1094 xfs_trans_t *tp, /* transaction pointer */ 1095 xfs_rtblock_t bno, /* starting block number to allocate */ 1096 xfs_extlen_t minlen, /* minimum length to allocate */ 1097 xfs_extlen_t maxlen, /* maximum length to allocate */ 1098 xfs_extlen_t *len, /* out: actual length allocated */ 1099 xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */ 1100 int wasdel, /* was a delayed allocation extent */ 1101 xfs_extlen_t prod, /* extent product factor */ 1102 xfs_rtblock_t *rtblock) /* out: start block allocated */ 1103 { 1104 xfs_mount_t *mp = tp->t_mountp; 1105 int error; /* error value */ 1106 xfs_rtblock_t r; /* result allocated block */ 1107 xfs_fsblock_t sb; /* summary file block number */ 1108 xfs_buf_t *sumbp; /* summary file block buffer */ 1109 1110 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 1111 ASSERT(minlen > 0 && minlen <= maxlen); 1112 1113 /* 1114 * If prod is set then figure out what to do to minlen and maxlen. 1115 */ 1116 if (prod > 1) { 1117 xfs_extlen_t i; 1118 1119 if ((i = maxlen % prod)) 1120 maxlen -= i; 1121 if ((i = minlen % prod)) 1122 minlen += prod - i; 1123 if (maxlen < minlen) { 1124 *rtblock = NULLRTBLOCK; 1125 return 0; 1126 } 1127 } 1128 1129 sumbp = NULL; 1130 /* 1131 * Allocate by size, or near another block, or exactly at some block. 1132 */ 1133 switch (type) { 1134 case XFS_ALLOCTYPE_ANY_AG: 1135 error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len, 1136 &sumbp, &sb, prod, &r); 1137 break; 1138 case XFS_ALLOCTYPE_NEAR_BNO: 1139 error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen, 1140 len, &sumbp, &sb, prod, &r); 1141 break; 1142 case XFS_ALLOCTYPE_THIS_BNO: 1143 error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen, 1144 len, &sumbp, &sb, prod, &r); 1145 break; 1146 default: 1147 error = -EIO; 1148 ASSERT(0); 1149 } 1150 if (error) 1151 return error; 1152 1153 /* 1154 * If it worked, update the superblock. 1155 */ 1156 if (r != NULLRTBLOCK) { 1157 long slen = (long)*len; 1158 1159 ASSERT(*len >= minlen && *len <= maxlen); 1160 if (wasdel) 1161 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen); 1162 else 1163 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen); 1164 } 1165 *rtblock = r; 1166 return 0; 1167 } 1168 1169 /* 1170 * Initialize realtime fields in the mount structure. 1171 */ 1172 int /* error */ 1173 xfs_rtmount_init( 1174 struct xfs_mount *mp) /* file system mount structure */ 1175 { 1176 struct xfs_buf *bp; /* buffer for last block of subvolume */ 1177 struct xfs_sb *sbp; /* filesystem superblock copy in mount */ 1178 xfs_daddr_t d; /* address of last block of subvolume */ 1179 int error; 1180 1181 sbp = &mp->m_sb; 1182 if (sbp->sb_rblocks == 0) 1183 return 0; 1184 if (mp->m_rtdev_targp == NULL) { 1185 xfs_warn(mp, 1186 "Filesystem has a realtime volume, use rtdev=device option"); 1187 return -ENODEV; 1188 } 1189 mp->m_rsumlevels = sbp->sb_rextslog + 1; 1190 mp->m_rsumsize = 1191 (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels * 1192 sbp->sb_rbmblocks; 1193 mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize); 1194 mp->m_rbmip = mp->m_rsumip = NULL; 1195 /* 1196 * Check that the realtime section is an ok size. 1197 */ 1198 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); 1199 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_rblocks) { 1200 xfs_warn(mp, "realtime mount -- %llu != %llu", 1201 (unsigned long long) XFS_BB_TO_FSB(mp, d), 1202 (unsigned long long) mp->m_sb.sb_rblocks); 1203 return -EFBIG; 1204 } 1205 error = xfs_buf_read_uncached(mp->m_rtdev_targp, 1206 d - XFS_FSB_TO_BB(mp, 1), 1207 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL); 1208 if (error) { 1209 xfs_warn(mp, "realtime device size check failed"); 1210 return error; 1211 } 1212 xfs_buf_relse(bp); 1213 return 0; 1214 } 1215 1216 /* 1217 * Get the bitmap and summary inodes into the mount structure 1218 * at mount time. 1219 */ 1220 int /* error */ 1221 xfs_rtmount_inodes( 1222 xfs_mount_t *mp) /* file system mount structure */ 1223 { 1224 int error; /* error return value */ 1225 xfs_sb_t *sbp; 1226 1227 sbp = &mp->m_sb; 1228 if (sbp->sb_rbmino == NULLFSINO) 1229 return 0; 1230 error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); 1231 if (error) 1232 return error; 1233 ASSERT(mp->m_rbmip != NULL); 1234 ASSERT(sbp->sb_rsumino != NULLFSINO); 1235 error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); 1236 if (error) { 1237 IRELE(mp->m_rbmip); 1238 return error; 1239 } 1240 ASSERT(mp->m_rsumip != NULL); 1241 return 0; 1242 } 1243 1244 void 1245 xfs_rtunmount_inodes( 1246 struct xfs_mount *mp) 1247 { 1248 if (mp->m_rbmip) 1249 IRELE(mp->m_rbmip); 1250 if (mp->m_rsumip) 1251 IRELE(mp->m_rsumip); 1252 } 1253 1254 /* 1255 * Pick an extent for allocation at the start of a new realtime file. 1256 * Use the sequence number stored in the atime field of the bitmap inode. 1257 * Translate this to a fraction of the rtextents, and return the product 1258 * of rtextents and the fraction. 1259 * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ... 1260 */ 1261 int /* error */ 1262 xfs_rtpick_extent( 1263 xfs_mount_t *mp, /* file system mount point */ 1264 xfs_trans_t *tp, /* transaction pointer */ 1265 xfs_extlen_t len, /* allocation length (rtextents) */ 1266 xfs_rtblock_t *pick) /* result rt extent */ 1267 { 1268 xfs_rtblock_t b; /* result block */ 1269 int log2; /* log of sequence number */ 1270 __uint64_t resid; /* residual after log removed */ 1271 __uint64_t seq; /* sequence number of file creation */ 1272 __uint64_t *seqp; /* pointer to seqno in inode */ 1273 1274 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 1275 1276 seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime; 1277 if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { 1278 mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; 1279 *seqp = 0; 1280 } 1281 seq = *seqp; 1282 if ((log2 = xfs_highbit64(seq)) == -1) 1283 b = 0; 1284 else { 1285 resid = seq - (1ULL << log2); 1286 b = (mp->m_sb.sb_rextents * ((resid << 1) + 1ULL)) >> 1287 (log2 + 1); 1288 if (b >= mp->m_sb.sb_rextents) 1289 b = do_mod(b, mp->m_sb.sb_rextents); 1290 if (b + len > mp->m_sb.sb_rextents) 1291 b = mp->m_sb.sb_rextents - len; 1292 } 1293 *seqp = seq + 1; 1294 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 1295 *pick = b; 1296 return 0; 1297 } 1298