2 * linux/fs/ufs/balloc.c
5 * Daniel Pirkl <daniel.pirkl@email.cz>
6 * Charles University, Faculty of Mathematics and Physics
8 * UFS2 write support Evgeniy Dushistov <dushistov@mail.ru>, 2007
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>
25 #define INVBLOCK ((u64)-1L)
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);
35 * Free 'count' fragments from fragment number 'fragment'
37 void ufs_free_fragments(struct inode
*inode
, u64 fragment
, unsigned count
)
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
;
48 uspi
= UFS_SB(sb
)->s_uspi
;
49 usb1
= ubh_get_usb_first(uspi
);
51 UFSD("ENTER, fragment %llu, count %u\n",
52 (unsigned long long)fragment
, count
);
54 if (ufs_fragnum(fragment
) + count
> uspi
->s_fpg
)
55 ufs_error (sb
, "ufs_free_fragments", "internal error");
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");
66 ucpi
= ufs_load_cylinder (sb
, cgno
);
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
);
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
);
83 ufs_error (sb
, "ufs_free_fragments",
84 "bit already cleared for fragment %u", i
);
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);
94 * Trying to reassemble free fragments into block
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
);
109 fs16_add(sb
, &ubh_cg_blks(ucpi
, cylno
,
110 ufs_cbtorpos(bbase
)), 1);
111 fs32_add(sb
, &ubh_cg_blktot(ucpi
, cylno
), 1);
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 ufs_mark_sb_dirty(sb
);
127 UFSD("EXIT (FAILED)\n");
132 * Free 'count' fragments from fragment number 'fragment' (free whole blocks)
134 void ufs_free_blocks(struct inode
*inode
, u64 fragment
, unsigned count
)
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
;
145 uspi
= UFS_SB(sb
)->s_uspi
;
146 usb1
= ubh_get_usb_first(uspi
);
148 UFSD("ENTER, fragment %llu, count %u\n",
149 (unsigned long long)fragment
, count
);
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
);
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");
168 end_bit
= bit
+ count
;
169 if (end_bit
> uspi
->s_fpg
) {
170 overflow
= bit
+ count
- uspi
->s_fpg
;
175 ucpi
= ufs_load_cylinder (sb
, cgno
);
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
);
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");
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);
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);
197 if (uspi
->fs_magic
!= UFS2_MAGIC
) {
198 unsigned cylno
= ufs_cbtocylno(i
);
200 fs16_add(sb
, &ubh_cg_blks(ucpi
, cylno
,
201 ufs_cbtorpos(i
)), 1);
202 fs32_add(sb
, &ubh_cg_blktot(ucpi
, cylno
), 1);
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
));
217 ufs_mark_sb_dirty(sb
);
225 UFSD("EXIT (FAILED)\n");
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.
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.
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
)
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
;
251 struct buffer_head
*head
, *bh
;
253 UFSD("ENTER, ino %lu, count %u, oldb %llu, newb %llu\n",
255 (unsigned long long)oldb
, (unsigned long long)newb
);
257 BUG_ON(!locked_page
);
258 BUG_ON(!PageLocked(locked_page
));
260 cur_index
= locked_page
->index
;
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
);
266 if (likely(cur_index
!= index
)) {
267 page
= ufs_get_locked_page(mapping
, index
);
268 if (!page
)/* it was truncated */
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
);
279 head
= page_buffers(page
);
282 for (j
= 0; j
< pos
; ++j
)
283 bh
= bh
->b_this_page
;
286 if (unlikely(index
== last_index
))
289 lblock
= blks_per_page
;
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
);
301 if (!buffer_uptodate(bh
)) {
302 ufs_error(inode
->i_sb
, __func__
,
303 "read of block failed\n");
308 UFSD(" change from %llu to %llu, pos %u\n",
309 (unsigned long long)(pos
+ oldb
),
310 (unsigned long long)(pos
+ newb
), pos
);
312 bh
->b_blocknr
= newb
+ pos
;
313 unmap_underlying_metadata(bh
->b_bdev
,
315 mark_buffer_dirty(bh
);
317 bh
= bh
->b_this_page
;
318 } while (bh
!= head
);
320 if (likely(cur_index
!= index
))
321 ufs_put_locked_page(page
);
326 static void ufs_clear_frags(struct inode
*inode
, sector_t beg
, unsigned int n
,
329 struct buffer_head
*bh
;
330 sector_t end
= beg
+ n
;
332 for (; beg
< end
; ++beg
) {
333 bh
= sb_getblk(inode
->i_sb
, beg
);
335 memset(bh
->b_data
, 0, inode
->i_sb
->s_blocksize
);
336 set_buffer_uptodate(bh
);
337 mark_buffer_dirty(bh
);
339 if (IS_SYNC(inode
) || sync
)
340 sync_dirty_buffer(bh
);
345 u64
ufs_new_fragments(struct inode
*inode
, void *p
, u64 fragment
,
346 u64 goal
, unsigned count
, int *err
,
347 struct page
*locked_page
)
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
;
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
);
360 uspi
= UFS_SB(sb
)->s_uspi
;
361 usb1
= ubh_get_usb_first(uspi
);
365 tmp
= ufs_data_ptr_to_cpu(sb
, p
);
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
);
373 oldcount
= ufs_fragnum (fragment
);
374 newcount
= oldcount
+ count
;
377 * Somebody else has just allocated our fragments
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
);
388 if (fragment
< UFS_I(inode
)->i_lastfrag
) {
389 UFSD("EXIT (ALREADY ALLOCATED)\n");
396 UFSD("EXIT (ALREADY ALLOCATED)\n");
403 * There is not enough space for user on the device
405 if (!capable(CAP_SYS_RESOURCE
) && ufs_freespace(uspi
, UFS_MINFREE
) <= 0) {
407 UFSD("EXIT (FAILED)\n");
411 if (goal
>= uspi
->s_size
)
414 cgno
= ufs_inotocg (inode
->i_ino
);
416 cgno
= ufs_dtog(uspi
, goal
);
419 * allocate new fragment
422 result
= ufs_alloc_fragments (inode
, cgno
, goal
, count
, err
);
424 ufs_cpu_to_data_ptr(sb
, p
, result
);
426 UFS_I(inode
)->i_lastfrag
=
427 max(UFS_I(inode
)->i_lastfrag
, fragment
+ count
);
428 ufs_clear_frags(inode
, result
+ oldcount
,
429 newcount
- oldcount
, locked_page
!= NULL
);
432 UFSD("EXIT, result %llu\n", (unsigned long long)result
);
439 result
= ufs_add_fragments (inode
, tmp
, oldcount
, newcount
, err
);
442 UFS_I(inode
)->i_lastfrag
= max(UFS_I(inode
)->i_lastfrag
,
444 ufs_clear_frags(inode
, result
+ oldcount
, newcount
- oldcount
,
445 locked_page
!= NULL
);
447 UFSD("EXIT, result %llu\n", (unsigned long long)result
);
452 * allocate new block and move data
454 switch (fs32_to_cpu(sb
, usb1
->fs_optim
)) {
457 if (uspi
->s_minfree
< 5 || uspi
->cs_total
.cs_nffree
458 > uspi
->s_dsize
* uspi
->s_minfree
/ (2 * 100))
460 usb1
->fs_optim
= cpu_to_fs32(sb
, UFS_OPTTIME
);
463 usb1
->fs_optim
= cpu_to_fs32(sb
, UFS_OPTTIME
);
466 request
= uspi
->s_fpb
;
467 if (uspi
->cs_total
.cs_nffree
< uspi
->s_dsize
*
468 (uspi
->s_minfree
- 2) / 100)
470 usb1
->fs_optim
= cpu_to_fs32(sb
, UFS_OPTTIME
);
473 result
= ufs_alloc_fragments (inode
, cgno
, goal
, request
, err
);
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
);
482 UFS_I(inode
)->i_lastfrag
= max(UFS_I(inode
)->i_lastfrag
,
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
);
493 UFSD("EXIT (FAILED)\n");
497 static u64
ufs_add_fragments(struct inode
*inode
, u64 fragment
,
498 unsigned oldcount
, unsigned newcount
, int *err
)
500 struct super_block
* sb
;
501 struct ufs_sb_private_info
* uspi
;
502 struct ufs_super_block_first
* usb1
;
503 struct ufs_cg_private_info
* ucpi
;
504 struct ufs_cylinder_group
* ucg
;
505 unsigned cgno
, fragno
, fragoff
, count
, fragsize
, i
;
507 UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n",
508 (unsigned long long)fragment
, oldcount
, newcount
);
511 uspi
= UFS_SB(sb
)->s_uspi
;
512 usb1
= ubh_get_usb_first (uspi
);
513 count
= newcount
- oldcount
;
515 cgno
= ufs_dtog(uspi
, fragment
);
516 if (fs32_to_cpu(sb
, UFS_SB(sb
)->fs_cs(cgno
).cs_nffree
) < count
)
518 if ((ufs_fragnum (fragment
) + newcount
) > uspi
->s_fpb
)
520 ucpi
= ufs_load_cylinder (sb
, cgno
);
523 ucg
= ubh_get_ucg (UCPI_UBH(ucpi
));
524 if (!ufs_cg_chkmagic(sb
, ucg
)) {
525 ufs_panic (sb
, "ufs_add_fragments",
526 "internal error, bad magic number on cg %u", cgno
);
530 fragno
= ufs_dtogd(uspi
, fragment
);
531 fragoff
= ufs_fragnum (fragno
);
532 for (i
= oldcount
; i
< newcount
; i
++)
533 if (ubh_isclr (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, fragno
+ i
))
536 * Block can be extended
538 ucg
->cg_time
= cpu_to_fs32(sb
, get_seconds());
539 for (i
= newcount
; i
< (uspi
->s_fpb
- fragoff
); i
++)
540 if (ubh_isclr (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, fragno
+ i
))
542 fragsize
= i
- oldcount
;
543 if (!fs32_to_cpu(sb
, ucg
->cg_frsum
[fragsize
]))
544 ufs_panic (sb
, "ufs_add_fragments",
545 "internal error or corrupted bitmap on cg %u", cgno
);
546 fs32_sub(sb
, &ucg
->cg_frsum
[fragsize
], 1);
547 if (fragsize
!= count
)
548 fs32_add(sb
, &ucg
->cg_frsum
[fragsize
- count
], 1);
549 for (i
= oldcount
; i
< newcount
; i
++)
550 ubh_clrbit (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, fragno
+ i
);
552 fs32_sub(sb
, &ucg
->cg_cs
.cs_nffree
, count
);
553 fs32_sub(sb
, &UFS_SB(sb
)->fs_cs(cgno
).cs_nffree
, count
);
554 uspi
->cs_total
.cs_nffree
-= count
;
556 ubh_mark_buffer_dirty (USPI_UBH(uspi
));
557 ubh_mark_buffer_dirty (UCPI_UBH(ucpi
));
558 if (sb
->s_flags
& MS_SYNCHRONOUS
)
559 ubh_sync_block(UCPI_UBH(ucpi
));
560 ufs_mark_sb_dirty(sb
);
562 UFSD("EXIT, fragment %llu\n", (unsigned long long)fragment
);
567 #define UFS_TEST_FREE_SPACE_CG \
568 ucg = (struct ufs_cylinder_group *) UFS_SB(sb)->s_ucg[cgno]->b_data; \
569 if (fs32_to_cpu(sb, ucg->cg_cs.cs_nbfree)) \
571 for (k = count; k < uspi->s_fpb; k++) \
572 if (fs32_to_cpu(sb, ucg->cg_frsum[k])) \
575 static u64
ufs_alloc_fragments(struct inode
*inode
, unsigned cgno
,
576 u64 goal
, unsigned count
, int *err
)
578 struct super_block
* sb
;
579 struct ufs_sb_private_info
* uspi
;
580 struct ufs_super_block_first
* usb1
;
581 struct ufs_cg_private_info
* ucpi
;
582 struct ufs_cylinder_group
* ucg
;
583 unsigned oldcg
, i
, j
, k
, allocsize
;
586 UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n",
587 inode
->i_ino
, cgno
, (unsigned long long)goal
, count
);
590 uspi
= UFS_SB(sb
)->s_uspi
;
591 usb1
= ubh_get_usb_first(uspi
);
595 * 1. searching on preferred cylinder group
597 UFS_TEST_FREE_SPACE_CG
600 * 2. quadratic rehash
602 for (j
= 1; j
< uspi
->s_ncg
; j
*= 2) {
604 if (cgno
>= uspi
->s_ncg
)
606 UFS_TEST_FREE_SPACE_CG
610 * 3. brute force search
611 * We start at i = 2 ( 0 is checked at 1.step, 1 at 2.step )
613 cgno
= (oldcg
+ 1) % uspi
->s_ncg
;
614 for (j
= 2; j
< uspi
->s_ncg
; j
++) {
616 if (cgno
>= uspi
->s_ncg
)
618 UFS_TEST_FREE_SPACE_CG
621 UFSD("EXIT (FAILED)\n");
625 ucpi
= ufs_load_cylinder (sb
, cgno
);
628 ucg
= ubh_get_ucg (UCPI_UBH(ucpi
));
629 if (!ufs_cg_chkmagic(sb
, ucg
))
630 ufs_panic (sb
, "ufs_alloc_fragments",
631 "internal error, bad magic number on cg %u", cgno
);
632 ucg
->cg_time
= cpu_to_fs32(sb
, get_seconds());
634 if (count
== uspi
->s_fpb
) {
635 result
= ufs_alloccg_block (inode
, ucpi
, goal
, err
);
636 if (result
== INVBLOCK
)
641 for (allocsize
= count
; allocsize
< uspi
->s_fpb
; allocsize
++)
642 if (fs32_to_cpu(sb
, ucg
->cg_frsum
[allocsize
]) != 0)
645 if (allocsize
== uspi
->s_fpb
) {
646 result
= ufs_alloccg_block (inode
, ucpi
, goal
, err
);
647 if (result
== INVBLOCK
)
649 goal
= ufs_dtogd(uspi
, result
);
650 for (i
= count
; i
< uspi
->s_fpb
; i
++)
651 ubh_setbit (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, goal
+ i
);
652 i
= uspi
->s_fpb
- count
;
654 fs32_add(sb
, &ucg
->cg_cs
.cs_nffree
, i
);
655 uspi
->cs_total
.cs_nffree
+= i
;
656 fs32_add(sb
, &UFS_SB(sb
)->fs_cs(cgno
).cs_nffree
, i
);
657 fs32_add(sb
, &ucg
->cg_frsum
[i
], 1);
661 result
= ufs_bitmap_search (sb
, ucpi
, goal
, allocsize
);
662 if (result
== INVBLOCK
)
664 for (i
= 0; i
< count
; i
++)
665 ubh_clrbit (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, result
+ i
);
667 fs32_sub(sb
, &ucg
->cg_cs
.cs_nffree
, count
);
668 uspi
->cs_total
.cs_nffree
-= count
;
669 fs32_sub(sb
, &UFS_SB(sb
)->fs_cs(cgno
).cs_nffree
, count
);
670 fs32_sub(sb
, &ucg
->cg_frsum
[allocsize
], 1);
672 if (count
!= allocsize
)
673 fs32_add(sb
, &ucg
->cg_frsum
[allocsize
- count
], 1);
676 ubh_mark_buffer_dirty (USPI_UBH(uspi
));
677 ubh_mark_buffer_dirty (UCPI_UBH(ucpi
));
678 if (sb
->s_flags
& MS_SYNCHRONOUS
)
679 ubh_sync_block(UCPI_UBH(ucpi
));
680 ufs_mark_sb_dirty(sb
);
682 result
+= cgno
* uspi
->s_fpg
;
683 UFSD("EXIT3, result %llu\n", (unsigned long long)result
);
687 static u64
ufs_alloccg_block(struct inode
*inode
,
688 struct ufs_cg_private_info
*ucpi
,
691 struct super_block
* sb
;
692 struct ufs_sb_private_info
* uspi
;
693 struct ufs_super_block_first
* usb1
;
694 struct ufs_cylinder_group
* ucg
;
697 UFSD("ENTER, goal %llu\n", (unsigned long long)goal
);
700 uspi
= UFS_SB(sb
)->s_uspi
;
701 usb1
= ubh_get_usb_first(uspi
);
702 ucg
= ubh_get_ucg(UCPI_UBH(ucpi
));
705 goal
= ucpi
->c_rotor
;
708 goal
= ufs_blknum (goal
);
709 goal
= ufs_dtogd(uspi
, goal
);
712 * If the requested block is available, use it.
714 if (ubh_isblockset(UCPI_UBH(ucpi
), ucpi
->c_freeoff
, ufs_fragstoblks(goal
))) {
720 result
= ufs_bitmap_search (sb
, ucpi
, goal
, uspi
->s_fpb
);
721 if (result
== INVBLOCK
)
723 ucpi
->c_rotor
= result
;
725 blkno
= ufs_fragstoblks(result
);
726 ubh_clrblock (UCPI_UBH(ucpi
), ucpi
->c_freeoff
, blkno
);
727 if ((UFS_SB(sb
)->s_flags
& UFS_CG_MASK
) == UFS_CG_44BSD
)
728 ufs_clusteracct (sb
, ucpi
, blkno
, -1);
730 fs32_sub(sb
, &ucg
->cg_cs
.cs_nbfree
, 1);
731 uspi
->cs_total
.cs_nbfree
--;
732 fs32_sub(sb
, &UFS_SB(sb
)->fs_cs(ucpi
->c_cgx
).cs_nbfree
, 1);
734 if (uspi
->fs_magic
!= UFS2_MAGIC
) {
735 unsigned cylno
= ufs_cbtocylno((unsigned)result
);
737 fs16_sub(sb
, &ubh_cg_blks(ucpi
, cylno
,
738 ufs_cbtorpos((unsigned)result
)), 1);
739 fs32_sub(sb
, &ubh_cg_blktot(ucpi
, cylno
), 1);
742 UFSD("EXIT, result %llu\n", (unsigned long long)result
);
747 static unsigned ubh_scanc(struct ufs_sb_private_info
*uspi
,
748 struct ufs_buffer_head
*ubh
,
749 unsigned begin
, unsigned size
,
750 unsigned char *table
, unsigned char mask
)
752 unsigned rest
, offset
;
756 offset
= begin
& ~uspi
->s_fmask
;
757 begin
>>= uspi
->s_fshift
;
759 if ((offset
+ size
) < uspi
->s_fsize
)
762 rest
= uspi
->s_fsize
- offset
;
764 cp
= ubh
->bh
[begin
]->b_data
+ offset
;
765 while ((table
[*cp
++] & mask
) == 0 && --rest
)
772 return (size
+ rest
);
776 * Find a block of the specified size in the specified cylinder group.
777 * @sp: pointer to super block
778 * @ucpi: pointer to cylinder group info
779 * @goal: near which block we want find new one
780 * @count: specified size
782 static u64
ufs_bitmap_search(struct super_block
*sb
,
783 struct ufs_cg_private_info
*ucpi
,
784 u64 goal
, unsigned count
)
787 * Bit patterns for identifying fragments in the block map
788 * used as ((map & mask_arr) == want_arr)
790 static const int mask_arr
[9] = {
791 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff
793 static const int want_arr
[9] = {
794 0x0, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe
796 struct ufs_sb_private_info
*uspi
= UFS_SB(sb
)->s_uspi
;
797 struct ufs_super_block_first
*usb1
;
798 struct ufs_cylinder_group
*ucg
;
799 unsigned start
, length
, loc
;
800 unsigned pos
, want
, blockmap
, mask
, end
;
803 UFSD("ENTER, cg %u, goal %llu, count %u\n", ucpi
->c_cgx
,
804 (unsigned long long)goal
, count
);
806 usb1
= ubh_get_usb_first (uspi
);
807 ucg
= ubh_get_ucg(UCPI_UBH(ucpi
));
810 start
= ufs_dtogd(uspi
, goal
) >> 3;
812 start
= ucpi
->c_frotor
>> 3;
814 length
= ((uspi
->s_fpg
+ 7) >> 3) - start
;
815 loc
= ubh_scanc(uspi
, UCPI_UBH(ucpi
), ucpi
->c_freeoff
+ start
, length
,
816 (uspi
->s_fpb
== 8) ? ufs_fragtable_8fpb
: ufs_fragtable_other
,
817 1 << (count
- 1 + (uspi
->s_fpb
& 7)));
820 loc
= ubh_scanc(uspi
, UCPI_UBH(ucpi
), ucpi
->c_freeoff
, length
,
821 (uspi
->s_fpb
== 8) ? ufs_fragtable_8fpb
:
823 1 << (count
- 1 + (uspi
->s_fpb
& 7)));
825 ufs_error(sb
, "ufs_bitmap_search",
826 "bitmap corrupted on cg %u, start %u,"
827 " length %u, count %u, freeoff %u\n",
828 ucpi
->c_cgx
, start
, length
, count
,
834 result
= (start
+ length
- loc
) << 3;
835 ucpi
->c_frotor
= result
;
838 * found the byte in the map
841 for (end
= result
+ 8; result
< end
; result
+= uspi
->s_fpb
) {
842 blockmap
= ubh_blkmap(UCPI_UBH(ucpi
), ucpi
->c_freeoff
, result
);
844 mask
= mask_arr
[count
];
845 want
= want_arr
[count
];
846 for (pos
= 0; pos
<= uspi
->s_fpb
- count
; pos
++) {
847 if ((blockmap
& mask
) == want
) {
848 UFSD("EXIT, result %llu\n",
849 (unsigned long long)result
);
857 ufs_error(sb
, "ufs_bitmap_search", "block not in map on cg %u\n",
859 UFSD("EXIT (FAILED)\n");
863 static void ufs_clusteracct(struct super_block
* sb
,
864 struct ufs_cg_private_info
* ucpi
, unsigned blkno
, int cnt
)
866 struct ufs_sb_private_info
* uspi
;
867 int i
, start
, end
, forw
, back
;
869 uspi
= UFS_SB(sb
)->s_uspi
;
870 if (uspi
->s_contigsumsize
<= 0)
874 ubh_setbit(UCPI_UBH(ucpi
), ucpi
->c_clusteroff
, blkno
);
876 ubh_clrbit(UCPI_UBH(ucpi
), ucpi
->c_clusteroff
, blkno
);
879 * Find the size of the cluster going forward.
882 end
= start
+ uspi
->s_contigsumsize
;
883 if ( end
>= ucpi
->c_nclusterblks
)
884 end
= ucpi
->c_nclusterblks
;
885 i
= ubh_find_next_zero_bit (UCPI_UBH(ucpi
), ucpi
->c_clusteroff
, end
, start
);
891 * Find the size of the cluster going backward.
894 end
= start
- uspi
->s_contigsumsize
;
897 i
= ubh_find_last_zero_bit (UCPI_UBH(ucpi
), ucpi
->c_clusteroff
, start
, end
);
903 * Account for old cluster and the possibly new forward and
907 if (i
> uspi
->s_contigsumsize
)
908 i
= uspi
->s_contigsumsize
;
909 fs32_add(sb
, (__fs32
*)ubh_get_addr(UCPI_UBH(ucpi
), ucpi
->c_clustersumoff
+ (i
<< 2)), cnt
);
911 fs32_sub(sb
, (__fs32
*)ubh_get_addr(UCPI_UBH(ucpi
), ucpi
->c_clustersumoff
+ (back
<< 2)), cnt
);
913 fs32_sub(sb
, (__fs32
*)ubh_get_addr(UCPI_UBH(ucpi
), ucpi
->c_clustersumoff
+ (forw
<< 2)), cnt
);
917 static unsigned char ufs_fragtable_8fpb
[] = {
918 0x00, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x04, 0x01, 0x01, 0x01, 0x03, 0x02, 0x03, 0x04, 0x08,
919 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x02, 0x03, 0x03, 0x02, 0x04, 0x05, 0x08, 0x10,
920 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
921 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x04, 0x05, 0x05, 0x06, 0x08, 0x09, 0x10, 0x20,
922 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
923 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
924 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0A,
925 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04, 0x08, 0x09, 0x09, 0x0A, 0x10, 0x11, 0x20, 0x40,
926 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
927 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x09, 0x11,
928 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x03, 0x05, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x05, 0x09,
929 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x05, 0x05, 0x05, 0x07, 0x09, 0x09, 0x11, 0x21,
930 0x02, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x03, 0x03, 0x03, 0x03, 0x02, 0x03, 0x06, 0x0A,
931 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x02, 0x03, 0x03, 0x02, 0x06, 0x07, 0x0A, 0x12,
932 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x04, 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x04, 0x0C,
933 0x08, 0x09, 0x09, 0x0A, 0x09, 0x09, 0x0A, 0x0C, 0x10, 0x11, 0x11, 0x12, 0x20, 0x21, 0x40, 0x80,
936 static unsigned char ufs_fragtable_other
[] = {
937 0x00, 0x16, 0x16, 0x2A, 0x16, 0x16, 0x26, 0x4E, 0x16, 0x16, 0x16, 0x3E, 0x2A, 0x3E, 0x4E, 0x8A,
938 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E,
939 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E,
940 0x2A, 0x3E, 0x3E, 0x2A, 0x3E, 0x3E, 0x2E, 0x6E, 0x3E, 0x3E, 0x3E, 0x3E, 0x2A, 0x3E, 0x6E, 0xAA,
941 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E,
942 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E,
943 0x26, 0x36, 0x36, 0x2E, 0x36, 0x36, 0x26, 0x6E, 0x36, 0x36, 0x36, 0x3E, 0x2E, 0x3E, 0x6E, 0xAE,
944 0x4E, 0x5E, 0x5E, 0x6E, 0x5E, 0x5E, 0x6E, 0x4E, 0x5E, 0x5E, 0x5E, 0x7E, 0x6E, 0x7E, 0x4E, 0xCE,
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 0x16, 0x16, 0x16, 0x3E, 0x16, 0x16, 0x36, 0x5E, 0x16, 0x16, 0x16, 0x3E, 0x3E, 0x3E, 0x5E, 0x9E,
948 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0xBE,
949 0x2A, 0x3E, 0x3E, 0x2A, 0x3E, 0x3E, 0x2E, 0x6E, 0x3E, 0x3E, 0x3E, 0x3E, 0x2A, 0x3E, 0x6E, 0xAA,
950 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x3E, 0x7E, 0xBE,
951 0x4E, 0x5E, 0x5E, 0x6E, 0x5E, 0x5E, 0x6E, 0x4E, 0x5E, 0x5E, 0x5E, 0x7E, 0x6E, 0x7E, 0x4E, 0xCE,
952 0x8A, 0x9E, 0x9E, 0xAA, 0x9E, 0x9E, 0xAE, 0xCE, 0x9E, 0x9E, 0x9E, 0xBE, 0xAA, 0xBE, 0xCE, 0x8A,