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