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_types.h" 21 #include "xfs_bit.h" 22 #include "xfs_log.h" 23 #include "xfs_trans.h" 24 #include "xfs_sb.h" 25 #include "xfs_ag.h" 26 #include "xfs_dir2.h" 27 #include "xfs_mount.h" 28 #include "xfs_bmap_btree.h" 29 #include "xfs_dinode.h" 30 #include "xfs_inode.h" 31 #include "xfs_alloc.h" 32 #include "xfs_bmap.h" 33 #include "xfs_rtalloc.h" 34 #include "xfs_fsops.h" 35 #include "xfs_error.h" 36 #include "xfs_inode_item.h" 37 #include "xfs_trans_space.h" 38 #include "xfs_utils.h" 39 #include "xfs_trace.h" 40 #include "xfs_buf.h" 41 42 43 /* 44 * Prototypes for internal functions. 45 */ 46 47 48 STATIC int xfs_rtallocate_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, 49 xfs_extlen_t, xfs_buf_t **, xfs_fsblock_t *); 50 STATIC int xfs_rtany_summary(xfs_mount_t *, xfs_trans_t *, int, int, 51 xfs_rtblock_t, xfs_buf_t **, xfs_fsblock_t *, int *); 52 STATIC int xfs_rtcheck_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, 53 xfs_extlen_t, int, xfs_rtblock_t *, int *); 54 STATIC int xfs_rtfind_back(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, 55 xfs_rtblock_t, xfs_rtblock_t *); 56 STATIC int xfs_rtfind_forw(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, 57 xfs_rtblock_t, xfs_rtblock_t *); 58 STATIC int xfs_rtget_summary( xfs_mount_t *, xfs_trans_t *, int, 59 xfs_rtblock_t, xfs_buf_t **, xfs_fsblock_t *, xfs_suminfo_t *); 60 STATIC int xfs_rtmodify_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, 61 xfs_extlen_t, int); 62 STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int, 63 xfs_rtblock_t, int, xfs_buf_t **, xfs_fsblock_t *); 64 65 /* 66 * Internal functions. 67 */ 68 69 /* 70 * Allocate space to the bitmap or summary file, and zero it, for growfs. 71 */ 72 STATIC int /* error */ 73 xfs_growfs_rt_alloc( 74 xfs_mount_t *mp, /* file system mount point */ 75 xfs_extlen_t oblocks, /* old count of blocks */ 76 xfs_extlen_t nblocks, /* new count of blocks */ 77 xfs_inode_t *ip) /* inode (bitmap/summary) */ 78 { 79 xfs_fileoff_t bno; /* block number in file */ 80 xfs_buf_t *bp; /* temporary buffer for zeroing */ 81 int committed; /* transaction committed flag */ 82 xfs_daddr_t d; /* disk block address */ 83 int error; /* error return value */ 84 xfs_fsblock_t firstblock; /* first block allocated in xaction */ 85 xfs_bmap_free_t flist; /* list of freed blocks */ 86 xfs_fsblock_t fsbno; /* filesystem block for bno */ 87 xfs_bmbt_irec_t map; /* block map output */ 88 int nmap; /* number of block maps */ 89 int resblks; /* space reservation */ 90 91 /* 92 * Allocate space to the file, as necessary. 93 */ 94 while (oblocks < nblocks) { 95 int cancelflags = 0; 96 xfs_trans_t *tp; 97 98 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); 99 resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); 100 /* 101 * Reserve space & log for one extent added to the file. 102 */ 103 if ((error = xfs_trans_reserve(tp, resblks, 104 XFS_GROWRTALLOC_LOG_RES(mp), 0, 105 XFS_TRANS_PERM_LOG_RES, 106 XFS_DEFAULT_PERM_LOG_COUNT))) 107 goto error_cancel; 108 cancelflags = XFS_TRANS_RELEASE_LOG_RES; 109 /* 110 * Lock the inode. 111 */ 112 xfs_ilock(ip, XFS_ILOCK_EXCL); 113 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 114 115 xfs_bmap_init(&flist, &firstblock); 116 /* 117 * Allocate blocks to the bitmap file. 118 */ 119 nmap = 1; 120 cancelflags |= XFS_TRANS_ABORT; 121 error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, 122 XFS_BMAPI_METADATA, &firstblock, 123 resblks, &map, &nmap, &flist); 124 if (!error && nmap < 1) 125 error = XFS_ERROR(ENOSPC); 126 if (error) 127 goto error_cancel; 128 /* 129 * Free any blocks freed up in the transaction, then commit. 130 */ 131 error = xfs_bmap_finish(&tp, &flist, &committed); 132 if (error) 133 goto error_cancel; 134 error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); 135 if (error) 136 goto error; 137 /* 138 * Now we need to clear the allocated blocks. 139 * Do this one block per transaction, to keep it simple. 140 */ 141 cancelflags = 0; 142 for (bno = map.br_startoff, fsbno = map.br_startblock; 143 bno < map.br_startoff + map.br_blockcount; 144 bno++, fsbno++) { 145 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ZERO); 146 /* 147 * Reserve log for one block zeroing. 148 */ 149 if ((error = xfs_trans_reserve(tp, 0, 150 XFS_GROWRTZERO_LOG_RES(mp), 0, 0, 0))) 151 goto error_cancel; 152 /* 153 * Lock the bitmap inode. 154 */ 155 xfs_ilock(ip, XFS_ILOCK_EXCL); 156 xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); 157 /* 158 * Get a buffer for the block. 159 */ 160 d = XFS_FSB_TO_DADDR(mp, fsbno); 161 bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, 162 mp->m_bsize, 0); 163 if (bp == NULL) { 164 error = XFS_ERROR(EIO); 165 error_cancel: 166 xfs_trans_cancel(tp, cancelflags); 167 goto error; 168 } 169 memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); 170 xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); 171 /* 172 * Commit the transaction. 173 */ 174 error = xfs_trans_commit(tp, 0); 175 if (error) 176 goto error; 177 } 178 /* 179 * Go on to the next extent, if any. 180 */ 181 oblocks = map.br_startoff + map.br_blockcount; 182 } 183 return 0; 184 185 error: 186 return error; 187 } 188 189 /* 190 * Attempt to allocate an extent minlen<=len<=maxlen starting from 191 * bitmap block bbno. If we don't get maxlen then use prod to trim 192 * the length, if given. Returns error; returns starting block in *rtblock. 193 * The lengths are all in rtextents. 194 */ 195 STATIC int /* error */ 196 xfs_rtallocate_extent_block( 197 xfs_mount_t *mp, /* file system mount point */ 198 xfs_trans_t *tp, /* transaction pointer */ 199 xfs_rtblock_t bbno, /* bitmap block number */ 200 xfs_extlen_t minlen, /* minimum length to allocate */ 201 xfs_extlen_t maxlen, /* maximum length to allocate */ 202 xfs_extlen_t *len, /* out: actual length allocated */ 203 xfs_rtblock_t *nextp, /* out: next block to try */ 204 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 205 xfs_fsblock_t *rsb, /* in/out: summary block number */ 206 xfs_extlen_t prod, /* extent product factor */ 207 xfs_rtblock_t *rtblock) /* out: start block allocated */ 208 { 209 xfs_rtblock_t besti; /* best rtblock found so far */ 210 xfs_rtblock_t bestlen; /* best length found so far */ 211 xfs_rtblock_t end; /* last rtblock in chunk */ 212 int error; /* error value */ 213 xfs_rtblock_t i; /* current rtblock trying */ 214 xfs_rtblock_t next; /* next rtblock to try */ 215 int stat; /* status from internal calls */ 216 217 /* 218 * Loop over all the extents starting in this bitmap block, 219 * looking for one that's long enough. 220 */ 221 for (i = XFS_BLOCKTOBIT(mp, bbno), besti = -1, bestlen = 0, 222 end = XFS_BLOCKTOBIT(mp, bbno + 1) - 1; 223 i <= end; 224 i++) { 225 /* 226 * See if there's a free extent of maxlen starting at i. 227 * If it's not so then next will contain the first non-free. 228 */ 229 error = xfs_rtcheck_range(mp, tp, i, maxlen, 1, &next, &stat); 230 if (error) { 231 return error; 232 } 233 if (stat) { 234 /* 235 * i for maxlen is all free, allocate and return that. 236 */ 237 error = xfs_rtallocate_range(mp, tp, i, maxlen, rbpp, 238 rsb); 239 if (error) { 240 return error; 241 } 242 *len = maxlen; 243 *rtblock = i; 244 return 0; 245 } 246 /* 247 * In the case where we have a variable-sized allocation 248 * request, figure out how big this free piece is, 249 * and if it's big enough for the minimum, and the best 250 * so far, remember it. 251 */ 252 if (minlen < maxlen) { 253 xfs_rtblock_t thislen; /* this extent size */ 254 255 thislen = next - i; 256 if (thislen >= minlen && thislen > bestlen) { 257 besti = i; 258 bestlen = thislen; 259 } 260 } 261 /* 262 * If not done yet, find the start of the next free space. 263 */ 264 if (next < end) { 265 error = xfs_rtfind_forw(mp, tp, next, end, &i); 266 if (error) { 267 return error; 268 } 269 } else 270 break; 271 } 272 /* 273 * Searched the whole thing & didn't find a maxlen free extent. 274 */ 275 if (minlen < maxlen && besti != -1) { 276 xfs_extlen_t p; /* amount to trim length by */ 277 278 /* 279 * If size should be a multiple of prod, make that so. 280 */ 281 if (prod > 1 && (p = do_mod(bestlen, prod))) 282 bestlen -= p; 283 /* 284 * Allocate besti for bestlen & return that. 285 */ 286 error = xfs_rtallocate_range(mp, tp, besti, bestlen, rbpp, rsb); 287 if (error) { 288 return error; 289 } 290 *len = bestlen; 291 *rtblock = besti; 292 return 0; 293 } 294 /* 295 * Allocation failed. Set *nextp to the next block to try. 296 */ 297 *nextp = next; 298 *rtblock = NULLRTBLOCK; 299 return 0; 300 } 301 302 /* 303 * Allocate an extent of length minlen<=len<=maxlen, starting at block 304 * bno. If we don't get maxlen then use prod to trim the length, if given. 305 * Returns error; returns starting block in *rtblock. 306 * The lengths are all in rtextents. 307 */ 308 STATIC int /* error */ 309 xfs_rtallocate_extent_exact( 310 xfs_mount_t *mp, /* file system mount point */ 311 xfs_trans_t *tp, /* transaction pointer */ 312 xfs_rtblock_t bno, /* starting block number to allocate */ 313 xfs_extlen_t minlen, /* minimum length to allocate */ 314 xfs_extlen_t maxlen, /* maximum length to allocate */ 315 xfs_extlen_t *len, /* out: actual length allocated */ 316 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 317 xfs_fsblock_t *rsb, /* in/out: summary block number */ 318 xfs_extlen_t prod, /* extent product factor */ 319 xfs_rtblock_t *rtblock) /* out: start block allocated */ 320 { 321 int error; /* error value */ 322 xfs_extlen_t i; /* extent length trimmed due to prod */ 323 int isfree; /* extent is free */ 324 xfs_rtblock_t next; /* next block to try (dummy) */ 325 326 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 327 /* 328 * Check if the range in question (for maxlen) is free. 329 */ 330 error = xfs_rtcheck_range(mp, tp, bno, maxlen, 1, &next, &isfree); 331 if (error) { 332 return error; 333 } 334 if (isfree) { 335 /* 336 * If it is, allocate it and return success. 337 */ 338 error = xfs_rtallocate_range(mp, tp, bno, maxlen, rbpp, rsb); 339 if (error) { 340 return error; 341 } 342 *len = maxlen; 343 *rtblock = bno; 344 return 0; 345 } 346 /* 347 * If not, allocate what there is, if it's at least minlen. 348 */ 349 maxlen = next - bno; 350 if (maxlen < minlen) { 351 /* 352 * Failed, return failure status. 353 */ 354 *rtblock = NULLRTBLOCK; 355 return 0; 356 } 357 /* 358 * Trim off tail of extent, if prod is specified. 359 */ 360 if (prod > 1 && (i = maxlen % prod)) { 361 maxlen -= i; 362 if (maxlen < minlen) { 363 /* 364 * Now we can't do it, return failure status. 365 */ 366 *rtblock = NULLRTBLOCK; 367 return 0; 368 } 369 } 370 /* 371 * Allocate what we can and return it. 372 */ 373 error = xfs_rtallocate_range(mp, tp, bno, maxlen, rbpp, rsb); 374 if (error) { 375 return error; 376 } 377 *len = maxlen; 378 *rtblock = bno; 379 return 0; 380 } 381 382 /* 383 * Allocate an extent of length minlen<=len<=maxlen, starting as near 384 * to bno as possible. If we don't get maxlen then use prod to trim 385 * the length, if given. The lengths are all in rtextents. 386 */ 387 STATIC int /* error */ 388 xfs_rtallocate_extent_near( 389 xfs_mount_t *mp, /* file system mount point */ 390 xfs_trans_t *tp, /* transaction pointer */ 391 xfs_rtblock_t bno, /* starting block number to allocate */ 392 xfs_extlen_t minlen, /* minimum length to allocate */ 393 xfs_extlen_t maxlen, /* maximum length to allocate */ 394 xfs_extlen_t *len, /* out: actual length allocated */ 395 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 396 xfs_fsblock_t *rsb, /* in/out: summary block number */ 397 xfs_extlen_t prod, /* extent product factor */ 398 xfs_rtblock_t *rtblock) /* out: start block allocated */ 399 { 400 int any; /* any useful extents from summary */ 401 xfs_rtblock_t bbno; /* bitmap block number */ 402 int error; /* error value */ 403 int i; /* bitmap block offset (loop control) */ 404 int j; /* secondary loop control */ 405 int log2len; /* log2 of minlen */ 406 xfs_rtblock_t n; /* next block to try */ 407 xfs_rtblock_t r; /* result block */ 408 409 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 410 /* 411 * If the block number given is off the end, silently set it to 412 * the last block. 413 */ 414 if (bno >= mp->m_sb.sb_rextents) 415 bno = mp->m_sb.sb_rextents - 1; 416 /* 417 * Try the exact allocation first. 418 */ 419 error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen, len, 420 rbpp, rsb, prod, &r); 421 if (error) { 422 return error; 423 } 424 /* 425 * If the exact allocation worked, return that. 426 */ 427 if (r != NULLRTBLOCK) { 428 *rtblock = r; 429 return 0; 430 } 431 bbno = XFS_BITTOBLOCK(mp, bno); 432 i = 0; 433 ASSERT(minlen != 0); 434 log2len = xfs_highbit32(minlen); 435 /* 436 * Loop over all bitmap blocks (bbno + i is current block). 437 */ 438 for (;;) { 439 /* 440 * Get summary information of extents of all useful levels 441 * starting in this bitmap block. 442 */ 443 error = xfs_rtany_summary(mp, tp, log2len, mp->m_rsumlevels - 1, 444 bbno + i, rbpp, rsb, &any); 445 if (error) { 446 return error; 447 } 448 /* 449 * If there are any useful extents starting here, try 450 * allocating one. 451 */ 452 if (any) { 453 /* 454 * On the positive side of the starting location. 455 */ 456 if (i >= 0) { 457 /* 458 * Try to allocate an extent starting in 459 * this block. 460 */ 461 error = xfs_rtallocate_extent_block(mp, tp, 462 bbno + i, minlen, maxlen, len, &n, rbpp, 463 rsb, prod, &r); 464 if (error) { 465 return error; 466 } 467 /* 468 * If it worked, return it. 469 */ 470 if (r != NULLRTBLOCK) { 471 *rtblock = r; 472 return 0; 473 } 474 } 475 /* 476 * On the negative side of the starting location. 477 */ 478 else { /* i < 0 */ 479 /* 480 * Loop backwards through the bitmap blocks from 481 * the starting point-1 up to where we are now. 482 * There should be an extent which ends in this 483 * bitmap block and is long enough. 484 */ 485 for (j = -1; j > i; j--) { 486 /* 487 * Grab the summary information for 488 * this bitmap block. 489 */ 490 error = xfs_rtany_summary(mp, tp, 491 log2len, mp->m_rsumlevels - 1, 492 bbno + j, rbpp, rsb, &any); 493 if (error) { 494 return error; 495 } 496 /* 497 * If there's no extent given in the 498 * summary that means the extent we 499 * found must carry over from an 500 * earlier block. If there is an 501 * extent given, we've already tried 502 * that allocation, don't do it again. 503 */ 504 if (any) 505 continue; 506 error = xfs_rtallocate_extent_block(mp, 507 tp, bbno + j, minlen, maxlen, 508 len, &n, rbpp, rsb, prod, &r); 509 if (error) { 510 return error; 511 } 512 /* 513 * If it works, return the extent. 514 */ 515 if (r != NULLRTBLOCK) { 516 *rtblock = r; 517 return 0; 518 } 519 } 520 /* 521 * There weren't intervening bitmap blocks 522 * with a long enough extent, or the 523 * allocation didn't work for some reason 524 * (i.e. it's a little * too short). 525 * Try to allocate from the summary block 526 * that we found. 527 */ 528 error = xfs_rtallocate_extent_block(mp, tp, 529 bbno + i, minlen, maxlen, len, &n, rbpp, 530 rsb, prod, &r); 531 if (error) { 532 return error; 533 } 534 /* 535 * If it works, return the extent. 536 */ 537 if (r != NULLRTBLOCK) { 538 *rtblock = r; 539 return 0; 540 } 541 } 542 } 543 /* 544 * Loop control. If we were on the positive side, and there's 545 * still more blocks on the negative side, go there. 546 */ 547 if (i > 0 && (int)bbno - i >= 0) 548 i = -i; 549 /* 550 * If positive, and no more negative, but there are more 551 * positive, go there. 552 */ 553 else if (i > 0 && (int)bbno + i < mp->m_sb.sb_rbmblocks - 1) 554 i++; 555 /* 556 * If negative or 0 (just started), and there are positive 557 * blocks to go, go there. The 0 case moves to block 1. 558 */ 559 else if (i <= 0 && (int)bbno - i < mp->m_sb.sb_rbmblocks - 1) 560 i = 1 - i; 561 /* 562 * If negative or 0 and there are more negative blocks, 563 * go there. 564 */ 565 else if (i <= 0 && (int)bbno + i > 0) 566 i--; 567 /* 568 * Must be done. Return failure. 569 */ 570 else 571 break; 572 } 573 *rtblock = NULLRTBLOCK; 574 return 0; 575 } 576 577 /* 578 * Allocate an extent of length minlen<=len<=maxlen, with no position 579 * specified. If we don't get maxlen then use prod to trim 580 * the length, if given. The lengths are all in rtextents. 581 */ 582 STATIC int /* error */ 583 xfs_rtallocate_extent_size( 584 xfs_mount_t *mp, /* file system mount point */ 585 xfs_trans_t *tp, /* transaction pointer */ 586 xfs_extlen_t minlen, /* minimum length to allocate */ 587 xfs_extlen_t maxlen, /* maximum length to allocate */ 588 xfs_extlen_t *len, /* out: actual length allocated */ 589 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 590 xfs_fsblock_t *rsb, /* in/out: summary block number */ 591 xfs_extlen_t prod, /* extent product factor */ 592 xfs_rtblock_t *rtblock) /* out: start block allocated */ 593 { 594 int error; /* error value */ 595 int i; /* bitmap block number */ 596 int l; /* level number (loop control) */ 597 xfs_rtblock_t n; /* next block to be tried */ 598 xfs_rtblock_t r; /* result block number */ 599 xfs_suminfo_t sum; /* summary information for extents */ 600 601 ASSERT(minlen % prod == 0 && maxlen % prod == 0); 602 ASSERT(maxlen != 0); 603 604 /* 605 * Loop over all the levels starting with maxlen. 606 * At each level, look at all the bitmap blocks, to see if there 607 * are extents starting there that are long enough (>= maxlen). 608 * Note, only on the initial level can the allocation fail if 609 * the summary says there's an extent. 610 */ 611 for (l = xfs_highbit32(maxlen); l < mp->m_rsumlevels; l++) { 612 /* 613 * Loop over all the bitmap blocks. 614 */ 615 for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { 616 /* 617 * Get the summary for this level/block. 618 */ 619 error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, 620 &sum); 621 if (error) { 622 return error; 623 } 624 /* 625 * Nothing there, on to the next block. 626 */ 627 if (!sum) 628 continue; 629 /* 630 * Try allocating the extent. 631 */ 632 error = xfs_rtallocate_extent_block(mp, tp, i, maxlen, 633 maxlen, len, &n, rbpp, rsb, prod, &r); 634 if (error) { 635 return error; 636 } 637 /* 638 * If it worked, return that. 639 */ 640 if (r != NULLRTBLOCK) { 641 *rtblock = r; 642 return 0; 643 } 644 /* 645 * If the "next block to try" returned from the 646 * allocator is beyond the next bitmap block, 647 * skip to that bitmap block. 648 */ 649 if (XFS_BITTOBLOCK(mp, n) > i + 1) 650 i = XFS_BITTOBLOCK(mp, n) - 1; 651 } 652 } 653 /* 654 * Didn't find any maxlen blocks. Try smaller ones, unless 655 * we're asking for a fixed size extent. 656 */ 657 if (minlen > --maxlen) { 658 *rtblock = NULLRTBLOCK; 659 return 0; 660 } 661 ASSERT(minlen != 0); 662 ASSERT(maxlen != 0); 663 664 /* 665 * Loop over sizes, from maxlen down to minlen. 666 * This time, when we do the allocations, allow smaller ones 667 * to succeed. 668 */ 669 for (l = xfs_highbit32(maxlen); l >= xfs_highbit32(minlen); l--) { 670 /* 671 * Loop over all the bitmap blocks, try an allocation 672 * starting in that block. 673 */ 674 for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { 675 /* 676 * Get the summary information for this level/block. 677 */ 678 error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, 679 &sum); 680 if (error) { 681 return error; 682 } 683 /* 684 * If nothing there, go on to next. 685 */ 686 if (!sum) 687 continue; 688 /* 689 * Try the allocation. Make sure the specified 690 * minlen/maxlen are in the possible range for 691 * this summary level. 692 */ 693 error = xfs_rtallocate_extent_block(mp, tp, i, 694 XFS_RTMAX(minlen, 1 << l), 695 XFS_RTMIN(maxlen, (1 << (l + 1)) - 1), 696 len, &n, rbpp, rsb, prod, &r); 697 if (error) { 698 return error; 699 } 700 /* 701 * If it worked, return that extent. 702 */ 703 if (r != NULLRTBLOCK) { 704 *rtblock = r; 705 return 0; 706 } 707 /* 708 * If the "next block to try" returned from the 709 * allocator is beyond the next bitmap block, 710 * skip to that bitmap block. 711 */ 712 if (XFS_BITTOBLOCK(mp, n) > i + 1) 713 i = XFS_BITTOBLOCK(mp, n) - 1; 714 } 715 } 716 /* 717 * Got nothing, return failure. 718 */ 719 *rtblock = NULLRTBLOCK; 720 return 0; 721 } 722 723 /* 724 * Mark an extent specified by start and len allocated. 725 * Updates all the summary information as well as the bitmap. 726 */ 727 STATIC int /* error */ 728 xfs_rtallocate_range( 729 xfs_mount_t *mp, /* file system mount point */ 730 xfs_trans_t *tp, /* transaction pointer */ 731 xfs_rtblock_t start, /* start block to allocate */ 732 xfs_extlen_t len, /* length to allocate */ 733 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 734 xfs_fsblock_t *rsb) /* in/out: summary block number */ 735 { 736 xfs_rtblock_t end; /* end of the allocated extent */ 737 int error; /* error value */ 738 xfs_rtblock_t postblock; /* first block allocated > end */ 739 xfs_rtblock_t preblock; /* first block allocated < start */ 740 741 end = start + len - 1; 742 /* 743 * Assume we're allocating out of the middle of a free extent. 744 * We need to find the beginning and end of the extent so we can 745 * properly update the summary. 746 */ 747 error = xfs_rtfind_back(mp, tp, start, 0, &preblock); 748 if (error) { 749 return error; 750 } 751 /* 752 * Find the next allocated block (end of free extent). 753 */ 754 error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, 755 &postblock); 756 if (error) { 757 return error; 758 } 759 /* 760 * Decrement the summary information corresponding to the entire 761 * (old) free extent. 762 */ 763 error = xfs_rtmodify_summary(mp, tp, 764 XFS_RTBLOCKLOG(postblock + 1 - preblock), 765 XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); 766 if (error) { 767 return error; 768 } 769 /* 770 * If there are blocks not being allocated at the front of the 771 * old extent, add summary data for them to be free. 772 */ 773 if (preblock < start) { 774 error = xfs_rtmodify_summary(mp, tp, 775 XFS_RTBLOCKLOG(start - preblock), 776 XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); 777 if (error) { 778 return error; 779 } 780 } 781 /* 782 * If there are blocks not being allocated at the end of the 783 * old extent, add summary data for them to be free. 784 */ 785 if (postblock > end) { 786 error = xfs_rtmodify_summary(mp, tp, 787 XFS_RTBLOCKLOG(postblock - end), 788 XFS_BITTOBLOCK(mp, end + 1), 1, rbpp, rsb); 789 if (error) { 790 return error; 791 } 792 } 793 /* 794 * Modify the bitmap to mark this extent allocated. 795 */ 796 error = xfs_rtmodify_range(mp, tp, start, len, 0); 797 return error; 798 } 799 800 /* 801 * Return whether there are any free extents in the size range given 802 * by low and high, for the bitmap block bbno. 803 */ 804 STATIC int /* error */ 805 xfs_rtany_summary( 806 xfs_mount_t *mp, /* file system mount structure */ 807 xfs_trans_t *tp, /* transaction pointer */ 808 int low, /* low log2 extent size */ 809 int high, /* high log2 extent size */ 810 xfs_rtblock_t bbno, /* bitmap block number */ 811 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 812 xfs_fsblock_t *rsb, /* in/out: summary block number */ 813 int *stat) /* out: any good extents here? */ 814 { 815 int error; /* error value */ 816 int log; /* loop counter, log2 of ext. size */ 817 xfs_suminfo_t sum; /* summary data */ 818 819 /* 820 * Loop over logs of extent sizes. Order is irrelevant. 821 */ 822 for (log = low; log <= high; log++) { 823 /* 824 * Get one summary datum. 825 */ 826 error = xfs_rtget_summary(mp, tp, log, bbno, rbpp, rsb, &sum); 827 if (error) { 828 return error; 829 } 830 /* 831 * If there are any, return success. 832 */ 833 if (sum) { 834 *stat = 1; 835 return 0; 836 } 837 } 838 /* 839 * Found nothing, return failure. 840 */ 841 *stat = 0; 842 return 0; 843 } 844 845 /* 846 * Get a buffer for the bitmap or summary file block specified. 847 * The buffer is returned read and locked. 848 */ 849 STATIC int /* error */ 850 xfs_rtbuf_get( 851 xfs_mount_t *mp, /* file system mount structure */ 852 xfs_trans_t *tp, /* transaction pointer */ 853 xfs_rtblock_t block, /* block number in bitmap or summary */ 854 int issum, /* is summary not bitmap */ 855 xfs_buf_t **bpp) /* output: buffer for the block */ 856 { 857 xfs_buf_t *bp; /* block buffer, result */ 858 xfs_inode_t *ip; /* bitmap or summary inode */ 859 xfs_bmbt_irec_t map; 860 int nmap = 1; 861 int error; /* error value */ 862 863 ip = issum ? mp->m_rsumip : mp->m_rbmip; 864 865 error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); 866 if (error) 867 return error; 868 869 ASSERT(map.br_startblock != NULLFSBLOCK); 870 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, 871 XFS_FSB_TO_DADDR(mp, map.br_startblock), 872 mp->m_bsize, 0, &bp); 873 if (error) 874 return error; 875 ASSERT(!xfs_buf_geterror(bp)); 876 *bpp = bp; 877 return 0; 878 } 879 880 #ifdef DEBUG 881 /* 882 * Check that the given extent (block range) is allocated already. 883 */ 884 STATIC int /* error */ 885 xfs_rtcheck_alloc_range( 886 xfs_mount_t *mp, /* file system mount point */ 887 xfs_trans_t *tp, /* transaction pointer */ 888 xfs_rtblock_t bno, /* starting block number of extent */ 889 xfs_extlen_t len, /* length of extent */ 890 int *stat) /* out: 1 for allocated, 0 for not */ 891 { 892 xfs_rtblock_t new; /* dummy for xfs_rtcheck_range */ 893 894 return xfs_rtcheck_range(mp, tp, bno, len, 0, &new, stat); 895 } 896 #endif 897 898 /* 899 * Check that the given range is either all allocated (val = 0) or 900 * all free (val = 1). 901 */ 902 STATIC int /* error */ 903 xfs_rtcheck_range( 904 xfs_mount_t *mp, /* file system mount point */ 905 xfs_trans_t *tp, /* transaction pointer */ 906 xfs_rtblock_t start, /* starting block number of extent */ 907 xfs_extlen_t len, /* length of extent */ 908 int val, /* 1 for free, 0 for allocated */ 909 xfs_rtblock_t *new, /* out: first block not matching */ 910 int *stat) /* out: 1 for matches, 0 for not */ 911 { 912 xfs_rtword_t *b; /* current word in buffer */ 913 int bit; /* bit number in the word */ 914 xfs_rtblock_t block; /* bitmap block number */ 915 xfs_buf_t *bp; /* buf for the block */ 916 xfs_rtword_t *bufp; /* starting word in buffer */ 917 int error; /* error value */ 918 xfs_rtblock_t i; /* current bit number rel. to start */ 919 xfs_rtblock_t lastbit; /* last useful bit in word */ 920 xfs_rtword_t mask; /* mask of relevant bits for value */ 921 xfs_rtword_t wdiff; /* difference from wanted value */ 922 int word; /* word number in the buffer */ 923 924 /* 925 * Compute starting bitmap block number 926 */ 927 block = XFS_BITTOBLOCK(mp, start); 928 /* 929 * Read the bitmap block. 930 */ 931 error = xfs_rtbuf_get(mp, tp, block, 0, &bp); 932 if (error) { 933 return error; 934 } 935 bufp = bp->b_addr; 936 /* 937 * Compute the starting word's address, and starting bit. 938 */ 939 word = XFS_BITTOWORD(mp, start); 940 b = &bufp[word]; 941 bit = (int)(start & (XFS_NBWORD - 1)); 942 /* 943 * 0 (allocated) => all zero's; 1 (free) => all one's. 944 */ 945 val = -val; 946 /* 947 * If not starting on a word boundary, deal with the first 948 * (partial) word. 949 */ 950 if (bit) { 951 /* 952 * Compute first bit not examined. 953 */ 954 lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); 955 /* 956 * Mask of relevant bits. 957 */ 958 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 959 /* 960 * Compute difference between actual and desired value. 961 */ 962 if ((wdiff = (*b ^ val) & mask)) { 963 /* 964 * Different, compute first wrong bit and return. 965 */ 966 xfs_trans_brelse(tp, bp); 967 i = XFS_RTLOBIT(wdiff) - bit; 968 *new = start + i; 969 *stat = 0; 970 return 0; 971 } 972 i = lastbit - bit; 973 /* 974 * Go on to next block if that's where the next word is 975 * and we need the next word. 976 */ 977 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 978 /* 979 * If done with this block, get the next one. 980 */ 981 xfs_trans_brelse(tp, bp); 982 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 983 if (error) { 984 return error; 985 } 986 b = bufp = bp->b_addr; 987 word = 0; 988 } else { 989 /* 990 * Go on to the next word in the buffer. 991 */ 992 b++; 993 } 994 } else { 995 /* 996 * Starting on a word boundary, no partial word. 997 */ 998 i = 0; 999 } 1000 /* 1001 * Loop over whole words in buffers. When we use up one buffer 1002 * we move on to the next one. 1003 */ 1004 while (len - i >= XFS_NBWORD) { 1005 /* 1006 * Compute difference between actual and desired value. 1007 */ 1008 if ((wdiff = *b ^ val)) { 1009 /* 1010 * Different, compute first wrong bit and return. 1011 */ 1012 xfs_trans_brelse(tp, bp); 1013 i += XFS_RTLOBIT(wdiff); 1014 *new = start + i; 1015 *stat = 0; 1016 return 0; 1017 } 1018 i += XFS_NBWORD; 1019 /* 1020 * Go on to next block if that's where the next word is 1021 * and we need the next word. 1022 */ 1023 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 1024 /* 1025 * If done with this block, get the next one. 1026 */ 1027 xfs_trans_brelse(tp, bp); 1028 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 1029 if (error) { 1030 return error; 1031 } 1032 b = bufp = bp->b_addr; 1033 word = 0; 1034 } else { 1035 /* 1036 * Go on to the next word in the buffer. 1037 */ 1038 b++; 1039 } 1040 } 1041 /* 1042 * If not ending on a word boundary, deal with the last 1043 * (partial) word. 1044 */ 1045 if ((lastbit = len - i)) { 1046 /* 1047 * Mask of relevant bits. 1048 */ 1049 mask = ((xfs_rtword_t)1 << lastbit) - 1; 1050 /* 1051 * Compute difference between actual and desired value. 1052 */ 1053 if ((wdiff = (*b ^ val) & mask)) { 1054 /* 1055 * Different, compute first wrong bit and return. 1056 */ 1057 xfs_trans_brelse(tp, bp); 1058 i += XFS_RTLOBIT(wdiff); 1059 *new = start + i; 1060 *stat = 0; 1061 return 0; 1062 } else 1063 i = len; 1064 } 1065 /* 1066 * Successful, return. 1067 */ 1068 xfs_trans_brelse(tp, bp); 1069 *new = start + i; 1070 *stat = 1; 1071 return 0; 1072 } 1073 1074 /* 1075 * Copy and transform the summary file, given the old and new 1076 * parameters in the mount structures. 1077 */ 1078 STATIC int /* error */ 1079 xfs_rtcopy_summary( 1080 xfs_mount_t *omp, /* old file system mount point */ 1081 xfs_mount_t *nmp, /* new file system mount point */ 1082 xfs_trans_t *tp) /* transaction pointer */ 1083 { 1084 xfs_rtblock_t bbno; /* bitmap block number */ 1085 xfs_buf_t *bp; /* summary buffer */ 1086 int error; /* error return value */ 1087 int log; /* summary level number (log length) */ 1088 xfs_suminfo_t sum; /* summary data */ 1089 xfs_fsblock_t sumbno; /* summary block number */ 1090 1091 bp = NULL; 1092 for (log = omp->m_rsumlevels - 1; log >= 0; log--) { 1093 for (bbno = omp->m_sb.sb_rbmblocks - 1; 1094 (xfs_srtblock_t)bbno >= 0; 1095 bbno--) { 1096 error = xfs_rtget_summary(omp, tp, log, bbno, &bp, 1097 &sumbno, &sum); 1098 if (error) 1099 return error; 1100 if (sum == 0) 1101 continue; 1102 error = xfs_rtmodify_summary(omp, tp, log, bbno, -sum, 1103 &bp, &sumbno); 1104 if (error) 1105 return error; 1106 error = xfs_rtmodify_summary(nmp, tp, log, bbno, sum, 1107 &bp, &sumbno); 1108 if (error) 1109 return error; 1110 ASSERT(sum > 0); 1111 } 1112 } 1113 return 0; 1114 } 1115 1116 /* 1117 * Searching backward from start to limit, find the first block whose 1118 * allocated/free state is different from start's. 1119 */ 1120 STATIC int /* error */ 1121 xfs_rtfind_back( 1122 xfs_mount_t *mp, /* file system mount point */ 1123 xfs_trans_t *tp, /* transaction pointer */ 1124 xfs_rtblock_t start, /* starting block to look at */ 1125 xfs_rtblock_t limit, /* last block to look at */ 1126 xfs_rtblock_t *rtblock) /* out: start block found */ 1127 { 1128 xfs_rtword_t *b; /* current word in buffer */ 1129 int bit; /* bit number in the word */ 1130 xfs_rtblock_t block; /* bitmap block number */ 1131 xfs_buf_t *bp; /* buf for the block */ 1132 xfs_rtword_t *bufp; /* starting word in buffer */ 1133 int error; /* error value */ 1134 xfs_rtblock_t firstbit; /* first useful bit in the word */ 1135 xfs_rtblock_t i; /* current bit number rel. to start */ 1136 xfs_rtblock_t len; /* length of inspected area */ 1137 xfs_rtword_t mask; /* mask of relevant bits for value */ 1138 xfs_rtword_t want; /* mask for "good" values */ 1139 xfs_rtword_t wdiff; /* difference from wanted value */ 1140 int word; /* word number in the buffer */ 1141 1142 /* 1143 * Compute and read in starting bitmap block for starting block. 1144 */ 1145 block = XFS_BITTOBLOCK(mp, start); 1146 error = xfs_rtbuf_get(mp, tp, block, 0, &bp); 1147 if (error) { 1148 return error; 1149 } 1150 bufp = bp->b_addr; 1151 /* 1152 * Get the first word's index & point to it. 1153 */ 1154 word = XFS_BITTOWORD(mp, start); 1155 b = &bufp[word]; 1156 bit = (int)(start & (XFS_NBWORD - 1)); 1157 len = start - limit + 1; 1158 /* 1159 * Compute match value, based on the bit at start: if 1 (free) 1160 * then all-ones, else all-zeroes. 1161 */ 1162 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; 1163 /* 1164 * If the starting position is not word-aligned, deal with the 1165 * partial word. 1166 */ 1167 if (bit < XFS_NBWORD - 1) { 1168 /* 1169 * Calculate first (leftmost) bit number to look at, 1170 * and mask for all the relevant bits in this word. 1171 */ 1172 firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); 1173 mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << 1174 firstbit; 1175 /* 1176 * Calculate the difference between the value there 1177 * and what we're looking for. 1178 */ 1179 if ((wdiff = (*b ^ want) & mask)) { 1180 /* 1181 * Different. Mark where we are and return. 1182 */ 1183 xfs_trans_brelse(tp, bp); 1184 i = bit - XFS_RTHIBIT(wdiff); 1185 *rtblock = start - i + 1; 1186 return 0; 1187 } 1188 i = bit - firstbit + 1; 1189 /* 1190 * Go on to previous block if that's where the previous word is 1191 * and we need the previous word. 1192 */ 1193 if (--word == -1 && i < len) { 1194 /* 1195 * If done with this block, get the previous one. 1196 */ 1197 xfs_trans_brelse(tp, bp); 1198 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); 1199 if (error) { 1200 return error; 1201 } 1202 bufp = bp->b_addr; 1203 word = XFS_BLOCKWMASK(mp); 1204 b = &bufp[word]; 1205 } else { 1206 /* 1207 * Go on to the previous word in the buffer. 1208 */ 1209 b--; 1210 } 1211 } else { 1212 /* 1213 * Starting on a word boundary, no partial word. 1214 */ 1215 i = 0; 1216 } 1217 /* 1218 * Loop over whole words in buffers. When we use up one buffer 1219 * we move on to the previous one. 1220 */ 1221 while (len - i >= XFS_NBWORD) { 1222 /* 1223 * Compute difference between actual and desired value. 1224 */ 1225 if ((wdiff = *b ^ want)) { 1226 /* 1227 * Different, mark where we are and return. 1228 */ 1229 xfs_trans_brelse(tp, bp); 1230 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); 1231 *rtblock = start - i + 1; 1232 return 0; 1233 } 1234 i += XFS_NBWORD; 1235 /* 1236 * Go on to previous block if that's where the previous word is 1237 * and we need the previous word. 1238 */ 1239 if (--word == -1 && i < len) { 1240 /* 1241 * If done with this block, get the previous one. 1242 */ 1243 xfs_trans_brelse(tp, bp); 1244 error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); 1245 if (error) { 1246 return error; 1247 } 1248 bufp = bp->b_addr; 1249 word = XFS_BLOCKWMASK(mp); 1250 b = &bufp[word]; 1251 } else { 1252 /* 1253 * Go on to the previous word in the buffer. 1254 */ 1255 b--; 1256 } 1257 } 1258 /* 1259 * If not ending on a word boundary, deal with the last 1260 * (partial) word. 1261 */ 1262 if (len - i) { 1263 /* 1264 * Calculate first (leftmost) bit number to look at, 1265 * and mask for all the relevant bits in this word. 1266 */ 1267 firstbit = XFS_NBWORD - (len - i); 1268 mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; 1269 /* 1270 * Compute difference between actual and desired value. 1271 */ 1272 if ((wdiff = (*b ^ want) & mask)) { 1273 /* 1274 * Different, mark where we are and return. 1275 */ 1276 xfs_trans_brelse(tp, bp); 1277 i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); 1278 *rtblock = start - i + 1; 1279 return 0; 1280 } else 1281 i = len; 1282 } 1283 /* 1284 * No match, return that we scanned the whole area. 1285 */ 1286 xfs_trans_brelse(tp, bp); 1287 *rtblock = start - i + 1; 1288 return 0; 1289 } 1290 1291 /* 1292 * Searching forward from start to limit, find the first block whose 1293 * allocated/free state is different from start's. 1294 */ 1295 STATIC int /* error */ 1296 xfs_rtfind_forw( 1297 xfs_mount_t *mp, /* file system mount point */ 1298 xfs_trans_t *tp, /* transaction pointer */ 1299 xfs_rtblock_t start, /* starting block to look at */ 1300 xfs_rtblock_t limit, /* last block to look at */ 1301 xfs_rtblock_t *rtblock) /* out: start block found */ 1302 { 1303 xfs_rtword_t *b; /* current word in buffer */ 1304 int bit; /* bit number in the word */ 1305 xfs_rtblock_t block; /* bitmap block number */ 1306 xfs_buf_t *bp; /* buf for the block */ 1307 xfs_rtword_t *bufp; /* starting word in buffer */ 1308 int error; /* error value */ 1309 xfs_rtblock_t i; /* current bit number rel. to start */ 1310 xfs_rtblock_t lastbit; /* last useful bit in the word */ 1311 xfs_rtblock_t len; /* length of inspected area */ 1312 xfs_rtword_t mask; /* mask of relevant bits for value */ 1313 xfs_rtword_t want; /* mask for "good" values */ 1314 xfs_rtword_t wdiff; /* difference from wanted value */ 1315 int word; /* word number in the buffer */ 1316 1317 /* 1318 * Compute and read in starting bitmap block for starting block. 1319 */ 1320 block = XFS_BITTOBLOCK(mp, start); 1321 error = xfs_rtbuf_get(mp, tp, block, 0, &bp); 1322 if (error) { 1323 return error; 1324 } 1325 bufp = bp->b_addr; 1326 /* 1327 * Get the first word's index & point to it. 1328 */ 1329 word = XFS_BITTOWORD(mp, start); 1330 b = &bufp[word]; 1331 bit = (int)(start & (XFS_NBWORD - 1)); 1332 len = limit - start + 1; 1333 /* 1334 * Compute match value, based on the bit at start: if 1 (free) 1335 * then all-ones, else all-zeroes. 1336 */ 1337 want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; 1338 /* 1339 * If the starting position is not word-aligned, deal with the 1340 * partial word. 1341 */ 1342 if (bit) { 1343 /* 1344 * Calculate last (rightmost) bit number to look at, 1345 * and mask for all the relevant bits in this word. 1346 */ 1347 lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); 1348 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 1349 /* 1350 * Calculate the difference between the value there 1351 * and what we're looking for. 1352 */ 1353 if ((wdiff = (*b ^ want) & mask)) { 1354 /* 1355 * Different. Mark where we are and return. 1356 */ 1357 xfs_trans_brelse(tp, bp); 1358 i = XFS_RTLOBIT(wdiff) - bit; 1359 *rtblock = start + i - 1; 1360 return 0; 1361 } 1362 i = lastbit - bit; 1363 /* 1364 * Go on to next block if that's where the next word is 1365 * and we need the next word. 1366 */ 1367 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 1368 /* 1369 * If done with this block, get the previous one. 1370 */ 1371 xfs_trans_brelse(tp, bp); 1372 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 1373 if (error) { 1374 return error; 1375 } 1376 b = bufp = bp->b_addr; 1377 word = 0; 1378 } else { 1379 /* 1380 * Go on to the previous word in the buffer. 1381 */ 1382 b++; 1383 } 1384 } else { 1385 /* 1386 * Starting on a word boundary, no partial word. 1387 */ 1388 i = 0; 1389 } 1390 /* 1391 * Loop over whole words in buffers. When we use up one buffer 1392 * we move on to the next one. 1393 */ 1394 while (len - i >= XFS_NBWORD) { 1395 /* 1396 * Compute difference between actual and desired value. 1397 */ 1398 if ((wdiff = *b ^ want)) { 1399 /* 1400 * Different, mark where we are and return. 1401 */ 1402 xfs_trans_brelse(tp, bp); 1403 i += XFS_RTLOBIT(wdiff); 1404 *rtblock = start + i - 1; 1405 return 0; 1406 } 1407 i += XFS_NBWORD; 1408 /* 1409 * Go on to next block if that's where the next word is 1410 * and we need the next word. 1411 */ 1412 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 1413 /* 1414 * If done with this block, get the next one. 1415 */ 1416 xfs_trans_brelse(tp, bp); 1417 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 1418 if (error) { 1419 return error; 1420 } 1421 b = bufp = bp->b_addr; 1422 word = 0; 1423 } else { 1424 /* 1425 * Go on to the next word in the buffer. 1426 */ 1427 b++; 1428 } 1429 } 1430 /* 1431 * If not ending on a word boundary, deal with the last 1432 * (partial) word. 1433 */ 1434 if ((lastbit = len - i)) { 1435 /* 1436 * Calculate mask for all the relevant bits in this word. 1437 */ 1438 mask = ((xfs_rtword_t)1 << lastbit) - 1; 1439 /* 1440 * Compute difference between actual and desired value. 1441 */ 1442 if ((wdiff = (*b ^ want) & mask)) { 1443 /* 1444 * Different, mark where we are and return. 1445 */ 1446 xfs_trans_brelse(tp, bp); 1447 i += XFS_RTLOBIT(wdiff); 1448 *rtblock = start + i - 1; 1449 return 0; 1450 } else 1451 i = len; 1452 } 1453 /* 1454 * No match, return that we scanned the whole area. 1455 */ 1456 xfs_trans_brelse(tp, bp); 1457 *rtblock = start + i - 1; 1458 return 0; 1459 } 1460 1461 /* 1462 * Mark an extent specified by start and len freed. 1463 * Updates all the summary information as well as the bitmap. 1464 */ 1465 STATIC int /* error */ 1466 xfs_rtfree_range( 1467 xfs_mount_t *mp, /* file system mount point */ 1468 xfs_trans_t *tp, /* transaction pointer */ 1469 xfs_rtblock_t start, /* starting block to free */ 1470 xfs_extlen_t len, /* length to free */ 1471 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 1472 xfs_fsblock_t *rsb) /* in/out: summary block number */ 1473 { 1474 xfs_rtblock_t end; /* end of the freed extent */ 1475 int error; /* error value */ 1476 xfs_rtblock_t postblock; /* first block freed > end */ 1477 xfs_rtblock_t preblock; /* first block freed < start */ 1478 1479 end = start + len - 1; 1480 /* 1481 * Modify the bitmap to mark this extent freed. 1482 */ 1483 error = xfs_rtmodify_range(mp, tp, start, len, 1); 1484 if (error) { 1485 return error; 1486 } 1487 /* 1488 * Assume we're freeing out of the middle of an allocated extent. 1489 * We need to find the beginning and end of the extent so we can 1490 * properly update the summary. 1491 */ 1492 error = xfs_rtfind_back(mp, tp, start, 0, &preblock); 1493 if (error) { 1494 return error; 1495 } 1496 /* 1497 * Find the next allocated block (end of allocated extent). 1498 */ 1499 error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, 1500 &postblock); 1501 if (error) 1502 return error; 1503 /* 1504 * If there are blocks not being freed at the front of the 1505 * old extent, add summary data for them to be allocated. 1506 */ 1507 if (preblock < start) { 1508 error = xfs_rtmodify_summary(mp, tp, 1509 XFS_RTBLOCKLOG(start - preblock), 1510 XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); 1511 if (error) { 1512 return error; 1513 } 1514 } 1515 /* 1516 * If there are blocks not being freed at the end of the 1517 * old extent, add summary data for them to be allocated. 1518 */ 1519 if (postblock > end) { 1520 error = xfs_rtmodify_summary(mp, tp, 1521 XFS_RTBLOCKLOG(postblock - end), 1522 XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); 1523 if (error) { 1524 return error; 1525 } 1526 } 1527 /* 1528 * Increment the summary information corresponding to the entire 1529 * (new) free extent. 1530 */ 1531 error = xfs_rtmodify_summary(mp, tp, 1532 XFS_RTBLOCKLOG(postblock + 1 - preblock), 1533 XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); 1534 return error; 1535 } 1536 1537 /* 1538 * Read and return the summary information for a given extent size, 1539 * bitmap block combination. 1540 * Keeps track of a current summary block, so we don't keep reading 1541 * it from the buffer cache. 1542 */ 1543 STATIC int /* error */ 1544 xfs_rtget_summary( 1545 xfs_mount_t *mp, /* file system mount structure */ 1546 xfs_trans_t *tp, /* transaction pointer */ 1547 int log, /* log2 of extent size */ 1548 xfs_rtblock_t bbno, /* bitmap block number */ 1549 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 1550 xfs_fsblock_t *rsb, /* in/out: summary block number */ 1551 xfs_suminfo_t *sum) /* out: summary info for this block */ 1552 { 1553 xfs_buf_t *bp; /* buffer for summary block */ 1554 int error; /* error value */ 1555 xfs_fsblock_t sb; /* summary fsblock */ 1556 int so; /* index into the summary file */ 1557 xfs_suminfo_t *sp; /* pointer to returned data */ 1558 1559 /* 1560 * Compute entry number in the summary file. 1561 */ 1562 so = XFS_SUMOFFS(mp, log, bbno); 1563 /* 1564 * Compute the block number in the summary file. 1565 */ 1566 sb = XFS_SUMOFFSTOBLOCK(mp, so); 1567 /* 1568 * If we have an old buffer, and the block number matches, use that. 1569 */ 1570 if (rbpp && *rbpp && *rsb == sb) 1571 bp = *rbpp; 1572 /* 1573 * Otherwise we have to get the buffer. 1574 */ 1575 else { 1576 /* 1577 * If there was an old one, get rid of it first. 1578 */ 1579 if (rbpp && *rbpp) 1580 xfs_trans_brelse(tp, *rbpp); 1581 error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); 1582 if (error) { 1583 return error; 1584 } 1585 /* 1586 * Remember this buffer and block for the next call. 1587 */ 1588 if (rbpp) { 1589 *rbpp = bp; 1590 *rsb = sb; 1591 } 1592 } 1593 /* 1594 * Point to the summary information & copy it out. 1595 */ 1596 sp = XFS_SUMPTR(mp, bp, so); 1597 *sum = *sp; 1598 /* 1599 * Drop the buffer if we're not asked to remember it. 1600 */ 1601 if (!rbpp) 1602 xfs_trans_brelse(tp, bp); 1603 return 0; 1604 } 1605 1606 /* 1607 * Set the given range of bitmap bits to the given value. 1608 * Do whatever I/O and logging is required. 1609 */ 1610 STATIC int /* error */ 1611 xfs_rtmodify_range( 1612 xfs_mount_t *mp, /* file system mount point */ 1613 xfs_trans_t *tp, /* transaction pointer */ 1614 xfs_rtblock_t start, /* starting block to modify */ 1615 xfs_extlen_t len, /* length of extent to modify */ 1616 int val) /* 1 for free, 0 for allocated */ 1617 { 1618 xfs_rtword_t *b; /* current word in buffer */ 1619 int bit; /* bit number in the word */ 1620 xfs_rtblock_t block; /* bitmap block number */ 1621 xfs_buf_t *bp; /* buf for the block */ 1622 xfs_rtword_t *bufp; /* starting word in buffer */ 1623 int error; /* error value */ 1624 xfs_rtword_t *first; /* first used word in the buffer */ 1625 int i; /* current bit number rel. to start */ 1626 int lastbit; /* last useful bit in word */ 1627 xfs_rtword_t mask; /* mask o frelevant bits for value */ 1628 int word; /* word number in the buffer */ 1629 1630 /* 1631 * Compute starting bitmap block number. 1632 */ 1633 block = XFS_BITTOBLOCK(mp, start); 1634 /* 1635 * Read the bitmap block, and point to its data. 1636 */ 1637 error = xfs_rtbuf_get(mp, tp, block, 0, &bp); 1638 if (error) { 1639 return error; 1640 } 1641 bufp = bp->b_addr; 1642 /* 1643 * Compute the starting word's address, and starting bit. 1644 */ 1645 word = XFS_BITTOWORD(mp, start); 1646 first = b = &bufp[word]; 1647 bit = (int)(start & (XFS_NBWORD - 1)); 1648 /* 1649 * 0 (allocated) => all zeroes; 1 (free) => all ones. 1650 */ 1651 val = -val; 1652 /* 1653 * If not starting on a word boundary, deal with the first 1654 * (partial) word. 1655 */ 1656 if (bit) { 1657 /* 1658 * Compute first bit not changed and mask of relevant bits. 1659 */ 1660 lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); 1661 mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; 1662 /* 1663 * Set/clear the active bits. 1664 */ 1665 if (val) 1666 *b |= mask; 1667 else 1668 *b &= ~mask; 1669 i = lastbit - bit; 1670 /* 1671 * Go on to the next block if that's where the next word is 1672 * and we need the next word. 1673 */ 1674 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 1675 /* 1676 * Log the changed part of this block. 1677 * Get the next one. 1678 */ 1679 xfs_trans_log_buf(tp, bp, 1680 (uint)((char *)first - (char *)bufp), 1681 (uint)((char *)b - (char *)bufp)); 1682 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 1683 if (error) { 1684 return error; 1685 } 1686 first = b = bufp = bp->b_addr; 1687 word = 0; 1688 } else { 1689 /* 1690 * Go on to the next word in the buffer 1691 */ 1692 b++; 1693 } 1694 } else { 1695 /* 1696 * Starting on a word boundary, no partial word. 1697 */ 1698 i = 0; 1699 } 1700 /* 1701 * Loop over whole words in buffers. When we use up one buffer 1702 * we move on to the next one. 1703 */ 1704 while (len - i >= XFS_NBWORD) { 1705 /* 1706 * Set the word value correctly. 1707 */ 1708 *b = val; 1709 i += XFS_NBWORD; 1710 /* 1711 * Go on to the next block if that's where the next word is 1712 * and we need the next word. 1713 */ 1714 if (++word == XFS_BLOCKWSIZE(mp) && i < len) { 1715 /* 1716 * Log the changed part of this block. 1717 * Get the next one. 1718 */ 1719 xfs_trans_log_buf(tp, bp, 1720 (uint)((char *)first - (char *)bufp), 1721 (uint)((char *)b - (char *)bufp)); 1722 error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); 1723 if (error) { 1724 return error; 1725 } 1726 first = b = bufp = bp->b_addr; 1727 word = 0; 1728 } else { 1729 /* 1730 * Go on to the next word in the buffer 1731 */ 1732 b++; 1733 } 1734 } 1735 /* 1736 * If not ending on a word boundary, deal with the last 1737 * (partial) word. 1738 */ 1739 if ((lastbit = len - i)) { 1740 /* 1741 * Compute a mask of relevant bits. 1742 */ 1743 bit = 0; 1744 mask = ((xfs_rtword_t)1 << lastbit) - 1; 1745 /* 1746 * Set/clear the active bits. 1747 */ 1748 if (val) 1749 *b |= mask; 1750 else 1751 *b &= ~mask; 1752 b++; 1753 } 1754 /* 1755 * Log any remaining changed bytes. 1756 */ 1757 if (b > first) 1758 xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), 1759 (uint)((char *)b - (char *)bufp - 1)); 1760 return 0; 1761 } 1762 1763 /* 1764 * Read and modify the summary information for a given extent size, 1765 * bitmap block combination. 1766 * Keeps track of a current summary block, so we don't keep reading 1767 * it from the buffer cache. 1768 */ 1769 STATIC int /* error */ 1770 xfs_rtmodify_summary( 1771 xfs_mount_t *mp, /* file system mount point */ 1772 xfs_trans_t *tp, /* transaction pointer */ 1773 int log, /* log2 of extent size */ 1774 xfs_rtblock_t bbno, /* bitmap block number */ 1775 int delta, /* change to make to summary info */ 1776 xfs_buf_t **rbpp, /* in/out: summary block buffer */ 1777 xfs_fsblock_t *rsb) /* in/out: summary block number */ 1778 { 1779 xfs_buf_t *bp; /* buffer for the summary block */ 1780 int error; /* error value */ 1781 xfs_fsblock_t sb; /* summary fsblock */ 1782 int so; /* index into the summary file */ 1783 xfs_suminfo_t *sp; /* pointer to returned data */ 1784 1785 /* 1786 * Compute entry number in the summary file. 1787 */ 1788 so = XFS_SUMOFFS(mp, log, bbno); 1789 /* 1790 * Compute the block number in the summary file. 1791 */ 1792 sb = XFS_SUMOFFSTOBLOCK(mp, so); 1793 /* 1794 * If we have an old buffer, and the block number matches, use that. 1795 */ 1796 if (rbpp && *rbpp && *rsb == sb) 1797 bp = *rbpp; 1798 /* 1799 * Otherwise we have to get the buffer. 1800 */ 1801 else { 1802 /* 1803 * If there was an old one, get rid of it first. 1804 */ 1805 if (rbpp && *rbpp) 1806 xfs_trans_brelse(tp, *rbpp); 1807 error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); 1808 if (error) { 1809 return error; 1810 } 1811 /* 1812 * Remember this buffer and block for the next call. 1813 */ 1814 if (rbpp) { 1815 *rbpp = bp; 1816 *rsb = sb; 1817 } 1818 } 1819 /* 1820 * Point to the summary information, modify and log it. 1821 */ 1822 sp = XFS_SUMPTR(mp, bp, so); 1823 *sp += delta; 1824 xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), 1825 (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); 1826 return 0; 1827 } 1828 1829 /* 1830 * Visible (exported) functions. 1831 */ 1832 1833 /* 1834 * Grow the realtime area of the filesystem. 1835 */ 1836 int 1837 xfs_growfs_rt( 1838 xfs_mount_t *mp, /* mount point for filesystem */ 1839 xfs_growfs_rt_t *in) /* growfs rt input struct */ 1840 { 1841 xfs_rtblock_t bmbno; /* bitmap block number */ 1842 xfs_buf_t *bp; /* temporary buffer */ 1843 int error; /* error return value */ 1844 xfs_mount_t *nmp; /* new (fake) mount structure */ 1845 xfs_drfsbno_t nrblocks; /* new number of realtime blocks */ 1846 xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */ 1847 xfs_drtbno_t nrextents; /* new number of realtime extents */ 1848 uint8_t nrextslog; /* new log2 of sb_rextents */ 1849 xfs_extlen_t nrsumblocks; /* new number of summary blocks */ 1850 uint nrsumlevels; /* new rt summary levels */ 1851 uint nrsumsize; /* new size of rt summary, bytes */ 1852 xfs_sb_t *nsbp; /* new superblock */ 1853 xfs_extlen_t rbmblocks; /* current number of rt bitmap blocks */ 1854 xfs_extlen_t rsumblocks; /* current number of rt summary blks */ 1855 xfs_sb_t *sbp; /* old superblock */ 1856 xfs_fsblock_t sumbno; /* summary block number */ 1857 1858 sbp = &mp->m_sb; 1859 /* 1860 * Initial error checking. 1861 */ 1862 if (!capable(CAP_SYS_ADMIN)) 1863 return XFS_ERROR(EPERM); 1864 if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL || 1865 (nrblocks = in->newblocks) <= sbp->sb_rblocks || 1866 (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize))) 1867 return XFS_ERROR(EINVAL); 1868 if ((error = xfs_sb_validate_fsb_count(sbp, nrblocks))) 1869 return error; 1870 /* 1871 * Read in the last block of the device, make sure it exists. 1872 */ 1873 bp = xfs_buf_read_uncached(mp->m_rtdev_targp, 1874 XFS_FSB_TO_BB(mp, nrblocks - 1), 1875 XFS_FSB_TO_BB(mp, 1), 0); 1876 if (!bp) 1877 return EIO; 1878 xfs_buf_relse(bp); 1879 1880 /* 1881 * Calculate new parameters. These are the final values to be reached. 1882 */ 1883 nrextents = nrblocks; 1884 do_div(nrextents, in->extsize); 1885 nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize); 1886 nrextslog = xfs_highbit32(nrextents); 1887 nrsumlevels = nrextslog + 1; 1888 nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks; 1889 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 1890 nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 1891 /* 1892 * New summary size can't be more than half the size of 1893 * the log. This prevents us from getting a log overflow, 1894 * since we'll log basically the whole summary file at once. 1895 */ 1896 if (nrsumblocks > (mp->m_sb.sb_logblocks >> 1)) 1897 return XFS_ERROR(EINVAL); 1898 /* 1899 * Get the old block counts for bitmap and summary inodes. 1900 * These can't change since other growfs callers are locked out. 1901 */ 1902 rbmblocks = XFS_B_TO_FSB(mp, mp->m_rbmip->i_d.di_size); 1903 rsumblocks = XFS_B_TO_FSB(mp, mp->m_rsumip->i_d.di_size); 1904 /* 1905 * Allocate space to the bitmap and summary files, as necessary. 1906 */ 1907 error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip); 1908 if (error) 1909 return error; 1910 error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip); 1911 if (error) 1912 return error; 1913 /* 1914 * Allocate a new (fake) mount/sb. 1915 */ 1916 nmp = kmem_alloc(sizeof(*nmp), KM_SLEEP); 1917 /* 1918 * Loop over the bitmap blocks. 1919 * We will do everything one bitmap block at a time. 1920 * Skip the current block if it is exactly full. 1921 * This also deals with the case where there were no rtextents before. 1922 */ 1923 for (bmbno = sbp->sb_rbmblocks - 1924 ((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0); 1925 bmbno < nrbmblocks; 1926 bmbno++) { 1927 xfs_trans_t *tp; 1928 int cancelflags = 0; 1929 1930 *nmp = *mp; 1931 nsbp = &nmp->m_sb; 1932 /* 1933 * Calculate new sb and mount fields for this round. 1934 */ 1935 nsbp->sb_rextsize = in->extsize; 1936 nsbp->sb_rbmblocks = bmbno + 1; 1937 nsbp->sb_rblocks = 1938 XFS_RTMIN(nrblocks, 1939 nsbp->sb_rbmblocks * NBBY * 1940 nsbp->sb_blocksize * nsbp->sb_rextsize); 1941 nsbp->sb_rextents = nsbp->sb_rblocks; 1942 do_div(nsbp->sb_rextents, nsbp->sb_rextsize); 1943 ASSERT(nsbp->sb_rextents != 0); 1944 nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); 1945 nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; 1946 nrsumsize = 1947 (uint)sizeof(xfs_suminfo_t) * nrsumlevels * 1948 nsbp->sb_rbmblocks; 1949 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize); 1950 nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks); 1951 /* 1952 * Start a transaction, get the log reservation. 1953 */ 1954 tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE); 1955 if ((error = xfs_trans_reserve(tp, 0, 1956 XFS_GROWRTFREE_LOG_RES(nmp), 0, 0, 0))) 1957 goto error_cancel; 1958 /* 1959 * Lock out other callers by grabbing the bitmap inode lock. 1960 */ 1961 xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); 1962 xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL); 1963 /* 1964 * Update the bitmap inode's size. 1965 */ 1966 mp->m_rbmip->i_d.di_size = 1967 nsbp->sb_rbmblocks * nsbp->sb_blocksize; 1968 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 1969 cancelflags |= XFS_TRANS_ABORT; 1970 /* 1971 * Get the summary inode into the transaction. 1972 */ 1973 xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL); 1974 xfs_trans_ijoin(tp, mp->m_rsumip, XFS_ILOCK_EXCL); 1975 /* 1976 * Update the summary inode's size. 1977 */ 1978 mp->m_rsumip->i_d.di_size = nmp->m_rsumsize; 1979 xfs_trans_log_inode(tp, mp->m_rsumip, XFS_ILOG_CORE); 1980 /* 1981 * Copy summary data from old to new sizes. 1982 * Do this when the real size (not block-aligned) changes. 1983 */ 1984 if (sbp->sb_rbmblocks != nsbp->sb_rbmblocks || 1985 mp->m_rsumlevels != nmp->m_rsumlevels) { 1986 error = xfs_rtcopy_summary(mp, nmp, tp); 1987 if (error) 1988 goto error_cancel; 1989 } 1990 /* 1991 * Update superblock fields. 1992 */ 1993 if (nsbp->sb_rextsize != sbp->sb_rextsize) 1994 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSIZE, 1995 nsbp->sb_rextsize - sbp->sb_rextsize); 1996 if (nsbp->sb_rbmblocks != sbp->sb_rbmblocks) 1997 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBMBLOCKS, 1998 nsbp->sb_rbmblocks - sbp->sb_rbmblocks); 1999 if (nsbp->sb_rblocks != sbp->sb_rblocks) 2000 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBLOCKS, 2001 nsbp->sb_rblocks - sbp->sb_rblocks); 2002 if (nsbp->sb_rextents != sbp->sb_rextents) 2003 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTENTS, 2004 nsbp->sb_rextents - sbp->sb_rextents); 2005 if (nsbp->sb_rextslog != sbp->sb_rextslog) 2006 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSLOG, 2007 nsbp->sb_rextslog - sbp->sb_rextslog); 2008 /* 2009 * Free new extent. 2010 */ 2011 bp = NULL; 2012 error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents, 2013 nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno); 2014 if (error) { 2015 error_cancel: 2016 xfs_trans_cancel(tp, cancelflags); 2017 break; 2018 } 2019 /* 2020 * Mark more blocks free in the superblock. 2021 */ 2022 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, 2023 nsbp->sb_rextents - sbp->sb_rextents); 2024 /* 2025 * Update mp values into the real mp structure. 2026 */ 2027 mp->m_rsumlevels = nrsumlevels; 2028 mp->m_rsumsize = nrsumsize; 2029 2030 error = xfs_trans_commit(tp, 0); 2031 if (error) 2032 break; 2033 } 2034 2035 /* 2036 * Free the fake mp structure. 2037 */ 2038 kmem_free(nmp); 2039 2040 return error; 2041 } 2042 2043 /* 2044 * Allocate an extent in the realtime subvolume, with the usual allocation 2045 * parameters. The length units are all in realtime extents, as is the 2046 * result block number. 2047 */ 2048 int /* error */ 2049 xfs_rtallocate_extent( 2050 xfs_trans_t *tp, /* transaction pointer */ 2051 xfs_rtblock_t bno, /* starting block number to allocate */ 2052 xfs_extlen_t minlen, /* minimum length to allocate */ 2053 xfs_extlen_t maxlen, /* maximum length to allocate */ 2054 xfs_extlen_t *len, /* out: actual length allocated */ 2055 xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */ 2056 int wasdel, /* was a delayed allocation extent */ 2057 xfs_extlen_t prod, /* extent product factor */ 2058 xfs_rtblock_t *rtblock) /* out: start block allocated */ 2059 { 2060 xfs_mount_t *mp = tp->t_mountp; 2061 int error; /* error value */ 2062 xfs_rtblock_t r; /* result allocated block */ 2063 xfs_fsblock_t sb; /* summary file block number */ 2064 xfs_buf_t *sumbp; /* summary file block buffer */ 2065 2066 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 2067 ASSERT(minlen > 0 && minlen <= maxlen); 2068 2069 /* 2070 * If prod is set then figure out what to do to minlen and maxlen. 2071 */ 2072 if (prod > 1) { 2073 xfs_extlen_t i; 2074 2075 if ((i = maxlen % prod)) 2076 maxlen -= i; 2077 if ((i = minlen % prod)) 2078 minlen += prod - i; 2079 if (maxlen < minlen) { 2080 *rtblock = NULLRTBLOCK; 2081 return 0; 2082 } 2083 } 2084 2085 sumbp = NULL; 2086 /* 2087 * Allocate by size, or near another block, or exactly at some block. 2088 */ 2089 switch (type) { 2090 case XFS_ALLOCTYPE_ANY_AG: 2091 error = xfs_rtallocate_extent_size(mp, tp, minlen, maxlen, len, 2092 &sumbp, &sb, prod, &r); 2093 break; 2094 case XFS_ALLOCTYPE_NEAR_BNO: 2095 error = xfs_rtallocate_extent_near(mp, tp, bno, minlen, maxlen, 2096 len, &sumbp, &sb, prod, &r); 2097 break; 2098 case XFS_ALLOCTYPE_THIS_BNO: 2099 error = xfs_rtallocate_extent_exact(mp, tp, bno, minlen, maxlen, 2100 len, &sumbp, &sb, prod, &r); 2101 break; 2102 default: 2103 error = EIO; 2104 ASSERT(0); 2105 } 2106 if (error) 2107 return error; 2108 2109 /* 2110 * If it worked, update the superblock. 2111 */ 2112 if (r != NULLRTBLOCK) { 2113 long slen = (long)*len; 2114 2115 ASSERT(*len >= minlen && *len <= maxlen); 2116 if (wasdel) 2117 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FREXTENTS, -slen); 2118 else 2119 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, -slen); 2120 } 2121 *rtblock = r; 2122 return 0; 2123 } 2124 2125 /* 2126 * Free an extent in the realtime subvolume. Length is expressed in 2127 * realtime extents, as is the block number. 2128 */ 2129 int /* error */ 2130 xfs_rtfree_extent( 2131 xfs_trans_t *tp, /* transaction pointer */ 2132 xfs_rtblock_t bno, /* starting block number to free */ 2133 xfs_extlen_t len) /* length of extent freed */ 2134 { 2135 int error; /* error value */ 2136 xfs_mount_t *mp; /* file system mount structure */ 2137 xfs_fsblock_t sb; /* summary file block number */ 2138 xfs_buf_t *sumbp; /* summary file block buffer */ 2139 2140 mp = tp->t_mountp; 2141 2142 ASSERT(mp->m_rbmip->i_itemp != NULL); 2143 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 2144 2145 #if defined(__KERNEL__) && defined(DEBUG) 2146 /* 2147 * Check to see that this whole range is currently allocated. 2148 */ 2149 { 2150 int stat; /* result from checking range */ 2151 2152 error = xfs_rtcheck_alloc_range(mp, tp, bno, len, &stat); 2153 if (error) { 2154 return error; 2155 } 2156 ASSERT(stat); 2157 } 2158 #endif 2159 sumbp = NULL; 2160 /* 2161 * Free the range of realtime blocks. 2162 */ 2163 error = xfs_rtfree_range(mp, tp, bno, len, &sumbp, &sb); 2164 if (error) { 2165 return error; 2166 } 2167 /* 2168 * Mark more blocks free in the superblock. 2169 */ 2170 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); 2171 /* 2172 * If we've now freed all the blocks, reset the file sequence 2173 * number to 0. 2174 */ 2175 if (tp->t_frextents_delta + mp->m_sb.sb_frextents == 2176 mp->m_sb.sb_rextents) { 2177 if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) 2178 mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; 2179 *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; 2180 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 2181 } 2182 return 0; 2183 } 2184 2185 /* 2186 * Initialize realtime fields in the mount structure. 2187 */ 2188 int /* error */ 2189 xfs_rtmount_init( 2190 xfs_mount_t *mp) /* file system mount structure */ 2191 { 2192 xfs_buf_t *bp; /* buffer for last block of subvolume */ 2193 xfs_daddr_t d; /* address of last block of subvolume */ 2194 xfs_sb_t *sbp; /* filesystem superblock copy in mount */ 2195 2196 sbp = &mp->m_sb; 2197 if (sbp->sb_rblocks == 0) 2198 return 0; 2199 if (mp->m_rtdev_targp == NULL) { 2200 xfs_warn(mp, 2201 "Filesystem has a realtime volume, use rtdev=device option"); 2202 return XFS_ERROR(ENODEV); 2203 } 2204 mp->m_rsumlevels = sbp->sb_rextslog + 1; 2205 mp->m_rsumsize = 2206 (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels * 2207 sbp->sb_rbmblocks; 2208 mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize); 2209 mp->m_rbmip = mp->m_rsumip = NULL; 2210 /* 2211 * Check that the realtime section is an ok size. 2212 */ 2213 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); 2214 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_rblocks) { 2215 xfs_warn(mp, "realtime mount -- %llu != %llu", 2216 (unsigned long long) XFS_BB_TO_FSB(mp, d), 2217 (unsigned long long) mp->m_sb.sb_rblocks); 2218 return XFS_ERROR(EFBIG); 2219 } 2220 bp = xfs_buf_read_uncached(mp->m_rtdev_targp, 2221 d - XFS_FSB_TO_BB(mp, 1), 2222 XFS_FSB_TO_BB(mp, 1), 0); 2223 if (!bp) { 2224 xfs_warn(mp, "realtime device size check failed"); 2225 return EIO; 2226 } 2227 xfs_buf_relse(bp); 2228 return 0; 2229 } 2230 2231 /* 2232 * Get the bitmap and summary inodes into the mount structure 2233 * at mount time. 2234 */ 2235 int /* error */ 2236 xfs_rtmount_inodes( 2237 xfs_mount_t *mp) /* file system mount structure */ 2238 { 2239 int error; /* error return value */ 2240 xfs_sb_t *sbp; 2241 2242 sbp = &mp->m_sb; 2243 if (sbp->sb_rbmino == NULLFSINO) 2244 return 0; 2245 error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); 2246 if (error) 2247 return error; 2248 ASSERT(mp->m_rbmip != NULL); 2249 ASSERT(sbp->sb_rsumino != NULLFSINO); 2250 error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); 2251 if (error) { 2252 IRELE(mp->m_rbmip); 2253 return error; 2254 } 2255 ASSERT(mp->m_rsumip != NULL); 2256 return 0; 2257 } 2258 2259 void 2260 xfs_rtunmount_inodes( 2261 struct xfs_mount *mp) 2262 { 2263 if (mp->m_rbmip) 2264 IRELE(mp->m_rbmip); 2265 if (mp->m_rsumip) 2266 IRELE(mp->m_rsumip); 2267 } 2268 2269 /* 2270 * Pick an extent for allocation at the start of a new realtime file. 2271 * Use the sequence number stored in the atime field of the bitmap inode. 2272 * Translate this to a fraction of the rtextents, and return the product 2273 * of rtextents and the fraction. 2274 * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ... 2275 */ 2276 int /* error */ 2277 xfs_rtpick_extent( 2278 xfs_mount_t *mp, /* file system mount point */ 2279 xfs_trans_t *tp, /* transaction pointer */ 2280 xfs_extlen_t len, /* allocation length (rtextents) */ 2281 xfs_rtblock_t *pick) /* result rt extent */ 2282 { 2283 xfs_rtblock_t b; /* result block */ 2284 int log2; /* log of sequence number */ 2285 __uint64_t resid; /* residual after log removed */ 2286 __uint64_t seq; /* sequence number of file creation */ 2287 __uint64_t *seqp; /* pointer to seqno in inode */ 2288 2289 ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); 2290 2291 seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime; 2292 if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { 2293 mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; 2294 *seqp = 0; 2295 } 2296 seq = *seqp; 2297 if ((log2 = xfs_highbit64(seq)) == -1) 2298 b = 0; 2299 else { 2300 resid = seq - (1ULL << log2); 2301 b = (mp->m_sb.sb_rextents * ((resid << 1) + 1ULL)) >> 2302 (log2 + 1); 2303 if (b >= mp->m_sb.sb_rextents) 2304 b = do_mod(b, mp->m_sb.sb_rextents); 2305 if (b + len > mp->m_sb.sb_rextents) 2306 b = mp->m_sb.sb_rextents - len; 2307 } 2308 *seqp = seq + 1; 2309 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); 2310 *pick = b; 2311 return 0; 2312 } 2313