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