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