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