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