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