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