1 /* 2 * linux/fs/ufs/balloc.c 3 * 4 * Copyright (C) 1998 5 * Daniel Pirkl <daniel.pirkl@email.cz> 6 * Charles University, Faculty of Mathematics and Physics 7 * 8 * UFS2 write support Evgeniy Dushistov <dushistov@mail.ru>, 2007 9 */ 10 11 #include <linux/fs.h> 12 #include <linux/stat.h> 13 #include <linux/time.h> 14 #include <linux/string.h> 15 #include <linux/buffer_head.h> 16 #include <linux/capability.h> 17 #include <linux/bitops.h> 18 #include <asm/byteorder.h> 19 20 #include "ufs_fs.h" 21 #include "ufs.h" 22 #include "swab.h" 23 #include "util.h" 24 25 #define INVBLOCK ((u64)-1L) 26 27 static u64 ufs_add_fragments(struct inode *, u64, unsigned, unsigned, int *); 28 static u64 ufs_alloc_fragments(struct inode *, unsigned, u64, unsigned, int *); 29 static u64 ufs_alloccg_block(struct inode *, struct ufs_cg_private_info *, u64, int *); 30 static u64 ufs_bitmap_search (struct super_block *, struct ufs_cg_private_info *, u64, unsigned); 31 static unsigned char ufs_fragtable_8fpb[], ufs_fragtable_other[]; 32 static void ufs_clusteracct(struct super_block *, struct ufs_cg_private_info *, unsigned, int); 33 34 /* 35 * Free 'count' fragments from fragment number 'fragment' 36 */ 37 void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count) 38 { 39 struct super_block * sb; 40 struct ufs_sb_private_info * uspi; 41 struct ufs_super_block_first * usb1; 42 struct ufs_cg_private_info * ucpi; 43 struct ufs_cylinder_group * ucg; 44 unsigned cgno, bit, end_bit, bbase, blkmap, i; 45 u64 blkno; 46 47 sb = inode->i_sb; 48 uspi = UFS_SB(sb)->s_uspi; 49 usb1 = ubh_get_usb_first(uspi); 50 51 UFSD("ENTER, fragment %llu, count %u\n", 52 (unsigned long long)fragment, count); 53 54 if (ufs_fragnum(fragment) + count > uspi->s_fpg) 55 ufs_error (sb, "ufs_free_fragments", "internal error"); 56 57 lock_super(sb); 58 59 cgno = ufs_dtog(uspi, fragment); 60 bit = ufs_dtogd(uspi, fragment); 61 if (cgno >= uspi->s_ncg) { 62 ufs_panic (sb, "ufs_free_fragments", "freeing blocks are outside device"); 63 goto failed; 64 } 65 66 ucpi = ufs_load_cylinder (sb, cgno); 67 if (!ucpi) 68 goto failed; 69 ucg = ubh_get_ucg (UCPI_UBH(ucpi)); 70 if (!ufs_cg_chkmagic(sb, ucg)) { 71 ufs_panic (sb, "ufs_free_fragments", "internal error, bad magic number on cg %u", cgno); 72 goto failed; 73 } 74 75 end_bit = bit + count; 76 bbase = ufs_blknum (bit); 77 blkmap = ubh_blkmap (UCPI_UBH(ucpi), ucpi->c_freeoff, bbase); 78 ufs_fragacct (sb, blkmap, ucg->cg_frsum, -1); 79 for (i = bit; i < end_bit; i++) { 80 if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, i)) 81 ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, i); 82 else 83 ufs_error (sb, "ufs_free_fragments", 84 "bit already cleared for fragment %u", i); 85 } 86 87 fs32_add(sb, &ucg->cg_cs.cs_nffree, count); 88 uspi->cs_total.cs_nffree += count; 89 fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); 90 blkmap = ubh_blkmap (UCPI_UBH(ucpi), ucpi->c_freeoff, bbase); 91 ufs_fragacct(sb, blkmap, ucg->cg_frsum, 1); 92 93 /* 94 * Trying to reassemble free fragments into block 95 */ 96 blkno = ufs_fragstoblks (bbase); 97 if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno)) { 98 fs32_sub(sb, &ucg->cg_cs.cs_nffree, uspi->s_fpb); 99 uspi->cs_total.cs_nffree -= uspi->s_fpb; 100 fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, uspi->s_fpb); 101 if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) 102 ufs_clusteracct (sb, ucpi, blkno, 1); 103 fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); 104 uspi->cs_total.cs_nbfree++; 105 fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1); 106 if (uspi->fs_magic != UFS2_MAGIC) { 107 unsigned cylno = ufs_cbtocylno (bbase); 108 109 fs16_add(sb, &ubh_cg_blks(ucpi, cylno, 110 ufs_cbtorpos(bbase)), 1); 111 fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1); 112 } 113 } 114 115 ubh_mark_buffer_dirty (USPI_UBH(uspi)); 116 ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); 117 if (sb->s_flags & MS_SYNCHRONOUS) 118 ubh_sync_block(UCPI_UBH(ucpi)); 119 sb->s_dirt = 1; 120 121 unlock_super (sb); 122 UFSD("EXIT\n"); 123 return; 124 125 failed: 126 unlock_super (sb); 127 UFSD("EXIT (FAILED)\n"); 128 return; 129 } 130 131 /* 132 * Free 'count' fragments from fragment number 'fragment' (free whole blocks) 133 */ 134 void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count) 135 { 136 struct super_block * sb; 137 struct ufs_sb_private_info * uspi; 138 struct ufs_super_block_first * usb1; 139 struct ufs_cg_private_info * ucpi; 140 struct ufs_cylinder_group * ucg; 141 unsigned overflow, cgno, bit, end_bit, i; 142 u64 blkno; 143 144 sb = inode->i_sb; 145 uspi = UFS_SB(sb)->s_uspi; 146 usb1 = ubh_get_usb_first(uspi); 147 148 UFSD("ENTER, fragment %llu, count %u\n", 149 (unsigned long long)fragment, count); 150 151 if ((fragment & uspi->s_fpbmask) || (count & uspi->s_fpbmask)) { 152 ufs_error (sb, "ufs_free_blocks", "internal error, " 153 "fragment %llu, count %u\n", 154 (unsigned long long)fragment, count); 155 goto failed; 156 } 157 158 lock_super(sb); 159 160 do_more: 161 overflow = 0; 162 cgno = ufs_dtog(uspi, fragment); 163 bit = ufs_dtogd(uspi, fragment); 164 if (cgno >= uspi->s_ncg) { 165 ufs_panic (sb, "ufs_free_blocks", "freeing blocks are outside device"); 166 goto failed_unlock; 167 } 168 end_bit = bit + count; 169 if (end_bit > uspi->s_fpg) { 170 overflow = bit + count - uspi->s_fpg; 171 count -= overflow; 172 end_bit -= overflow; 173 } 174 175 ucpi = ufs_load_cylinder (sb, cgno); 176 if (!ucpi) 177 goto failed_unlock; 178 ucg = ubh_get_ucg (UCPI_UBH(ucpi)); 179 if (!ufs_cg_chkmagic(sb, ucg)) { 180 ufs_panic (sb, "ufs_free_blocks", "internal error, bad magic number on cg %u", cgno); 181 goto failed_unlock; 182 } 183 184 for (i = bit; i < end_bit; i += uspi->s_fpb) { 185 blkno = ufs_fragstoblks(i); 186 if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno)) { 187 ufs_error(sb, "ufs_free_blocks", "freeing free fragment"); 188 } 189 ubh_setblock(UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); 190 if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) 191 ufs_clusteracct (sb, ucpi, blkno, 1); 192 193 fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1); 194 uspi->cs_total.cs_nbfree++; 195 fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1); 196 197 if (uspi->fs_magic != UFS2_MAGIC) { 198 unsigned cylno = ufs_cbtocylno(i); 199 200 fs16_add(sb, &ubh_cg_blks(ucpi, cylno, 201 ufs_cbtorpos(i)), 1); 202 fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1); 203 } 204 } 205 206 ubh_mark_buffer_dirty (USPI_UBH(uspi)); 207 ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); 208 if (sb->s_flags & MS_SYNCHRONOUS) 209 ubh_sync_block(UCPI_UBH(ucpi)); 210 211 if (overflow) { 212 fragment += count; 213 count = overflow; 214 goto do_more; 215 } 216 217 sb->s_dirt = 1; 218 unlock_super (sb); 219 UFSD("EXIT\n"); 220 return; 221 222 failed_unlock: 223 unlock_super (sb); 224 failed: 225 UFSD("EXIT (FAILED)\n"); 226 return; 227 } 228 229 /* 230 * Modify inode page cache in such way: 231 * have - blocks with b_blocknr equal to oldb...oldb+count-1 232 * get - blocks with b_blocknr equal to newb...newb+count-1 233 * also we suppose that oldb...oldb+count-1 blocks 234 * situated at the end of file. 235 * 236 * We can come here from ufs_writepage or ufs_prepare_write, 237 * locked_page is argument of these functions, so we already lock it. 238 */ 239 static void ufs_change_blocknr(struct inode *inode, sector_t beg, 240 unsigned int count, sector_t oldb, 241 sector_t newb, struct page *locked_page) 242 { 243 const unsigned blks_per_page = 244 1 << (PAGE_CACHE_SHIFT - inode->i_blkbits); 245 const unsigned mask = blks_per_page - 1; 246 struct address_space * const mapping = inode->i_mapping; 247 pgoff_t index, cur_index, last_index; 248 unsigned pos, j, lblock; 249 sector_t end, i; 250 struct page *page; 251 struct buffer_head *head, *bh; 252 253 UFSD("ENTER, ino %lu, count %u, oldb %llu, newb %llu\n", 254 inode->i_ino, count, 255 (unsigned long long)oldb, (unsigned long long)newb); 256 257 BUG_ON(!locked_page); 258 BUG_ON(!PageLocked(locked_page)); 259 260 cur_index = locked_page->index; 261 end = count + beg; 262 last_index = end >> (PAGE_CACHE_SHIFT - inode->i_blkbits); 263 for (i = beg; i < end; i = (i | mask) + 1) { 264 index = i >> (PAGE_CACHE_SHIFT - inode->i_blkbits); 265 266 if (likely(cur_index != index)) { 267 page = ufs_get_locked_page(mapping, index); 268 if (!page)/* it was truncated */ 269 continue; 270 if (IS_ERR(page)) {/* or EIO */ 271 ufs_error(inode->i_sb, __func__, 272 "read of page %llu failed\n", 273 (unsigned long long)index); 274 continue; 275 } 276 } else 277 page = locked_page; 278 279 head = page_buffers(page); 280 bh = head; 281 pos = i & mask; 282 for (j = 0; j < pos; ++j) 283 bh = bh->b_this_page; 284 285 286 if (unlikely(index == last_index)) 287 lblock = end & mask; 288 else 289 lblock = blks_per_page; 290 291 do { 292 if (j >= lblock) 293 break; 294 pos = (i - beg) + j; 295 296 if (!buffer_mapped(bh)) 297 map_bh(bh, inode->i_sb, oldb + pos); 298 if (!buffer_uptodate(bh)) { 299 ll_rw_block(READ, 1, &bh); 300 wait_on_buffer(bh); 301 if (!buffer_uptodate(bh)) { 302 ufs_error(inode->i_sb, __func__, 303 "read of block failed\n"); 304 break; 305 } 306 } 307 308 UFSD(" change from %llu to %llu, pos %u\n", 309 (unsigned long long)(pos + oldb), 310 (unsigned long long)(pos + newb), pos); 311 312 bh->b_blocknr = newb + pos; 313 unmap_underlying_metadata(bh->b_bdev, 314 bh->b_blocknr); 315 mark_buffer_dirty(bh); 316 ++j; 317 bh = bh->b_this_page; 318 } while (bh != head); 319 320 if (likely(cur_index != index)) 321 ufs_put_locked_page(page); 322 } 323 UFSD("EXIT\n"); 324 } 325 326 static void ufs_clear_frags(struct inode *inode, sector_t beg, unsigned int n, 327 int sync) 328 { 329 struct buffer_head *bh; 330 sector_t end = beg + n; 331 332 for (; beg < end; ++beg) { 333 bh = sb_getblk(inode->i_sb, beg); 334 lock_buffer(bh); 335 memset(bh->b_data, 0, inode->i_sb->s_blocksize); 336 set_buffer_uptodate(bh); 337 mark_buffer_dirty(bh); 338 unlock_buffer(bh); 339 if (IS_SYNC(inode) || sync) 340 sync_dirty_buffer(bh); 341 brelse(bh); 342 } 343 } 344 345 u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment, 346 u64 goal, unsigned count, int *err, 347 struct page *locked_page) 348 { 349 struct super_block * sb; 350 struct ufs_sb_private_info * uspi; 351 struct ufs_super_block_first * usb1; 352 unsigned cgno, oldcount, newcount; 353 u64 tmp, request, result; 354 355 UFSD("ENTER, ino %lu, fragment %llu, goal %llu, count %u\n", 356 inode->i_ino, (unsigned long long)fragment, 357 (unsigned long long)goal, count); 358 359 sb = inode->i_sb; 360 uspi = UFS_SB(sb)->s_uspi; 361 usb1 = ubh_get_usb_first(uspi); 362 *err = -ENOSPC; 363 364 lock_super (sb); 365 tmp = ufs_data_ptr_to_cpu(sb, p); 366 367 if (count + ufs_fragnum(fragment) > uspi->s_fpb) { 368 ufs_warning(sb, "ufs_new_fragments", "internal warning" 369 " fragment %llu, count %u", 370 (unsigned long long)fragment, count); 371 count = uspi->s_fpb - ufs_fragnum(fragment); 372 } 373 oldcount = ufs_fragnum (fragment); 374 newcount = oldcount + count; 375 376 /* 377 * Somebody else has just allocated our fragments 378 */ 379 if (oldcount) { 380 if (!tmp) { 381 ufs_error(sb, "ufs_new_fragments", "internal error, " 382 "fragment %llu, tmp %llu\n", 383 (unsigned long long)fragment, 384 (unsigned long long)tmp); 385 unlock_super(sb); 386 return INVBLOCK; 387 } 388 if (fragment < UFS_I(inode)->i_lastfrag) { 389 UFSD("EXIT (ALREADY ALLOCATED)\n"); 390 unlock_super (sb); 391 return 0; 392 } 393 } 394 else { 395 if (tmp) { 396 UFSD("EXIT (ALREADY ALLOCATED)\n"); 397 unlock_super(sb); 398 return 0; 399 } 400 } 401 402 /* 403 * There is not enough space for user on the device 404 */ 405 if (!capable(CAP_SYS_RESOURCE) && ufs_freespace(uspi, UFS_MINFREE) <= 0) { 406 unlock_super (sb); 407 UFSD("EXIT (FAILED)\n"); 408 return 0; 409 } 410 411 if (goal >= uspi->s_size) 412 goal = 0; 413 if (goal == 0) 414 cgno = ufs_inotocg (inode->i_ino); 415 else 416 cgno = ufs_dtog(uspi, goal); 417 418 /* 419 * allocate new fragment 420 */ 421 if (oldcount == 0) { 422 result = ufs_alloc_fragments (inode, cgno, goal, count, err); 423 if (result) { 424 ufs_cpu_to_data_ptr(sb, p, result); 425 *err = 0; 426 UFS_I(inode)->i_lastfrag = 427 max_t(u32, UFS_I(inode)->i_lastfrag, 428 fragment + count); 429 ufs_clear_frags(inode, result + oldcount, 430 newcount - oldcount, locked_page != NULL); 431 } 432 unlock_super(sb); 433 UFSD("EXIT, result %llu\n", (unsigned long long)result); 434 return result; 435 } 436 437 /* 438 * resize block 439 */ 440 result = ufs_add_fragments (inode, tmp, oldcount, newcount, err); 441 if (result) { 442 *err = 0; 443 UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); 444 ufs_clear_frags(inode, result + oldcount, newcount - oldcount, 445 locked_page != NULL); 446 unlock_super(sb); 447 UFSD("EXIT, result %llu\n", (unsigned long long)result); 448 return result; 449 } 450 451 /* 452 * allocate new block and move data 453 */ 454 switch (fs32_to_cpu(sb, usb1->fs_optim)) { 455 case UFS_OPTSPACE: 456 request = newcount; 457 if (uspi->s_minfree < 5 || uspi->cs_total.cs_nffree 458 > uspi->s_dsize * uspi->s_minfree / (2 * 100)) 459 break; 460 usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); 461 break; 462 default: 463 usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); 464 465 case UFS_OPTTIME: 466 request = uspi->s_fpb; 467 if (uspi->cs_total.cs_nffree < uspi->s_dsize * 468 (uspi->s_minfree - 2) / 100) 469 break; 470 usb1->fs_optim = cpu_to_fs32(sb, UFS_OPTTIME); 471 break; 472 } 473 result = ufs_alloc_fragments (inode, cgno, goal, request, err); 474 if (result) { 475 ufs_clear_frags(inode, result + oldcount, newcount - oldcount, 476 locked_page != NULL); 477 ufs_change_blocknr(inode, fragment - oldcount, oldcount, 478 uspi->s_sbbase + tmp, 479 uspi->s_sbbase + result, locked_page); 480 ufs_cpu_to_data_ptr(sb, p, result); 481 *err = 0; 482 UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count); 483 unlock_super(sb); 484 if (newcount < request) 485 ufs_free_fragments (inode, result + newcount, request - newcount); 486 ufs_free_fragments (inode, tmp, oldcount); 487 UFSD("EXIT, result %llu\n", (unsigned long long)result); 488 return result; 489 } 490 491 unlock_super(sb); 492 UFSD("EXIT (FAILED)\n"); 493 return 0; 494 } 495 496 static u64 ufs_add_fragments(struct inode *inode, u64 fragment, 497 unsigned oldcount, unsigned newcount, int *err) 498 { 499 struct super_block * sb; 500 struct ufs_sb_private_info * uspi; 501 struct ufs_super_block_first * usb1; 502 struct ufs_cg_private_info * ucpi; 503 struct ufs_cylinder_group * ucg; 504 unsigned cgno, fragno, fragoff, count, fragsize, i; 505 506 UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n", 507 (unsigned long long)fragment, oldcount, newcount); 508 509 sb = inode->i_sb; 510 uspi = UFS_SB(sb)->s_uspi; 511 usb1 = ubh_get_usb_first (uspi); 512 count = newcount - oldcount; 513 514 cgno = ufs_dtog(uspi, fragment); 515 if (fs32_to_cpu(sb, UFS_SB(sb)->fs_cs(cgno).cs_nffree) < count) 516 return 0; 517 if ((ufs_fragnum (fragment) + newcount) > uspi->s_fpb) 518 return 0; 519 ucpi = ufs_load_cylinder (sb, cgno); 520 if (!ucpi) 521 return 0; 522 ucg = ubh_get_ucg (UCPI_UBH(ucpi)); 523 if (!ufs_cg_chkmagic(sb, ucg)) { 524 ufs_panic (sb, "ufs_add_fragments", 525 "internal error, bad magic number on cg %u", cgno); 526 return 0; 527 } 528 529 fragno = ufs_dtogd(uspi, fragment); 530 fragoff = ufs_fragnum (fragno); 531 for (i = oldcount; i < newcount; i++) 532 if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i)) 533 return 0; 534 /* 535 * Block can be extended 536 */ 537 ucg->cg_time = cpu_to_fs32(sb, get_seconds()); 538 for (i = newcount; i < (uspi->s_fpb - fragoff); i++) 539 if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i)) 540 break; 541 fragsize = i - oldcount; 542 if (!fs32_to_cpu(sb, ucg->cg_frsum[fragsize])) 543 ufs_panic (sb, "ufs_add_fragments", 544 "internal error or corrupted bitmap on cg %u", cgno); 545 fs32_sub(sb, &ucg->cg_frsum[fragsize], 1); 546 if (fragsize != count) 547 fs32_add(sb, &ucg->cg_frsum[fragsize - count], 1); 548 for (i = oldcount; i < newcount; i++) 549 ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i); 550 551 fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); 552 fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); 553 uspi->cs_total.cs_nffree -= count; 554 555 ubh_mark_buffer_dirty (USPI_UBH(uspi)); 556 ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); 557 if (sb->s_flags & MS_SYNCHRONOUS) 558 ubh_sync_block(UCPI_UBH(ucpi)); 559 sb->s_dirt = 1; 560 561 UFSD("EXIT, fragment %llu\n", (unsigned long long)fragment); 562 563 return fragment; 564 } 565 566 #define UFS_TEST_FREE_SPACE_CG \ 567 ucg = (struct ufs_cylinder_group *) UFS_SB(sb)->s_ucg[cgno]->b_data; \ 568 if (fs32_to_cpu(sb, ucg->cg_cs.cs_nbfree)) \ 569 goto cg_found; \ 570 for (k = count; k < uspi->s_fpb; k++) \ 571 if (fs32_to_cpu(sb, ucg->cg_frsum[k])) \ 572 goto cg_found; 573 574 static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno, 575 u64 goal, unsigned count, int *err) 576 { 577 struct super_block * sb; 578 struct ufs_sb_private_info * uspi; 579 struct ufs_super_block_first * usb1; 580 struct ufs_cg_private_info * ucpi; 581 struct ufs_cylinder_group * ucg; 582 unsigned oldcg, i, j, k, allocsize; 583 u64 result; 584 585 UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n", 586 inode->i_ino, cgno, (unsigned long long)goal, count); 587 588 sb = inode->i_sb; 589 uspi = UFS_SB(sb)->s_uspi; 590 usb1 = ubh_get_usb_first(uspi); 591 oldcg = cgno; 592 593 /* 594 * 1. searching on preferred cylinder group 595 */ 596 UFS_TEST_FREE_SPACE_CG 597 598 /* 599 * 2. quadratic rehash 600 */ 601 for (j = 1; j < uspi->s_ncg; j *= 2) { 602 cgno += j; 603 if (cgno >= uspi->s_ncg) 604 cgno -= uspi->s_ncg; 605 UFS_TEST_FREE_SPACE_CG 606 } 607 608 /* 609 * 3. brute force search 610 * We start at i = 2 ( 0 is checked at 1.step, 1 at 2.step ) 611 */ 612 cgno = (oldcg + 1) % uspi->s_ncg; 613 for (j = 2; j < uspi->s_ncg; j++) { 614 cgno++; 615 if (cgno >= uspi->s_ncg) 616 cgno = 0; 617 UFS_TEST_FREE_SPACE_CG 618 } 619 620 UFSD("EXIT (FAILED)\n"); 621 return 0; 622 623 cg_found: 624 ucpi = ufs_load_cylinder (sb, cgno); 625 if (!ucpi) 626 return 0; 627 ucg = ubh_get_ucg (UCPI_UBH(ucpi)); 628 if (!ufs_cg_chkmagic(sb, ucg)) 629 ufs_panic (sb, "ufs_alloc_fragments", 630 "internal error, bad magic number on cg %u", cgno); 631 ucg->cg_time = cpu_to_fs32(sb, get_seconds()); 632 633 if (count == uspi->s_fpb) { 634 result = ufs_alloccg_block (inode, ucpi, goal, err); 635 if (result == INVBLOCK) 636 return 0; 637 goto succed; 638 } 639 640 for (allocsize = count; allocsize < uspi->s_fpb; allocsize++) 641 if (fs32_to_cpu(sb, ucg->cg_frsum[allocsize]) != 0) 642 break; 643 644 if (allocsize == uspi->s_fpb) { 645 result = ufs_alloccg_block (inode, ucpi, goal, err); 646 if (result == INVBLOCK) 647 return 0; 648 goal = ufs_dtogd(uspi, result); 649 for (i = count; i < uspi->s_fpb; i++) 650 ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i); 651 i = uspi->s_fpb - count; 652 653 fs32_add(sb, &ucg->cg_cs.cs_nffree, i); 654 uspi->cs_total.cs_nffree += i; 655 fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, i); 656 fs32_add(sb, &ucg->cg_frsum[i], 1); 657 goto succed; 658 } 659 660 result = ufs_bitmap_search (sb, ucpi, goal, allocsize); 661 if (result == INVBLOCK) 662 return 0; 663 for (i = 0; i < count; i++) 664 ubh_clrbit (UCPI_UBH(ucpi), ucpi->c_freeoff, result + i); 665 666 fs32_sub(sb, &ucg->cg_cs.cs_nffree, count); 667 uspi->cs_total.cs_nffree -= count; 668 fs32_sub(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nffree, count); 669 fs32_sub(sb, &ucg->cg_frsum[allocsize], 1); 670 671 if (count != allocsize) 672 fs32_add(sb, &ucg->cg_frsum[allocsize - count], 1); 673 674 succed: 675 ubh_mark_buffer_dirty (USPI_UBH(uspi)); 676 ubh_mark_buffer_dirty (UCPI_UBH(ucpi)); 677 if (sb->s_flags & MS_SYNCHRONOUS) 678 ubh_sync_block(UCPI_UBH(ucpi)); 679 sb->s_dirt = 1; 680 681 result += cgno * uspi->s_fpg; 682 UFSD("EXIT3, result %llu\n", (unsigned long long)result); 683 return result; 684 } 685 686 static u64 ufs_alloccg_block(struct inode *inode, 687 struct ufs_cg_private_info *ucpi, 688 u64 goal, int *err) 689 { 690 struct super_block * sb; 691 struct ufs_sb_private_info * uspi; 692 struct ufs_super_block_first * usb1; 693 struct ufs_cylinder_group * ucg; 694 u64 result, blkno; 695 696 UFSD("ENTER, goal %llu\n", (unsigned long long)goal); 697 698 sb = inode->i_sb; 699 uspi = UFS_SB(sb)->s_uspi; 700 usb1 = ubh_get_usb_first(uspi); 701 ucg = ubh_get_ucg(UCPI_UBH(ucpi)); 702 703 if (goal == 0) { 704 goal = ucpi->c_rotor; 705 goto norot; 706 } 707 goal = ufs_blknum (goal); 708 goal = ufs_dtogd(uspi, goal); 709 710 /* 711 * If the requested block is available, use it. 712 */ 713 if (ubh_isblockset(UCPI_UBH(ucpi), ucpi->c_freeoff, ufs_fragstoblks(goal))) { 714 result = goal; 715 goto gotit; 716 } 717 718 norot: 719 result = ufs_bitmap_search (sb, ucpi, goal, uspi->s_fpb); 720 if (result == INVBLOCK) 721 return INVBLOCK; 722 ucpi->c_rotor = result; 723 gotit: 724 blkno = ufs_fragstoblks(result); 725 ubh_clrblock (UCPI_UBH(ucpi), ucpi->c_freeoff, blkno); 726 if ((UFS_SB(sb)->s_flags & UFS_CG_MASK) == UFS_CG_44BSD) 727 ufs_clusteracct (sb, ucpi, blkno, -1); 728 729 fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1); 730 uspi->cs_total.cs_nbfree--; 731 fs32_sub(sb, &UFS_SB(sb)->fs_cs(ucpi->c_cgx).cs_nbfree, 1); 732 733 if (uspi->fs_magic != UFS2_MAGIC) { 734 unsigned cylno = ufs_cbtocylno((unsigned)result); 735 736 fs16_sub(sb, &ubh_cg_blks(ucpi, cylno, 737 ufs_cbtorpos((unsigned)result)), 1); 738 fs32_sub(sb, &ubh_cg_blktot(ucpi, cylno), 1); 739 } 740 741 UFSD("EXIT, result %llu\n", (unsigned long long)result); 742 743 return result; 744 } 745 746 static unsigned ubh_scanc(struct ufs_sb_private_info *uspi, 747 struct ufs_buffer_head *ubh, 748 unsigned begin, unsigned size, 749 unsigned char *table, unsigned char mask) 750 { 751 unsigned rest, offset; 752 unsigned char *cp; 753 754 755 offset = begin & ~uspi->s_fmask; 756 begin >>= uspi->s_fshift; 757 for (;;) { 758 if ((offset + size) < uspi->s_fsize) 759 rest = size; 760 else 761 rest = uspi->s_fsize - offset; 762 size -= rest; 763 cp = ubh->bh[begin]->b_data + offset; 764 while ((table[*cp++] & mask) == 0 && --rest) 765 ; 766 if (rest || !size) 767 break; 768 begin++; 769 offset = 0; 770 } 771 return (size + rest); 772 } 773 774 /* 775 * Find a block of the specified size in the specified cylinder group. 776 * @sp: pointer to super block 777 * @ucpi: pointer to cylinder group info 778 * @goal: near which block we want find new one 779 * @count: specified size 780 */ 781 static u64 ufs_bitmap_search(struct super_block *sb, 782 struct ufs_cg_private_info *ucpi, 783 u64 goal, unsigned count) 784 { 785 /* 786 * Bit patterns for identifying fragments in the block map 787 * used as ((map & mask_arr) == want_arr) 788 */ 789 static const int mask_arr[9] = { 790 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff 791 }; 792 static const int want_arr[9] = { 793 0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe 794 }; 795 struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; 796 struct ufs_super_block_first *usb1; 797 struct ufs_cylinder_group *ucg; 798 unsigned start, length, loc; 799 unsigned pos, want, blockmap, mask, end; 800 u64 result; 801 802 UFSD("ENTER, cg %u, goal %llu, count %u\n", ucpi->c_cgx, 803 (unsigned long long)goal, count); 804 805 usb1 = ubh_get_usb_first (uspi); 806 ucg = ubh_get_ucg(UCPI_UBH(ucpi)); 807 808 if (goal) 809 start = ufs_dtogd(uspi, goal) >> 3; 810 else 811 start = ucpi->c_frotor >> 3; 812 813 length = ((uspi->s_fpg + 7) >> 3) - start; 814 loc = ubh_scanc(uspi, UCPI_UBH(ucpi), ucpi->c_freeoff + start, length, 815 (uspi->s_fpb == 8) ? ufs_fragtable_8fpb : ufs_fragtable_other, 816 1 << (count - 1 + (uspi->s_fpb & 7))); 817 if (loc == 0) { 818 length = start + 1; 819 loc = ubh_scanc(uspi, UCPI_UBH(ucpi), ucpi->c_freeoff, length, 820 (uspi->s_fpb == 8) ? ufs_fragtable_8fpb : 821 ufs_fragtable_other, 822 1 << (count - 1 + (uspi->s_fpb & 7))); 823 if (loc == 0) { 824 ufs_error(sb, "ufs_bitmap_search", 825 "bitmap corrupted on cg %u, start %u," 826 " length %u, count %u, freeoff %u\n", 827 ucpi->c_cgx, start, length, count, 828 ucpi->c_freeoff); 829 return INVBLOCK; 830 } 831 start = 0; 832 } 833 result = (start + length - loc) << 3; 834 ucpi->c_frotor = result; 835 836 /* 837 * found the byte in the map 838 */ 839 840 for (end = result + 8; result < end; result += uspi->s_fpb) { 841 blockmap = ubh_blkmap(UCPI_UBH(ucpi), ucpi->c_freeoff, result); 842 blockmap <<= 1; 843 mask = mask_arr[count]; 844 want = want_arr[count]; 845 for (pos = 0; pos <= uspi->s_fpb - count; pos++) { 846 if ((blockmap & mask) == want) { 847 UFSD("EXIT, result %llu\n", 848 (unsigned long long)result); 849 return result + pos; 850 } 851 mask <<= 1; 852 want <<= 1; 853 } 854 } 855 856 ufs_error(sb, "ufs_bitmap_search", "block not in map on cg %u\n", 857 ucpi->c_cgx); 858 UFSD("EXIT (FAILED)\n"); 859 return INVBLOCK; 860 } 861 862 static void ufs_clusteracct(struct super_block * sb, 863 struct ufs_cg_private_info * ucpi, unsigned blkno, int cnt) 864 { 865 struct ufs_sb_private_info * uspi; 866 int i, start, end, forw, back; 867 868 uspi = UFS_SB(sb)->s_uspi; 869 if (uspi->s_contigsumsize <= 0) 870 return; 871 872 if (cnt > 0) 873 ubh_setbit(UCPI_UBH(ucpi), ucpi->c_clusteroff, blkno); 874 else 875 ubh_clrbit(UCPI_UBH(ucpi), ucpi->c_clusteroff, blkno); 876 877 /* 878 * Find the size of the cluster going forward. 879 */ 880 start = blkno + 1; 881 end = start + uspi->s_contigsumsize; 882 if ( end >= ucpi->c_nclusterblks) 883 end = ucpi->c_nclusterblks; 884 i = ubh_find_next_zero_bit (UCPI_UBH(ucpi), ucpi->c_clusteroff, end, start); 885 if (i > end) 886 i = end; 887 forw = i - start; 888 889 /* 890 * Find the size of the cluster going backward. 891 */ 892 start = blkno - 1; 893 end = start - uspi->s_contigsumsize; 894 if (end < 0 ) 895 end = -1; 896 i = ubh_find_last_zero_bit (UCPI_UBH(ucpi), ucpi->c_clusteroff, start, end); 897 if ( i < end) 898 i = end; 899 back = start - i; 900 901 /* 902 * Account for old cluster and the possibly new forward and 903 * back clusters. 904 */ 905 i = back + forw + 1; 906 if (i > uspi->s_contigsumsize) 907 i = uspi->s_contigsumsize; 908 fs32_add(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (i << 2)), cnt); 909 if (back > 0) 910 fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (back << 2)), cnt); 911 if (forw > 0) 912 fs32_sub(sb, (__fs32*)ubh_get_addr(UCPI_UBH(ucpi), ucpi->c_clustersumoff + (forw << 2)), cnt); 913 } 914 915 916 static unsigned char ufs_fragtable_8fpb[] = { 917 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04, 0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08, 918 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10, 919 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 920 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20, 921 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 922 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11, 923 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0A, 924 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04, 0x08, 0x09, 0x09, 0x0A, 0x10, 0x11, 0x20, 0x40, 925 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 926 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11, 927 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09, 928 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21, 929 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0A, 930 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0A, 0x12, 931 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04, 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0C, 932 0x08, 0x09, 0x09, 0x0A, 0x09, 0x09, 0x0A, 0x0C, 0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80, 933 }; 934 935 static unsigned char ufs_fragtable_other[] = { 936 0x00, 0x16, 0x16, 0x2A, 0x16, 0x16, 0x26, 0x4E, 0x16, 0x16, 0x16, 0x3E, 0x2A, 0x3E, 0x4E, 0x8A, 937 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 938 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 939 0x2A, 0x3E, 0x3E, 0x2A, 0x3E, 0x3E, 0x2E, 0x6E, 0x3E, 0x3E, 0x3E, 0x3E, 0x2A, 0x3E, 0x6E, 0xAA, 940 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 941 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 942 0x26, 0x36, 0x36, 0x2E, 0x36, 0x36, 0x26, 0x6E, 0x36, 0x36, 0x36, 0x3E, 0x2E, 0x3E, 0x6E, 0xAE, 943 0x4E, 0x5E, 0x5E, 0x6E, 0x5E, 0x5E, 0x6E, 0x4E, 0x5E, 0x5E, 0x5E, 0x7E, 0x6E, 0x7E, 0x4E, 0xCE, 944 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 945 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 946 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E, 947 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0xBE, 948 0x2A, 0x3E, 0x3E, 0x2A, 0x3E, 0x3E, 0x2E, 0x6E, 0x3E, 0x3E, 0x3E, 0x3E, 0x2A, 0x3E, 0x6E, 0xAA, 949 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0xBE, 950 0x4E, 0x5E, 0x5E, 0x6E, 0x5E, 0x5E, 0x6E, 0x4E, 0x5E, 0x5E, 0x5E, 0x7E, 0x6E, 0x7E, 0x4E, 0xCE, 951 0x8A, 0x9E, 0x9E, 0xAA, 0x9E, 0x9E, 0xAE, 0xCE, 0x9E, 0x9E, 0x9E, 0xBE, 0xAA, 0xBE, 0xCE, 0x8A, 952 }; 953