Linux Audio

Check our new training course

Loading...
v5.4
   1/*
   2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
   3 */
   4/* Reiserfs block (de)allocator, bitmap-based. */
   5
   6#include <linux/time.h>
   7#include "reiserfs.h"
   8#include <linux/errno.h>
   9#include <linux/buffer_head.h>
  10#include <linux/kernel.h>
  11#include <linux/pagemap.h>
  12#include <linux/vmalloc.h>
 
 
  13#include <linux/quotaops.h>
  14#include <linux/seq_file.h>
  15
  16#define PREALLOCATION_SIZE 9
  17
  18/* different reiserfs block allocator options */
  19
  20#define SB_ALLOC_OPTS(s) (REISERFS_SB(s)->s_alloc_options.bits)
  21
  22#define  _ALLOC_concentrating_formatted_nodes 0
  23#define  _ALLOC_displacing_large_files 1
  24#define  _ALLOC_displacing_new_packing_localities 2
  25#define  _ALLOC_old_hashed_relocation 3
  26#define  _ALLOC_new_hashed_relocation 4
  27#define  _ALLOC_skip_busy 5
  28#define  _ALLOC_displace_based_on_dirid 6
  29#define  _ALLOC_hashed_formatted_nodes 7
  30#define  _ALLOC_old_way 8
  31#define  _ALLOC_hundredth_slices 9
  32#define  _ALLOC_dirid_groups 10
  33#define  _ALLOC_oid_groups 11
  34#define  _ALLOC_packing_groups 12
  35
  36#define  concentrating_formatted_nodes(s)	test_bit(_ALLOC_concentrating_formatted_nodes, &SB_ALLOC_OPTS(s))
  37#define  displacing_large_files(s)		test_bit(_ALLOC_displacing_large_files, &SB_ALLOC_OPTS(s))
  38#define  displacing_new_packing_localities(s)	test_bit(_ALLOC_displacing_new_packing_localities, &SB_ALLOC_OPTS(s))
  39
  40#define SET_OPTION(optname) \
  41   do { \
  42	reiserfs_info(s, "block allocator option \"%s\" is set", #optname); \
  43	set_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s)); \
  44    } while(0)
  45#define TEST_OPTION(optname, s) \
  46    test_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s))
  47
  48static inline void get_bit_address(struct super_block *s,
  49				   b_blocknr_t block,
  50				   unsigned int *bmap_nr,
  51				   unsigned int *offset)
  52{
  53	/*
  54	 * It is in the bitmap block number equal to the block
  55	 * number divided by the number of bits in a block.
  56	 */
  57	*bmap_nr = block >> (s->s_blocksize_bits + 3);
  58	/* Within that bitmap block it is located at bit offset *offset. */
  59	*offset = block & ((s->s_blocksize << 3) - 1);
  60}
  61
  62int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value)
  63{
  64	unsigned int bmap, offset;
  65	unsigned int bmap_count = reiserfs_bmap_count(s);
  66
  67	if (block == 0 || block >= SB_BLOCK_COUNT(s)) {
  68		reiserfs_error(s, "vs-4010",
  69			       "block number is out of range %lu (%u)",
  70			       block, SB_BLOCK_COUNT(s));
  71		return 0;
  72	}
  73
  74	get_bit_address(s, block, &bmap, &offset);
  75
  76	/*
  77	 * Old format filesystem? Unlikely, but the bitmaps are all
  78	 * up front so we need to account for it.
  79	 */
  80	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
  81			      &REISERFS_SB(s)->s_properties))) {
  82		b_blocknr_t bmap1 = REISERFS_SB(s)->s_sbh->b_blocknr + 1;
  83		if (block >= bmap1 &&
  84		    block <= bmap1 + bmap_count) {
  85			reiserfs_error(s, "vs-4019", "bitmap block %lu(%u) "
  86				       "can't be freed or reused",
  87				       block, bmap_count);
  88			return 0;
  89		}
  90	} else {
  91		if (offset == 0) {
  92			reiserfs_error(s, "vs-4020", "bitmap block %lu(%u) "
  93				       "can't be freed or reused",
  94				       block, bmap_count);
  95			return 0;
  96		}
  97	}
  98
  99	if (bmap >= bmap_count) {
 100		reiserfs_error(s, "vs-4030", "bitmap for requested block "
 101			       "is out of range: block=%lu, bitmap_nr=%u",
 102			       block, bmap);
 103		return 0;
 104	}
 105
 106	if (bit_value == 0 && block == SB_ROOT_BLOCK(s)) {
 107		reiserfs_error(s, "vs-4050", "this is root block (%u), "
 108			       "it must be busy", SB_ROOT_BLOCK(s));
 109		return 0;
 110	}
 111
 112	return 1;
 113}
 114
 115/*
 116 * Searches in journal structures for a given block number (bmap, off).
 117 * If block is found in reiserfs journal it suggests next free block
 118 * candidate to test.
 119 */
 120static inline int is_block_in_journal(struct super_block *s, unsigned int bmap,
 121				      int off, int *next)
 122{
 123	b_blocknr_t tmp;
 124
 125	if (reiserfs_in_journal(s, bmap, off, 1, &tmp)) {
 126		if (tmp) {	/* hint supplied */
 127			*next = tmp;
 128			PROC_INFO_INC(s, scan_bitmap.in_journal_hint);
 129		} else {
 130			(*next) = off + 1;  /* inc offset to avoid looping. */
 131			PROC_INFO_INC(s, scan_bitmap.in_journal_nohint);
 132		}
 133		PROC_INFO_INC(s, scan_bitmap.retry);
 134		return 1;
 135	}
 136	return 0;
 137}
 138
 139/*
 140 * Searches for a window of zero bits with given minimum and maximum
 141 * lengths in one bitmap block
 142 */
 143static int scan_bitmap_block(struct reiserfs_transaction_handle *th,
 144			     unsigned int bmap_n, int *beg, int boundary,
 145			     int min, int max, int unfm)
 146{
 147	struct super_block *s = th->t_super;
 148	struct reiserfs_bitmap_info *bi = &SB_AP_BITMAP(s)[bmap_n];
 149	struct buffer_head *bh;
 150	int end, next;
 151	int org = *beg;
 152
 153	BUG_ON(!th->t_trans_id);
 
 154	RFALSE(bmap_n >= reiserfs_bmap_count(s), "Bitmap %u is out of "
 155	       "range (0..%u)", bmap_n, reiserfs_bmap_count(s) - 1);
 156	PROC_INFO_INC(s, scan_bitmap.bmap);
 
 
 
 
 157
 158	if (!bi) {
 159		reiserfs_error(s, "jdm-4055", "NULL bitmap info pointer "
 160			       "for bitmap %d", bmap_n);
 161		return 0;
 162	}
 163
 164	bh = reiserfs_read_bitmap_block(s, bmap_n);
 165	if (bh == NULL)
 166		return 0;
 167
 168	while (1) {
 169cont:
 170		if (bi->free_count < min) {
 171			brelse(bh);
 172			return 0;	/* No free blocks in this bitmap */
 173		}
 174
 175		/* search for a first zero bit -- beginning of a window */
 176		*beg = reiserfs_find_next_zero_le_bit
 177		    ((unsigned long *)(bh->b_data), boundary, *beg);
 178
 179		/*
 180		 * search for a zero bit fails or the rest of bitmap block
 181		 * cannot contain a zero window of minimum size
 182		 */
 183		if (*beg + min > boundary) {
 184			brelse(bh);
 185			return 0;
 186		}
 187
 188		if (unfm && is_block_in_journal(s, bmap_n, *beg, beg))
 189			continue;
 190		/* first zero bit found; we check next bits */
 191		for (end = *beg + 1;; end++) {
 192			if (end >= *beg + max || end >= boundary
 193			    || reiserfs_test_le_bit(end, bh->b_data)) {
 194				next = end;
 195				break;
 196			}
 197
 198			/*
 199			 * finding the other end of zero bit window requires
 200			 * looking into journal structures (in case of
 201			 * searching for free blocks for unformatted nodes)
 202			 */
 203			if (unfm && is_block_in_journal(s, bmap_n, end, &next))
 204				break;
 205		}
 206
 207		/*
 208		 * now (*beg) points to beginning of zero bits window,
 209		 * (end) points to one bit after the window end
 210		 */
 211
 212		/* found window of proper size */
 213		if (end - *beg >= min) {
 214			int i;
 215			reiserfs_prepare_for_journal(s, bh, 1);
 216			/*
 217			 * try to set all blocks used checking are
 218			 * they still free
 219			 */
 220			for (i = *beg; i < end; i++) {
 221				/* Don't check in journal again. */
 222				if (reiserfs_test_and_set_le_bit
 223				    (i, bh->b_data)) {
 224					/*
 225					 * bit was set by another process while
 226					 * we slept in prepare_for_journal()
 227					 */
 228					PROC_INFO_INC(s, scan_bitmap.stolen);
 229
 230					/*
 231					 * we can continue with smaller set
 232					 * of allocated blocks, if length of
 233					 * this set is more or equal to `min'
 234					 */
 235					if (i >= *beg + min) {
 236						end = i;
 237						break;
 238					}
 239
 240					/*
 241					 * otherwise we clear all bit
 242					 * were set ...
 243					 */
 244					while (--i >= *beg)
 245						reiserfs_clear_le_bit
 246						    (i, bh->b_data);
 247					reiserfs_restore_prepared_buffer(s, bh);
 248					*beg = org;
 249
 250					/*
 251					 * Search again in current block
 252					 * from beginning
 253					 */
 254					goto cont;
 255				}
 256			}
 257			bi->free_count -= (end - *beg);
 258			journal_mark_dirty(th, bh);
 259			brelse(bh);
 260
 261			/* free block count calculation */
 262			reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
 263						     1);
 264			PUT_SB_FREE_BLOCKS(s, SB_FREE_BLOCKS(s) - (end - *beg));
 265			journal_mark_dirty(th, SB_BUFFER_WITH_SB(s));
 266
 267			return end - (*beg);
 268		} else {
 269			*beg = next;
 270		}
 271	}
 272}
 273
 274static int bmap_hash_id(struct super_block *s, u32 id)
 275{
 276	char *hash_in = NULL;
 277	unsigned long hash;
 278	unsigned bm;
 279
 280	if (id <= 2) {
 281		bm = 1;
 282	} else {
 283		hash_in = (char *)(&id);
 284		hash = keyed_hash(hash_in, 4);
 285		bm = hash % reiserfs_bmap_count(s);
 286		if (!bm)
 287			bm = 1;
 288	}
 289	/* this can only be true when SB_BMAP_NR = 1 */
 290	if (bm >= reiserfs_bmap_count(s))
 291		bm = 0;
 292	return bm;
 293}
 294
 295/*
 296 * hashes the id and then returns > 0 if the block group for the
 297 * corresponding hash is full
 298 */
 299static inline int block_group_used(struct super_block *s, u32 id)
 300{
 301	int bm = bmap_hash_id(s, id);
 302	struct reiserfs_bitmap_info *info = &SB_AP_BITMAP(s)[bm];
 303
 304	/*
 305	 * If we don't have cached information on this bitmap block, we're
 306	 * going to have to load it later anyway. Loading it here allows us
 307	 * to make a better decision. This favors long-term performance gain
 308	 * with a better on-disk layout vs. a short term gain of skipping the
 309	 * read and potentially having a bad placement.
 310	 */
 311	if (info->free_count == UINT_MAX) {
 312		struct buffer_head *bh = reiserfs_read_bitmap_block(s, bm);
 313		brelse(bh);
 314	}
 315
 316	if (info->free_count > ((s->s_blocksize << 3) * 60 / 100)) {
 317		return 0;
 318	}
 319	return 1;
 320}
 321
 322/*
 323 * the packing is returned in disk byte order
 324 */
 325__le32 reiserfs_choose_packing(struct inode * dir)
 326{
 327	__le32 packing;
 328	if (TEST_OPTION(packing_groups, dir->i_sb)) {
 329		u32 parent_dir = le32_to_cpu(INODE_PKEY(dir)->k_dir_id);
 330		/*
 331		 * some versions of reiserfsck expect packing locality 1 to be
 332		 * special
 333		 */
 334		if (parent_dir == 1 || block_group_used(dir->i_sb, parent_dir))
 335			packing = INODE_PKEY(dir)->k_objectid;
 336		else
 337			packing = INODE_PKEY(dir)->k_dir_id;
 338	} else
 339		packing = INODE_PKEY(dir)->k_objectid;
 340	return packing;
 341}
 342
 343/*
 344 * Tries to find contiguous zero bit window (given size) in given region of
 345 * bitmap and place new blocks there. Returns number of allocated blocks.
 346 */
 347static int scan_bitmap(struct reiserfs_transaction_handle *th,
 348		       b_blocknr_t * start, b_blocknr_t finish,
 349		       int min, int max, int unfm, sector_t file_block)
 350{
 351	int nr_allocated = 0;
 352	struct super_block *s = th->t_super;
 
 
 
 353	unsigned int bm, off;
 354	unsigned int end_bm, end_off;
 355	unsigned int off_max = s->s_blocksize << 3;
 356
 357	BUG_ON(!th->t_trans_id);
 358	PROC_INFO_INC(s, scan_bitmap.call);
 359
 360	/* No point in looking for more free blocks */
 361	if (SB_FREE_BLOCKS(s) <= 0)
 362		return 0;
 363
 364	get_bit_address(s, *start, &bm, &off);
 365	get_bit_address(s, finish, &end_bm, &end_off);
 366	if (bm > reiserfs_bmap_count(s))
 367		return 0;
 368	if (end_bm > reiserfs_bmap_count(s))
 369		end_bm = reiserfs_bmap_count(s);
 370
 371	/*
 372	 * When the bitmap is more than 10% free, anyone can allocate.
 373	 * When it's less than 10% free, only files that already use the
 374	 * bitmap are allowed. Once we pass 80% full, this restriction
 375	 * is lifted.
 376	 *
 377	 * We do this so that files that grow later still have space close to
 378	 * their original allocation. This improves locality, and presumably
 379	 * performance as a result.
 380	 *
 381	 * This is only an allocation policy and does not make up for getting a
 382	 * bad hint. Decent hinting must be implemented for this to work well.
 383	 */
 384	if (TEST_OPTION(skip_busy, s)
 385	    && SB_FREE_BLOCKS(s) > SB_BLOCK_COUNT(s) / 20) {
 386		for (; bm < end_bm; bm++, off = 0) {
 387			if ((off && (!unfm || (file_block != 0)))
 388			    || SB_AP_BITMAP(s)[bm].free_count >
 389			    (s->s_blocksize << 3) / 10)
 390				nr_allocated =
 391				    scan_bitmap_block(th, bm, &off, off_max,
 392						      min, max, unfm);
 393			if (nr_allocated)
 394				goto ret;
 395		}
 396		/* we know from above that start is a reasonable number */
 397		get_bit_address(s, *start, &bm, &off);
 398	}
 399
 400	for (; bm < end_bm; bm++, off = 0) {
 401		nr_allocated =
 402		    scan_bitmap_block(th, bm, &off, off_max, min, max, unfm);
 403		if (nr_allocated)
 404			goto ret;
 405	}
 406
 407	nr_allocated =
 408	    scan_bitmap_block(th, bm, &off, end_off + 1, min, max, unfm);
 409
 410ret:
 411	*start = bm * off_max + off;
 412	return nr_allocated;
 413
 414}
 415
 416static void _reiserfs_free_block(struct reiserfs_transaction_handle *th,
 417				 struct inode *inode, b_blocknr_t block,
 418				 int for_unformatted)
 419{
 420	struct super_block *s = th->t_super;
 421	struct reiserfs_super_block *rs;
 422	struct buffer_head *sbh, *bmbh;
 423	struct reiserfs_bitmap_info *apbi;
 424	unsigned int nr, offset;
 425
 426	BUG_ON(!th->t_trans_id);
 
 427	PROC_INFO_INC(s, free_block);
 
 428	rs = SB_DISK_SUPER_BLOCK(s);
 429	sbh = SB_BUFFER_WITH_SB(s);
 430	apbi = SB_AP_BITMAP(s);
 431
 432	get_bit_address(s, block, &nr, &offset);
 433
 434	if (nr >= reiserfs_bmap_count(s)) {
 435		reiserfs_error(s, "vs-4075", "block %lu is out of range",
 436			       block);
 437		return;
 438	}
 439
 440	bmbh = reiserfs_read_bitmap_block(s, nr);
 441	if (!bmbh)
 442		return;
 443
 444	reiserfs_prepare_for_journal(s, bmbh, 1);
 445
 446	/* clear bit for the given block in bit map */
 447	if (!reiserfs_test_and_clear_le_bit(offset, bmbh->b_data)) {
 448		reiserfs_error(s, "vs-4080",
 449			       "block %lu: bit already cleared", block);
 450	}
 451	apbi[nr].free_count++;
 452	journal_mark_dirty(th, bmbh);
 453	brelse(bmbh);
 454
 455	reiserfs_prepare_for_journal(s, sbh, 1);
 456	/* update super block */
 457	set_sb_free_blocks(rs, sb_free_blocks(rs) + 1);
 458
 459	journal_mark_dirty(th, sbh);
 460	if (for_unformatted) {
 461		int depth = reiserfs_write_unlock_nested(s);
 462		dquot_free_block_nodirty(inode, 1);
 463		reiserfs_write_lock_nested(s, depth);
 464	}
 465}
 466
 467void reiserfs_free_block(struct reiserfs_transaction_handle *th,
 468			 struct inode *inode, b_blocknr_t block,
 469			 int for_unformatted)
 470{
 471	struct super_block *s = th->t_super;
 472
 473	BUG_ON(!th->t_trans_id);
 
 474	RFALSE(!s, "vs-4061: trying to free block on nonexistent device");
 475	if (!is_reusable(s, block, 1))
 476		return;
 477
 478	if (block > sb_block_count(REISERFS_SB(s)->s_rs)) {
 479		reiserfs_error(th->t_super, "bitmap-4072",
 480			       "Trying to free block outside file system "
 481			       "boundaries (%lu > %lu)",
 482			       block, sb_block_count(REISERFS_SB(s)->s_rs));
 483		return;
 484	}
 485	/* mark it before we clear it, just in case */
 486	journal_mark_freed(th, s, block);
 487	_reiserfs_free_block(th, inode, block, for_unformatted);
 488}
 489
 490/* preallocated blocks don't need to be run through journal_mark_freed */
 491static void reiserfs_free_prealloc_block(struct reiserfs_transaction_handle *th,
 492					 struct inode *inode, b_blocknr_t block)
 493{
 494	BUG_ON(!th->t_trans_id);
 495	RFALSE(!th->t_super,
 496	       "vs-4060: trying to free block on nonexistent device");
 497	if (!is_reusable(th->t_super, block, 1))
 498		return;
 499	_reiserfs_free_block(th, inode, block, 1);
 500}
 501
 502static void __discard_prealloc(struct reiserfs_transaction_handle *th,
 503			       struct reiserfs_inode_info *ei)
 504{
 505	unsigned long save = ei->i_prealloc_block;
 506	int dirty = 0;
 507	struct inode *inode = &ei->vfs_inode;
 508
 509	BUG_ON(!th->t_trans_id);
 510#ifdef CONFIG_REISERFS_CHECK
 511	if (ei->i_prealloc_count < 0)
 512		reiserfs_error(th->t_super, "zam-4001",
 513			       "inode has negative prealloc blocks count.");
 514#endif
 515	while (ei->i_prealloc_count > 0) {
 516		b_blocknr_t block_to_free;
 517
 518		/*
 519		 * reiserfs_free_prealloc_block can drop the write lock,
 520		 * which could allow another caller to free the same block.
 521		 * We can protect against it by modifying the prealloc
 522		 * state before calling it.
 523		 */
 524		block_to_free = ei->i_prealloc_block++;
 525		ei->i_prealloc_count--;
 526		reiserfs_free_prealloc_block(th, inode, block_to_free);
 527		dirty = 1;
 528	}
 529	if (dirty)
 530		reiserfs_update_sd(th, inode);
 531	ei->i_prealloc_block = save;
 532	list_del_init(&ei->i_prealloc_list);
 533}
 534
 535/* FIXME: It should be inline function */
 536void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
 537			       struct inode *inode)
 538{
 539	struct reiserfs_inode_info *ei = REISERFS_I(inode);
 540
 541	BUG_ON(!th->t_trans_id);
 542	if (ei->i_prealloc_count)
 543		__discard_prealloc(th, ei);
 544}
 545
 546void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th)
 547{
 548	struct list_head *plist = &SB_JOURNAL(th->t_super)->j_prealloc_list;
 549
 550	BUG_ON(!th->t_trans_id);
 
 551	while (!list_empty(plist)) {
 552		struct reiserfs_inode_info *ei;
 553		ei = list_entry(plist->next, struct reiserfs_inode_info,
 554				i_prealloc_list);
 555#ifdef CONFIG_REISERFS_CHECK
 556		if (!ei->i_prealloc_count) {
 557			reiserfs_error(th->t_super, "zam-4001",
 558				       "inode is in prealloc list but has "
 559				       "no preallocated blocks.");
 560		}
 561#endif
 562		__discard_prealloc(th, ei);
 563	}
 564}
 565
 566void reiserfs_init_alloc_options(struct super_block *s)
 567{
 568	set_bit(_ALLOC_skip_busy, &SB_ALLOC_OPTS(s));
 569	set_bit(_ALLOC_dirid_groups, &SB_ALLOC_OPTS(s));
 570	set_bit(_ALLOC_packing_groups, &SB_ALLOC_OPTS(s));
 571}
 572
 573/* block allocator related options are parsed here */
 574int reiserfs_parse_alloc_options(struct super_block *s, char *options)
 575{
 576	char *this_char, *value;
 577
 578	/* clear default settings */
 579	REISERFS_SB(s)->s_alloc_options.bits = 0;
 580
 581	while ((this_char = strsep(&options, ":")) != NULL) {
 582		if ((value = strchr(this_char, '=')) != NULL)
 583			*value++ = 0;
 584
 585		if (!strcmp(this_char, "concentrating_formatted_nodes")) {
 586			int temp;
 587			SET_OPTION(concentrating_formatted_nodes);
 588			temp = (value
 589				&& *value) ? simple_strtoul(value, &value,
 590							    0) : 10;
 591			if (temp <= 0 || temp > 100) {
 592				REISERFS_SB(s)->s_alloc_options.border = 10;
 593			} else {
 594				REISERFS_SB(s)->s_alloc_options.border =
 595				    100 / temp;
 596			}
 597			continue;
 598		}
 599		if (!strcmp(this_char, "displacing_large_files")) {
 600			SET_OPTION(displacing_large_files);
 601			REISERFS_SB(s)->s_alloc_options.large_file_size =
 602			    (value
 603			     && *value) ? simple_strtoul(value, &value, 0) : 16;
 604			continue;
 605		}
 606		if (!strcmp(this_char, "displacing_new_packing_localities")) {
 607			SET_OPTION(displacing_new_packing_localities);
 608			continue;
 609		}
 610
 611		if (!strcmp(this_char, "old_hashed_relocation")) {
 612			SET_OPTION(old_hashed_relocation);
 613			continue;
 614		}
 615
 616		if (!strcmp(this_char, "new_hashed_relocation")) {
 617			SET_OPTION(new_hashed_relocation);
 618			continue;
 619		}
 620
 621		if (!strcmp(this_char, "dirid_groups")) {
 622			SET_OPTION(dirid_groups);
 623			continue;
 624		}
 625		if (!strcmp(this_char, "oid_groups")) {
 626			SET_OPTION(oid_groups);
 627			continue;
 628		}
 629		if (!strcmp(this_char, "packing_groups")) {
 630			SET_OPTION(packing_groups);
 631			continue;
 632		}
 633		if (!strcmp(this_char, "hashed_formatted_nodes")) {
 634			SET_OPTION(hashed_formatted_nodes);
 635			continue;
 636		}
 637
 638		if (!strcmp(this_char, "skip_busy")) {
 639			SET_OPTION(skip_busy);
 640			continue;
 641		}
 642
 643		if (!strcmp(this_char, "hundredth_slices")) {
 644			SET_OPTION(hundredth_slices);
 645			continue;
 646		}
 647
 648		if (!strcmp(this_char, "old_way")) {
 649			SET_OPTION(old_way);
 650			continue;
 651		}
 652
 653		if (!strcmp(this_char, "displace_based_on_dirid")) {
 654			SET_OPTION(displace_based_on_dirid);
 655			continue;
 656		}
 657
 658		if (!strcmp(this_char, "preallocmin")) {
 659			REISERFS_SB(s)->s_alloc_options.preallocmin =
 660			    (value
 661			     && *value) ? simple_strtoul(value, &value, 0) : 4;
 662			continue;
 663		}
 664
 665		if (!strcmp(this_char, "preallocsize")) {
 666			REISERFS_SB(s)->s_alloc_options.preallocsize =
 667			    (value
 668			     && *value) ? simple_strtoul(value, &value,
 669							 0) :
 670			    PREALLOCATION_SIZE;
 671			continue;
 672		}
 673
 674		reiserfs_warning(s, "zam-4001", "unknown option - %s",
 675				 this_char);
 676		return 1;
 677	}
 678
 679	reiserfs_info(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
 680	return 0;
 681}
 682
 683static void print_sep(struct seq_file *seq, int *first)
 684{
 685	if (!*first)
 686		seq_puts(seq, ":");
 687	else
 688		*first = 0;
 689}
 690
 691void show_alloc_options(struct seq_file *seq, struct super_block *s)
 692{
 693	int first = 1;
 694
 695	if (SB_ALLOC_OPTS(s) == ((1 << _ALLOC_skip_busy) |
 696		(1 << _ALLOC_dirid_groups) | (1 << _ALLOC_packing_groups)))
 697		return;
 698
 699	seq_puts(seq, ",alloc=");
 700
 701	if (TEST_OPTION(concentrating_formatted_nodes, s)) {
 702		print_sep(seq, &first);
 703		if (REISERFS_SB(s)->s_alloc_options.border != 10) {
 704			seq_printf(seq, "concentrating_formatted_nodes=%d",
 705				100 / REISERFS_SB(s)->s_alloc_options.border);
 706		} else
 707			seq_puts(seq, "concentrating_formatted_nodes");
 708	}
 709	if (TEST_OPTION(displacing_large_files, s)) {
 710		print_sep(seq, &first);
 711		if (REISERFS_SB(s)->s_alloc_options.large_file_size != 16) {
 712			seq_printf(seq, "displacing_large_files=%lu",
 713			    REISERFS_SB(s)->s_alloc_options.large_file_size);
 714		} else
 715			seq_puts(seq, "displacing_large_files");
 716	}
 717	if (TEST_OPTION(displacing_new_packing_localities, s)) {
 718		print_sep(seq, &first);
 719		seq_puts(seq, "displacing_new_packing_localities");
 720	}
 721	if (TEST_OPTION(old_hashed_relocation, s)) {
 722		print_sep(seq, &first);
 723		seq_puts(seq, "old_hashed_relocation");
 724	}
 725	if (TEST_OPTION(new_hashed_relocation, s)) {
 726		print_sep(seq, &first);
 727		seq_puts(seq, "new_hashed_relocation");
 728	}
 729	if (TEST_OPTION(dirid_groups, s)) {
 730		print_sep(seq, &first);
 731		seq_puts(seq, "dirid_groups");
 732	}
 733	if (TEST_OPTION(oid_groups, s)) {
 734		print_sep(seq, &first);
 735		seq_puts(seq, "oid_groups");
 736	}
 737	if (TEST_OPTION(packing_groups, s)) {
 738		print_sep(seq, &first);
 739		seq_puts(seq, "packing_groups");
 740	}
 741	if (TEST_OPTION(hashed_formatted_nodes, s)) {
 742		print_sep(seq, &first);
 743		seq_puts(seq, "hashed_formatted_nodes");
 744	}
 745	if (TEST_OPTION(skip_busy, s)) {
 746		print_sep(seq, &first);
 747		seq_puts(seq, "skip_busy");
 748	}
 749	if (TEST_OPTION(hundredth_slices, s)) {
 750		print_sep(seq, &first);
 751		seq_puts(seq, "hundredth_slices");
 752	}
 753	if (TEST_OPTION(old_way, s)) {
 754		print_sep(seq, &first);
 755		seq_puts(seq, "old_way");
 756	}
 757	if (TEST_OPTION(displace_based_on_dirid, s)) {
 758		print_sep(seq, &first);
 759		seq_puts(seq, "displace_based_on_dirid");
 760	}
 761	if (REISERFS_SB(s)->s_alloc_options.preallocmin != 0) {
 762		print_sep(seq, &first);
 763		seq_printf(seq, "preallocmin=%d",
 764				REISERFS_SB(s)->s_alloc_options.preallocmin);
 765	}
 766	if (REISERFS_SB(s)->s_alloc_options.preallocsize != 17) {
 767		print_sep(seq, &first);
 768		seq_printf(seq, "preallocsize=%d",
 769				REISERFS_SB(s)->s_alloc_options.preallocsize);
 770	}
 771}
 772
 773static inline void new_hashed_relocation(reiserfs_blocknr_hint_t * hint)
 774{
 775	char *hash_in;
 776
 777	if (hint->formatted_node) {
 778		hash_in = (char *)&hint->key.k_dir_id;
 779	} else {
 780		if (!hint->inode) {
 781			/*hint->search_start = hint->beg;*/
 782			hash_in = (char *)&hint->key.k_dir_id;
 783		} else
 784		    if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 785			hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
 786		else
 787			hash_in =
 788			    (char *)(&INODE_PKEY(hint->inode)->k_objectid);
 789	}
 790
 791	hint->search_start =
 792	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
 793}
 794
 795/*
 796 * Relocation based on dirid, hashing them into a given bitmap block
 797 * files. Formatted nodes are unaffected, a separate policy covers them
 798 */
 799static void dirid_groups(reiserfs_blocknr_hint_t * hint)
 800{
 801	unsigned long hash;
 802	__u32 dirid = 0;
 803	int bm = 0;
 804	struct super_block *sb = hint->th->t_super;
 805
 806	if (hint->inode)
 807		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
 808	else if (hint->formatted_node)
 809		dirid = hint->key.k_dir_id;
 810
 811	if (dirid) {
 812		bm = bmap_hash_id(sb, dirid);
 813		hash = bm * (sb->s_blocksize << 3);
 814		/* give a portion of the block group to metadata */
 815		if (hint->inode)
 816			hash += sb->s_blocksize / 2;
 817		hint->search_start = hash;
 818	}
 819}
 820
 821/*
 822 * Relocation based on oid, hashing them into a given bitmap block
 823 * files. Formatted nodes are unaffected, a separate policy covers them
 824 */
 825static void oid_groups(reiserfs_blocknr_hint_t * hint)
 826{
 827	if (hint->inode) {
 828		unsigned long hash;
 829		__u32 oid;
 830		__u32 dirid;
 831		int bm;
 832
 833		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
 834
 835		/*
 836		 * keep the root dir and it's first set of subdirs close to
 837		 * the start of the disk
 838		 */
 839		if (dirid <= 2)
 840			hash = (hint->inode->i_sb->s_blocksize << 3);
 841		else {
 842			oid = le32_to_cpu(INODE_PKEY(hint->inode)->k_objectid);
 843			bm = bmap_hash_id(hint->inode->i_sb, oid);
 844			hash = bm * (hint->inode->i_sb->s_blocksize << 3);
 845		}
 846		hint->search_start = hash;
 847	}
 848}
 849
 850/*
 851 * returns 1 if it finds an indirect item and gets valid hint info
 852 * from it, otherwise 0
 853 */
 854static int get_left_neighbor(reiserfs_blocknr_hint_t * hint)
 855{
 856	struct treepath *path;
 857	struct buffer_head *bh;
 858	struct item_head *ih;
 859	int pos_in_item;
 860	__le32 *item;
 861	int ret = 0;
 862
 863	/*
 864	 * reiserfs code can call this function w/o pointer to path
 865	 * structure supplied; then we rely on supplied search_start
 866	 */
 867	if (!hint->path)
 868		return 0;
 869
 870	path = hint->path;
 871	bh = get_last_bh(path);
 872	RFALSE(!bh, "green-4002: Illegal path specified to get_left_neighbor");
 873	ih = tp_item_head(path);
 874	pos_in_item = path->pos_in_item;
 875	item = tp_item_body(path);
 876
 877	hint->search_start = bh->b_blocknr;
 878
 879	/*
 880	 * for indirect item: go to left and look for the first non-hole entry
 881	 * in the indirect item
 882	 */
 883	if (!hint->formatted_node && is_indirect_le_ih(ih)) {
 
 
 884		if (pos_in_item == I_UNFM_NUM(ih))
 885			pos_in_item--;
 
 886		while (pos_in_item >= 0) {
 887			int t = get_block_num(item, pos_in_item);
 888			if (t) {
 889				hint->search_start = t;
 890				ret = 1;
 891				break;
 892			}
 893			pos_in_item--;
 894		}
 895	}
 896
 897	/* does result value fit into specified region? */
 898	return ret;
 899}
 900
 901/*
 902 * should be, if formatted node, then try to put on first part of the device
 903 * specified as number of percent with mount option device, else try to put
 904 * on last of device.  This is not to say it is good code to do so,
 905 * but the effect should be measured.
 906 */
 907static inline void set_border_in_hint(struct super_block *s,
 908				      reiserfs_blocknr_hint_t * hint)
 909{
 910	b_blocknr_t border =
 911	    SB_BLOCK_COUNT(s) / REISERFS_SB(s)->s_alloc_options.border;
 912
 913	if (hint->formatted_node)
 914		hint->end = border - 1;
 915	else
 916		hint->beg = border;
 917}
 918
 919static inline void displace_large_file(reiserfs_blocknr_hint_t * hint)
 920{
 921	if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 922		hint->search_start =
 923		    hint->beg +
 924		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_dir_id),
 925			       4) % (hint->end - hint->beg);
 926	else
 927		hint->search_start =
 928		    hint->beg +
 929		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_objectid),
 930			       4) % (hint->end - hint->beg);
 931}
 932
 933static inline void hash_formatted_node(reiserfs_blocknr_hint_t * hint)
 934{
 935	char *hash_in;
 936
 937	if (!hint->inode)
 938		hash_in = (char *)&hint->key.k_dir_id;
 939	else if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 940		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
 941	else
 942		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_objectid);
 943
 944	hint->search_start =
 945	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
 946}
 947
 948static inline int
 949this_blocknr_allocation_would_make_it_a_large_file(reiserfs_blocknr_hint_t *
 950						   hint)
 951{
 952	return hint->block ==
 953	    REISERFS_SB(hint->th->t_super)->s_alloc_options.large_file_size;
 954}
 955
 956#ifdef DISPLACE_NEW_PACKING_LOCALITIES
 957static inline void displace_new_packing_locality(reiserfs_blocknr_hint_t * hint)
 958{
 959	struct in_core_key *key = &hint->key;
 960
 961	hint->th->displace_new_blocks = 0;
 962	hint->search_start =
 963	    hint->beg + keyed_hash((char *)(&key->k_objectid),
 964				   4) % (hint->end - hint->beg);
 965}
 966#endif
 967
 968static inline int old_hashed_relocation(reiserfs_blocknr_hint_t * hint)
 969{
 970	b_blocknr_t border;
 971	u32 hash_in;
 972
 973	if (hint->formatted_node || hint->inode == NULL) {
 974		return 0;
 975	}
 976
 977	hash_in = le32_to_cpu((INODE_PKEY(hint->inode))->k_dir_id);
 978	border =
 979	    hint->beg + (u32) keyed_hash(((char *)(&hash_in)),
 980					 4) % (hint->end - hint->beg - 1);
 981	if (border > hint->search_start)
 982		hint->search_start = border;
 983
 984	return 1;
 985}
 986
 987static inline int old_way(reiserfs_blocknr_hint_t * hint)
 988{
 989	b_blocknr_t border;
 990
 991	if (hint->formatted_node || hint->inode == NULL) {
 992		return 0;
 993	}
 994
 995	border =
 996	    hint->beg +
 997	    le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id) % (hint->end -
 998							      hint->beg);
 999	if (border > hint->search_start)
1000		hint->search_start = border;
1001
1002	return 1;
1003}
1004
1005static inline void hundredth_slices(reiserfs_blocknr_hint_t * hint)
1006{
1007	struct in_core_key *key = &hint->key;
1008	b_blocknr_t slice_start;
1009
1010	slice_start =
1011	    (keyed_hash((char *)(&key->k_dir_id), 4) % 100) * (hint->end / 100);
1012	if (slice_start > hint->search_start
1013	    || slice_start + (hint->end / 100) <= hint->search_start) {
1014		hint->search_start = slice_start;
1015	}
1016}
1017
1018static void determine_search_start(reiserfs_blocknr_hint_t * hint,
1019				   int amount_needed)
1020{
1021	struct super_block *s = hint->th->t_super;
1022	int unfm_hint;
1023
1024	hint->beg = 0;
1025	hint->end = SB_BLOCK_COUNT(s) - 1;
1026
1027	/* This is former border algorithm. Now with tunable border offset */
1028	if (concentrating_formatted_nodes(s))
1029		set_border_in_hint(s, hint);
1030
1031#ifdef DISPLACE_NEW_PACKING_LOCALITIES
1032	/*
1033	 * whenever we create a new directory, we displace it.  At first
1034	 * we will hash for location, later we might look for a moderately
1035	 * empty place for it
1036	 */
1037	if (displacing_new_packing_localities(s)
1038	    && hint->th->displace_new_blocks) {
1039		displace_new_packing_locality(hint);
1040
1041		/*
1042		 * we do not continue determine_search_start,
1043		 * if new packing locality is being displaced
1044		 */
1045		return;
1046	}
1047#endif
1048
1049	/*
1050	 * all persons should feel encouraged to add more special cases
1051	 * here and test them
1052	 */
1053
1054	if (displacing_large_files(s) && !hint->formatted_node
1055	    && this_blocknr_allocation_would_make_it_a_large_file(hint)) {
1056		displace_large_file(hint);
1057		return;
1058	}
1059
1060	/*
1061	 * if none of our special cases is relevant, use the left
1062	 * neighbor in the tree order of the new node we are allocating for
1063	 */
1064	if (hint->formatted_node && TEST_OPTION(hashed_formatted_nodes, s)) {
1065		hash_formatted_node(hint);
1066		return;
1067	}
1068
1069	unfm_hint = get_left_neighbor(hint);
1070
1071	/*
1072	 * Mimic old block allocator behaviour, that is if VFS allowed for
1073	 * preallocation, new blocks are displaced based on directory ID.
1074	 * Also, if suggested search_start is less than last preallocated
1075	 * block, we start searching from it, assuming that HDD dataflow
1076	 * is faster in forward direction
1077	 */
1078	if (TEST_OPTION(old_way, s)) {
1079		if (!hint->formatted_node) {
1080			if (!reiserfs_hashed_relocation(s))
1081				old_way(hint);
1082			else if (!reiserfs_no_unhashed_relocation(s))
1083				old_hashed_relocation(hint);
1084
1085			if (hint->inode
1086			    && hint->search_start <
1087			    REISERFS_I(hint->inode)->i_prealloc_block)
1088				hint->search_start =
1089				    REISERFS_I(hint->inode)->i_prealloc_block;
1090		}
1091		return;
1092	}
1093
1094	/* This is an approach proposed by Hans */
1095	if (TEST_OPTION(hundredth_slices, s)
1096	    && !(displacing_large_files(s) && !hint->formatted_node)) {
1097		hundredth_slices(hint);
1098		return;
1099	}
1100
1101	/* old_hashed_relocation only works on unformatted */
1102	if (!unfm_hint && !hint->formatted_node &&
1103	    TEST_OPTION(old_hashed_relocation, s)) {
1104		old_hashed_relocation(hint);
1105	}
1106
1107	/* new_hashed_relocation works with both formatted/unformatted nodes */
1108	if ((!unfm_hint || hint->formatted_node) &&
1109	    TEST_OPTION(new_hashed_relocation, s)) {
1110		new_hashed_relocation(hint);
1111	}
1112
1113	/* dirid grouping works only on unformatted nodes */
1114	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
1115		dirid_groups(hint);
1116	}
1117#ifdef DISPLACE_NEW_PACKING_LOCALITIES
1118	if (hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
1119		dirid_groups(hint);
1120	}
1121#endif
1122
1123	/* oid grouping works only on unformatted nodes */
1124	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(oid_groups, s)) {
1125		oid_groups(hint);
1126	}
1127	return;
1128}
1129
1130static int determine_prealloc_size(reiserfs_blocknr_hint_t * hint)
1131{
1132	/* make minimum size a mount option and benchmark both ways */
1133	/* we preallocate blocks only for regular files, specific size */
1134	/* benchmark preallocating always and see what happens */
1135
1136	hint->prealloc_size = 0;
1137
1138	if (!hint->formatted_node && hint->preallocate) {
1139		if (S_ISREG(hint->inode->i_mode) && !IS_PRIVATE(hint->inode)
1140		    && hint->inode->i_size >=
1141		    REISERFS_SB(hint->th->t_super)->s_alloc_options.
1142		    preallocmin * hint->inode->i_sb->s_blocksize)
1143			hint->prealloc_size =
1144			    REISERFS_SB(hint->th->t_super)->s_alloc_options.
1145			    preallocsize - 1;
1146	}
1147	return CARRY_ON;
1148}
1149
 
 
1150static inline int allocate_without_wrapping_disk(reiserfs_blocknr_hint_t * hint,
1151						 b_blocknr_t * new_blocknrs,
1152						 b_blocknr_t start,
1153						 b_blocknr_t finish, int min,
1154						 int amount_needed,
1155						 int prealloc_size)
1156{
1157	int rest = amount_needed;
1158	int nr_allocated;
1159
1160	while (rest > 0 && start <= finish) {
1161		nr_allocated = scan_bitmap(hint->th, &start, finish, min,
1162					   rest + prealloc_size,
1163					   !hint->formatted_node, hint->block);
1164
1165		if (nr_allocated == 0)	/* no new blocks allocated, return */
1166			break;
1167
1168		/* fill free_blocknrs array first */
1169		while (rest > 0 && nr_allocated > 0) {
1170			*new_blocknrs++ = start++;
1171			rest--;
1172			nr_allocated--;
1173		}
1174
1175		/* do we have something to fill prealloc. array also ? */
1176		if (nr_allocated > 0) {
1177			/*
1178			 * it means prealloc_size was greater that 0 and
1179			 * we do preallocation
1180			 */
1181			list_add(&REISERFS_I(hint->inode)->i_prealloc_list,
1182				 &SB_JOURNAL(hint->th->t_super)->
1183				 j_prealloc_list);
1184			REISERFS_I(hint->inode)->i_prealloc_block = start;
1185			REISERFS_I(hint->inode)->i_prealloc_count =
1186			    nr_allocated;
1187			break;
1188		}
1189	}
1190
1191	return (amount_needed - rest);
1192}
1193
1194static inline int blocknrs_and_prealloc_arrays_from_search_start
1195    (reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs,
1196     int amount_needed) {
1197	struct super_block *s = hint->th->t_super;
1198	b_blocknr_t start = hint->search_start;
1199	b_blocknr_t finish = SB_BLOCK_COUNT(s) - 1;
1200	int passno = 0;
1201	int nr_allocated = 0;
1202	int depth;
1203
1204	determine_prealloc_size(hint);
1205	if (!hint->formatted_node) {
1206		int quota_ret;
1207#ifdef REISERQUOTA_DEBUG
1208		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1209			       "reiserquota: allocating %d blocks id=%u",
1210			       amount_needed, hint->inode->i_uid);
1211#endif
1212		depth = reiserfs_write_unlock_nested(s);
1213		quota_ret =
1214		    dquot_alloc_block_nodirty(hint->inode, amount_needed);
1215		if (quota_ret) {	/* Quota exceeded? */
1216			reiserfs_write_lock_nested(s, depth);
1217			return QUOTA_EXCEEDED;
1218		}
1219		if (hint->preallocate && hint->prealloc_size) {
1220#ifdef REISERQUOTA_DEBUG
1221			reiserfs_debug(s, REISERFS_DEBUG_CODE,
1222				       "reiserquota: allocating (prealloc) %d blocks id=%u",
1223				       hint->prealloc_size, hint->inode->i_uid);
1224#endif
1225			quota_ret = dquot_prealloc_block_nodirty(hint->inode,
1226							 hint->prealloc_size);
1227			if (quota_ret)
1228				hint->preallocate = hint->prealloc_size = 0;
1229		}
1230		/* for unformatted nodes, force large allocations */
1231		reiserfs_write_lock_nested(s, depth);
1232	}
1233
1234	do {
1235		switch (passno++) {
1236		case 0:	/* Search from hint->search_start to end of disk */
1237			start = hint->search_start;
1238			finish = SB_BLOCK_COUNT(s) - 1;
1239			break;
1240		case 1:	/* Search from hint->beg to hint->search_start */
1241			start = hint->beg;
1242			finish = hint->search_start;
1243			break;
1244		case 2:	/* Last chance: Search from 0 to hint->beg */
1245			start = 0;
1246			finish = hint->beg;
1247			break;
1248		default:
1249			/* We've tried searching everywhere, not enough space */
1250			/* Free the blocks */
1251			if (!hint->formatted_node) {
1252#ifdef REISERQUOTA_DEBUG
1253				reiserfs_debug(s, REISERFS_DEBUG_CODE,
1254					       "reiserquota: freeing (nospace) %d blocks id=%u",
1255					       amount_needed +
1256					       hint->prealloc_size -
1257					       nr_allocated,
1258					       hint->inode->i_uid);
1259#endif
1260				/* Free not allocated blocks */
1261				depth = reiserfs_write_unlock_nested(s);
1262				dquot_free_block_nodirty(hint->inode,
1263					amount_needed + hint->prealloc_size -
1264					nr_allocated);
1265				reiserfs_write_lock_nested(s, depth);
1266			}
1267			while (nr_allocated--)
1268				reiserfs_free_block(hint->th, hint->inode,
1269						    new_blocknrs[nr_allocated],
1270						    !hint->formatted_node);
1271
1272			return NO_DISK_SPACE;
1273		}
1274	} while ((nr_allocated += allocate_without_wrapping_disk(hint,
1275								 new_blocknrs +
1276								 nr_allocated,
1277								 start, finish,
1278								 1,
1279								 amount_needed -
1280								 nr_allocated,
1281								 hint->
1282								 prealloc_size))
1283		 < amount_needed);
1284	if (!hint->formatted_node &&
1285	    amount_needed + hint->prealloc_size >
1286	    nr_allocated + REISERFS_I(hint->inode)->i_prealloc_count) {
1287		/* Some of preallocation blocks were not allocated */
1288#ifdef REISERQUOTA_DEBUG
1289		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1290			       "reiserquota: freeing (failed prealloc) %d blocks id=%u",
1291			       amount_needed + hint->prealloc_size -
1292			       nr_allocated -
1293			       REISERFS_I(hint->inode)->i_prealloc_count,
1294			       hint->inode->i_uid);
1295#endif
1296
1297		depth = reiserfs_write_unlock_nested(s);
1298		dquot_free_block_nodirty(hint->inode, amount_needed +
1299					 hint->prealloc_size - nr_allocated -
1300					 REISERFS_I(hint->inode)->
1301					 i_prealloc_count);
1302		reiserfs_write_lock_nested(s, depth);
1303	}
1304
1305	return CARRY_ON;
1306}
1307
1308/* grab new blocknrs from preallocated list */
1309/* return amount still needed after using them */
1310static int use_preallocated_list_if_available(reiserfs_blocknr_hint_t * hint,
1311					      b_blocknr_t * new_blocknrs,
1312					      int amount_needed)
1313{
1314	struct inode *inode = hint->inode;
1315
1316	if (REISERFS_I(inode)->i_prealloc_count > 0) {
1317		while (amount_needed) {
1318
1319			*new_blocknrs++ = REISERFS_I(inode)->i_prealloc_block++;
1320			REISERFS_I(inode)->i_prealloc_count--;
1321
1322			amount_needed--;
1323
1324			if (REISERFS_I(inode)->i_prealloc_count <= 0) {
1325				list_del(&REISERFS_I(inode)->i_prealloc_list);
1326				break;
1327			}
1328		}
1329	}
1330	/* return amount still needed after using preallocated blocks */
1331	return amount_needed;
1332}
1333
1334int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *hint,
1335			       b_blocknr_t *new_blocknrs,
1336			       int amount_needed,
1337			       /* Amount of blocks we have already reserved */
1338			       int reserved_by_us)
1339{
1340	int initial_amount_needed = amount_needed;
1341	int ret;
1342	struct super_block *s = hint->th->t_super;
1343
1344	/* Check if there is enough space, taking into account reserved space */
1345	if (SB_FREE_BLOCKS(s) - REISERFS_SB(s)->reserved_blocks <
1346	    amount_needed - reserved_by_us)
1347		return NO_DISK_SPACE;
1348	/* should this be if !hint->inode &&  hint->preallocate? */
1349	/* do you mean hint->formatted_node can be removed ? - Zam */
1350	/*
1351	 * hint->formatted_node cannot be removed because we try to access
1352	 * inode information here, and there is often no inode associated with
1353	 * metadata allocations - green
1354	 */
1355
1356	if (!hint->formatted_node && hint->preallocate) {
1357		amount_needed = use_preallocated_list_if_available
1358		    (hint, new_blocknrs, amount_needed);
1359
1360		/*
1361		 * We have all the block numbers we need from the
1362		 * prealloc list
1363		 */
1364		if (amount_needed == 0)
1365			return CARRY_ON;
1366		new_blocknrs += (initial_amount_needed - amount_needed);
1367	}
1368
1369	/* find search start and save it in hint structure */
1370	determine_search_start(hint, amount_needed);
1371	if (hint->search_start >= SB_BLOCK_COUNT(s))
1372		hint->search_start = SB_BLOCK_COUNT(s) - 1;
1373
1374	/* allocation itself; fill new_blocknrs and preallocation arrays */
1375	ret = blocknrs_and_prealloc_arrays_from_search_start
1376	    (hint, new_blocknrs, amount_needed);
1377
1378	/*
1379	 * We used prealloc. list to fill (partially) new_blocknrs array.
1380	 * If final allocation fails we need to return blocks back to
1381	 * prealloc. list or just free them. -- Zam (I chose second
1382	 * variant)
1383	 */
1384	if (ret != CARRY_ON) {
1385		while (amount_needed++ < initial_amount_needed) {
1386			reiserfs_free_block(hint->th, hint->inode,
1387					    *(--new_blocknrs), 1);
1388		}
1389	}
1390	return ret;
1391}
1392
1393void reiserfs_cache_bitmap_metadata(struct super_block *sb,
1394                                    struct buffer_head *bh,
1395                                    struct reiserfs_bitmap_info *info)
1396{
1397	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
1398
1399	/* The first bit must ALWAYS be 1 */
1400	if (!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data))
1401		reiserfs_error(sb, "reiserfs-2025", "bitmap block %lu is "
1402			       "corrupted: first bit must be 1", bh->b_blocknr);
1403
1404	info->free_count = 0;
1405
1406	while (--cur >= (unsigned long *)bh->b_data) {
1407		/* 0 and ~0 are special, we can optimize for them */
1408		if (*cur == 0)
1409			info->free_count += BITS_PER_LONG;
1410		else if (*cur != ~0L)	/* A mix, investigate */
1411			info->free_count += BITS_PER_LONG - hweight_long(*cur);
1412	}
1413}
1414
1415struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
1416                                               unsigned int bitmap)
1417{
1418	b_blocknr_t block = (sb->s_blocksize << 3) * bitmap;
1419	struct reiserfs_bitmap_info *info = SB_AP_BITMAP(sb) + bitmap;
1420	struct buffer_head *bh;
1421
1422	/*
1423	 * Way old format filesystems had the bitmaps packed up front.
1424	 * I doubt there are any of these left, but just in case...
1425	 */
1426	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
1427			      &REISERFS_SB(sb)->s_properties)))
1428		block = REISERFS_SB(sb)->s_sbh->b_blocknr + 1 + bitmap;
1429	else if (bitmap == 0)
1430		block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
1431
 
1432	bh = sb_bread(sb, block);
 
1433	if (bh == NULL)
1434		reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
1435		                 "reading failed", __func__, block);
1436	else {
1437		if (buffer_locked(bh)) {
1438			int depth;
1439			PROC_INFO_INC(sb, scan_bitmap.wait);
1440			depth = reiserfs_write_unlock_nested(sb);
1441			__wait_on_buffer(bh);
1442			reiserfs_write_lock_nested(sb, depth);
1443		}
1444		BUG_ON(!buffer_uptodate(bh));
1445		BUG_ON(atomic_read(&bh->b_count) == 0);
1446
1447		if (info->free_count == UINT_MAX)
1448			reiserfs_cache_bitmap_metadata(sb, bh, info);
1449	}
1450
1451	return bh;
1452}
1453
1454int reiserfs_init_bitmap_cache(struct super_block *sb)
1455{
1456	struct reiserfs_bitmap_info *bitmap;
1457	unsigned int bmap_nr = reiserfs_bmap_count(sb);
1458
1459	bitmap = vmalloc(array_size(bmap_nr, sizeof(*bitmap)));
 
 
 
1460	if (bitmap == NULL)
1461		return -ENOMEM;
1462
1463	memset(bitmap, 0xff, sizeof(*bitmap) * bmap_nr);
1464
1465	SB_AP_BITMAP(sb) = bitmap;
1466
1467	return 0;
1468}
1469
1470void reiserfs_free_bitmap_cache(struct super_block *sb)
1471{
1472	if (SB_AP_BITMAP(sb)) {
1473		vfree(SB_AP_BITMAP(sb));
1474		SB_AP_BITMAP(sb) = NULL;
1475	}
1476}
v3.1
   1/*
   2 * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
   3 */
   4/* Reiserfs block (de)allocator, bitmap-based. */
   5
   6#include <linux/time.h>
   7#include <linux/reiserfs_fs.h>
   8#include <linux/errno.h>
   9#include <linux/buffer_head.h>
  10#include <linux/kernel.h>
  11#include <linux/pagemap.h>
  12#include <linux/vmalloc.h>
  13#include <linux/reiserfs_fs_sb.h>
  14#include <linux/reiserfs_fs_i.h>
  15#include <linux/quotaops.h>
 
  16
  17#define PREALLOCATION_SIZE 9
  18
  19/* different reiserfs block allocator options */
  20
  21#define SB_ALLOC_OPTS(s) (REISERFS_SB(s)->s_alloc_options.bits)
  22
  23#define  _ALLOC_concentrating_formatted_nodes 0
  24#define  _ALLOC_displacing_large_files 1
  25#define  _ALLOC_displacing_new_packing_localities 2
  26#define  _ALLOC_old_hashed_relocation 3
  27#define  _ALLOC_new_hashed_relocation 4
  28#define  _ALLOC_skip_busy 5
  29#define  _ALLOC_displace_based_on_dirid 6
  30#define  _ALLOC_hashed_formatted_nodes 7
  31#define  _ALLOC_old_way 8
  32#define  _ALLOC_hundredth_slices 9
  33#define  _ALLOC_dirid_groups 10
  34#define  _ALLOC_oid_groups 11
  35#define  _ALLOC_packing_groups 12
  36
  37#define  concentrating_formatted_nodes(s)	test_bit(_ALLOC_concentrating_formatted_nodes, &SB_ALLOC_OPTS(s))
  38#define  displacing_large_files(s)		test_bit(_ALLOC_displacing_large_files, &SB_ALLOC_OPTS(s))
  39#define  displacing_new_packing_localities(s)	test_bit(_ALLOC_displacing_new_packing_localities, &SB_ALLOC_OPTS(s))
  40
  41#define SET_OPTION(optname) \
  42   do { \
  43	reiserfs_info(s, "block allocator option \"%s\" is set", #optname); \
  44	set_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s)); \
  45    } while(0)
  46#define TEST_OPTION(optname, s) \
  47    test_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s))
  48
  49static inline void get_bit_address(struct super_block *s,
  50				   b_blocknr_t block,
  51				   unsigned int *bmap_nr,
  52				   unsigned int *offset)
  53{
  54	/* It is in the bitmap block number equal to the block
  55	 * number divided by the number of bits in a block. */
 
 
  56	*bmap_nr = block >> (s->s_blocksize_bits + 3);
  57	/* Within that bitmap block it is located at bit offset *offset. */
  58	*offset = block & ((s->s_blocksize << 3) - 1);
  59}
  60
  61int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value)
  62{
  63	unsigned int bmap, offset;
  64	unsigned int bmap_count = reiserfs_bmap_count(s);
  65
  66	if (block == 0 || block >= SB_BLOCK_COUNT(s)) {
  67		reiserfs_error(s, "vs-4010",
  68			       "block number is out of range %lu (%u)",
  69			       block, SB_BLOCK_COUNT(s));
  70		return 0;
  71	}
  72
  73	get_bit_address(s, block, &bmap, &offset);
  74
  75	/* Old format filesystem? Unlikely, but the bitmaps are all up front so
  76	 * we need to account for it. */
 
 
  77	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
  78			      &(REISERFS_SB(s)->s_properties)))) {
  79		b_blocknr_t bmap1 = REISERFS_SB(s)->s_sbh->b_blocknr + 1;
  80		if (block >= bmap1 &&
  81		    block <= bmap1 + bmap_count) {
  82			reiserfs_error(s, "vs-4019", "bitmap block %lu(%u) "
  83				       "can't be freed or reused",
  84				       block, bmap_count);
  85			return 0;
  86		}
  87	} else {
  88		if (offset == 0) {
  89			reiserfs_error(s, "vs-4020", "bitmap block %lu(%u) "
  90				       "can't be freed or reused",
  91				       block, bmap_count);
  92			return 0;
  93		}
  94	}
  95
  96	if (bmap >= bmap_count) {
  97		reiserfs_error(s, "vs-4030", "bitmap for requested block "
  98			       "is out of range: block=%lu, bitmap_nr=%u",
  99			       block, bmap);
 100		return 0;
 101	}
 102
 103	if (bit_value == 0 && block == SB_ROOT_BLOCK(s)) {
 104		reiserfs_error(s, "vs-4050", "this is root block (%u), "
 105			       "it must be busy", SB_ROOT_BLOCK(s));
 106		return 0;
 107	}
 108
 109	return 1;
 110}
 111
 112/* searches in journal structures for a given block number (bmap, off). If block
 113   is found in reiserfs journal it suggests next free block candidate to test. */
 
 
 
 114static inline int is_block_in_journal(struct super_block *s, unsigned int bmap,
 115				      int off, int *next)
 116{
 117	b_blocknr_t tmp;
 118
 119	if (reiserfs_in_journal(s, bmap, off, 1, &tmp)) {
 120		if (tmp) {	/* hint supplied */
 121			*next = tmp;
 122			PROC_INFO_INC(s, scan_bitmap.in_journal_hint);
 123		} else {
 124			(*next) = off + 1;	/* inc offset to avoid looping. */
 125			PROC_INFO_INC(s, scan_bitmap.in_journal_nohint);
 126		}
 127		PROC_INFO_INC(s, scan_bitmap.retry);
 128		return 1;
 129	}
 130	return 0;
 131}
 132
 133/* it searches for a window of zero bits with given minimum and maximum lengths in one bitmap
 134 * block; */
 
 
 135static int scan_bitmap_block(struct reiserfs_transaction_handle *th,
 136			     unsigned int bmap_n, int *beg, int boundary,
 137			     int min, int max, int unfm)
 138{
 139	struct super_block *s = th->t_super;
 140	struct reiserfs_bitmap_info *bi = &SB_AP_BITMAP(s)[bmap_n];
 141	struct buffer_head *bh;
 142	int end, next;
 143	int org = *beg;
 144
 145	BUG_ON(!th->t_trans_id);
 146
 147	RFALSE(bmap_n >= reiserfs_bmap_count(s), "Bitmap %u is out of "
 148	       "range (0..%u)", bmap_n, reiserfs_bmap_count(s) - 1);
 149	PROC_INFO_INC(s, scan_bitmap.bmap);
 150/* this is unclear and lacks comments, explain how journal bitmaps
 151   work here for the reader.  Convey a sense of the design here. What
 152   is a window? */
 153/* - I mean `a window of zero bits' as in description of this function - Zam. */
 154
 155	if (!bi) {
 156		reiserfs_error(s, "jdm-4055", "NULL bitmap info pointer "
 157			       "for bitmap %d", bmap_n);
 158		return 0;
 159	}
 160
 161	bh = reiserfs_read_bitmap_block(s, bmap_n);
 162	if (bh == NULL)
 163		return 0;
 164
 165	while (1) {
 166	      cont:
 167		if (bi->free_count < min) {
 168			brelse(bh);
 169			return 0;	// No free blocks in this bitmap
 170		}
 171
 172		/* search for a first zero bit -- beginning of a window */
 173		*beg = reiserfs_find_next_zero_le_bit
 174		    ((unsigned long *)(bh->b_data), boundary, *beg);
 175
 176		if (*beg + min > boundary) {	/* search for a zero bit fails or the rest of bitmap block
 177						 * cannot contain a zero window of minimum size */
 
 
 
 178			brelse(bh);
 179			return 0;
 180		}
 181
 182		if (unfm && is_block_in_journal(s, bmap_n, *beg, beg))
 183			continue;
 184		/* first zero bit found; we check next bits */
 185		for (end = *beg + 1;; end++) {
 186			if (end >= *beg + max || end >= boundary
 187			    || reiserfs_test_le_bit(end, bh->b_data)) {
 188				next = end;
 189				break;
 190			}
 191			/* finding the other end of zero bit window requires looking into journal structures (in
 192			 * case of searching for free blocks for unformatted nodes) */
 
 
 
 
 193			if (unfm && is_block_in_journal(s, bmap_n, end, &next))
 194				break;
 195		}
 196
 197		/* now (*beg) points to beginning of zero bits window,
 198		 * (end) points to one bit after the window end */
 199		if (end - *beg >= min) {	/* it seems we have found window of proper size */
 
 
 
 
 200			int i;
 201			reiserfs_prepare_for_journal(s, bh, 1);
 202			/* try to set all blocks used checking are they still free */
 
 
 
 203			for (i = *beg; i < end; i++) {
 204				/* It seems that we should not check in journal again. */
 205				if (reiserfs_test_and_set_le_bit
 206				    (i, bh->b_data)) {
 207					/* bit was set by another process
 208					 * while we slept in prepare_for_journal() */
 
 
 209					PROC_INFO_INC(s, scan_bitmap.stolen);
 210					if (i >= *beg + min) {	/* we can continue with smaller set of allocated blocks,
 211								 * if length of this set is more or equal to `min' */
 
 
 
 
 
 212						end = i;
 213						break;
 214					}
 215					/* otherwise we clear all bit were set ... */
 
 
 
 
 216					while (--i >= *beg)
 217						reiserfs_clear_le_bit
 218						    (i, bh->b_data);
 219					reiserfs_restore_prepared_buffer(s, bh);
 220					*beg = org;
 221					/* ... and search again in current block from beginning */
 
 
 
 
 222					goto cont;
 223				}
 224			}
 225			bi->free_count -= (end - *beg);
 226			journal_mark_dirty(th, s, bh);
 227			brelse(bh);
 228
 229			/* free block count calculation */
 230			reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
 231						     1);
 232			PUT_SB_FREE_BLOCKS(s, SB_FREE_BLOCKS(s) - (end - *beg));
 233			journal_mark_dirty(th, s, SB_BUFFER_WITH_SB(s));
 234
 235			return end - (*beg);
 236		} else {
 237			*beg = next;
 238		}
 239	}
 240}
 241
 242static int bmap_hash_id(struct super_block *s, u32 id)
 243{
 244	char *hash_in = NULL;
 245	unsigned long hash;
 246	unsigned bm;
 247
 248	if (id <= 2) {
 249		bm = 1;
 250	} else {
 251		hash_in = (char *)(&id);
 252		hash = keyed_hash(hash_in, 4);
 253		bm = hash % reiserfs_bmap_count(s);
 254		if (!bm)
 255			bm = 1;
 256	}
 257	/* this can only be true when SB_BMAP_NR = 1 */
 258	if (bm >= reiserfs_bmap_count(s))
 259		bm = 0;
 260	return bm;
 261}
 262
 263/*
 264 * hashes the id and then returns > 0 if the block group for the
 265 * corresponding hash is full
 266 */
 267static inline int block_group_used(struct super_block *s, u32 id)
 268{
 269	int bm = bmap_hash_id(s, id);
 270	struct reiserfs_bitmap_info *info = &SB_AP_BITMAP(s)[bm];
 271
 272	/* If we don't have cached information on this bitmap block, we're
 
 273	 * going to have to load it later anyway. Loading it here allows us
 274	 * to make a better decision. This favors long-term performance gain
 275	 * with a better on-disk layout vs. a short term gain of skipping the
 276	 * read and potentially having a bad placement. */
 
 277	if (info->free_count == UINT_MAX) {
 278		struct buffer_head *bh = reiserfs_read_bitmap_block(s, bm);
 279		brelse(bh);
 280	}
 281
 282	if (info->free_count > ((s->s_blocksize << 3) * 60 / 100)) {
 283		return 0;
 284	}
 285	return 1;
 286}
 287
 288/*
 289 * the packing is returned in disk byte order
 290 */
 291__le32 reiserfs_choose_packing(struct inode * dir)
 292{
 293	__le32 packing;
 294	if (TEST_OPTION(packing_groups, dir->i_sb)) {
 295		u32 parent_dir = le32_to_cpu(INODE_PKEY(dir)->k_dir_id);
 296		/*
 297		 * some versions of reiserfsck expect packing locality 1 to be
 298		 * special
 299		 */
 300		if (parent_dir == 1 || block_group_used(dir->i_sb, parent_dir))
 301			packing = INODE_PKEY(dir)->k_objectid;
 302		else
 303			packing = INODE_PKEY(dir)->k_dir_id;
 304	} else
 305		packing = INODE_PKEY(dir)->k_objectid;
 306	return packing;
 307}
 308
 309/* Tries to find contiguous zero bit window (given size) in given region of
 310 * bitmap and place new blocks there. Returns number of allocated blocks. */
 
 
 311static int scan_bitmap(struct reiserfs_transaction_handle *th,
 312		       b_blocknr_t * start, b_blocknr_t finish,
 313		       int min, int max, int unfm, sector_t file_block)
 314{
 315	int nr_allocated = 0;
 316	struct super_block *s = th->t_super;
 317	/* find every bm and bmap and bmap_nr in this file, and change them all to bitmap_blocknr
 318	 * - Hans, it is not a block number - Zam. */
 319
 320	unsigned int bm, off;
 321	unsigned int end_bm, end_off;
 322	unsigned int off_max = s->s_blocksize << 3;
 323
 324	BUG_ON(!th->t_trans_id);
 
 325
 326	PROC_INFO_INC(s, scan_bitmap.call);
 327	if (SB_FREE_BLOCKS(s) <= 0)
 328		return 0;	// No point in looking for more free blocks
 329
 330	get_bit_address(s, *start, &bm, &off);
 331	get_bit_address(s, finish, &end_bm, &end_off);
 332	if (bm > reiserfs_bmap_count(s))
 333		return 0;
 334	if (end_bm > reiserfs_bmap_count(s))
 335		end_bm = reiserfs_bmap_count(s);
 336
 337	/* When the bitmap is more than 10% free, anyone can allocate.
 
 338	 * When it's less than 10% free, only files that already use the
 339	 * bitmap are allowed. Once we pass 80% full, this restriction
 340	 * is lifted.
 341	 *
 342	 * We do this so that files that grow later still have space close to
 343	 * their original allocation. This improves locality, and presumably
 344	 * performance as a result.
 345	 *
 346	 * This is only an allocation policy and does not make up for getting a
 347	 * bad hint. Decent hinting must be implemented for this to work well.
 348	 */
 349	if (TEST_OPTION(skip_busy, s)
 350	    && SB_FREE_BLOCKS(s) > SB_BLOCK_COUNT(s) / 20) {
 351		for (; bm < end_bm; bm++, off = 0) {
 352			if ((off && (!unfm || (file_block != 0)))
 353			    || SB_AP_BITMAP(s)[bm].free_count >
 354			    (s->s_blocksize << 3) / 10)
 355				nr_allocated =
 356				    scan_bitmap_block(th, bm, &off, off_max,
 357						      min, max, unfm);
 358			if (nr_allocated)
 359				goto ret;
 360		}
 361		/* we know from above that start is a reasonable number */
 362		get_bit_address(s, *start, &bm, &off);
 363	}
 364
 365	for (; bm < end_bm; bm++, off = 0) {
 366		nr_allocated =
 367		    scan_bitmap_block(th, bm, &off, off_max, min, max, unfm);
 368		if (nr_allocated)
 369			goto ret;
 370	}
 371
 372	nr_allocated =
 373	    scan_bitmap_block(th, bm, &off, end_off + 1, min, max, unfm);
 374
 375      ret:
 376	*start = bm * off_max + off;
 377	return nr_allocated;
 378
 379}
 380
 381static void _reiserfs_free_block(struct reiserfs_transaction_handle *th,
 382				 struct inode *inode, b_blocknr_t block,
 383				 int for_unformatted)
 384{
 385	struct super_block *s = th->t_super;
 386	struct reiserfs_super_block *rs;
 387	struct buffer_head *sbh, *bmbh;
 388	struct reiserfs_bitmap_info *apbi;
 389	unsigned int nr, offset;
 390
 391	BUG_ON(!th->t_trans_id);
 392
 393	PROC_INFO_INC(s, free_block);
 394
 395	rs = SB_DISK_SUPER_BLOCK(s);
 396	sbh = SB_BUFFER_WITH_SB(s);
 397	apbi = SB_AP_BITMAP(s);
 398
 399	get_bit_address(s, block, &nr, &offset);
 400
 401	if (nr >= reiserfs_bmap_count(s)) {
 402		reiserfs_error(s, "vs-4075", "block %lu is out of range",
 403			       block);
 404		return;
 405	}
 406
 407	bmbh = reiserfs_read_bitmap_block(s, nr);
 408	if (!bmbh)
 409		return;
 410
 411	reiserfs_prepare_for_journal(s, bmbh, 1);
 412
 413	/* clear bit for the given block in bit map */
 414	if (!reiserfs_test_and_clear_le_bit(offset, bmbh->b_data)) {
 415		reiserfs_error(s, "vs-4080",
 416			       "block %lu: bit already cleared", block);
 417	}
 418	apbi[nr].free_count++;
 419	journal_mark_dirty(th, s, bmbh);
 420	brelse(bmbh);
 421
 422	reiserfs_prepare_for_journal(s, sbh, 1);
 423	/* update super block */
 424	set_sb_free_blocks(rs, sb_free_blocks(rs) + 1);
 425
 426	journal_mark_dirty(th, s, sbh);
 427	if (for_unformatted)
 
 428		dquot_free_block_nodirty(inode, 1);
 
 
 429}
 430
 431void reiserfs_free_block(struct reiserfs_transaction_handle *th,
 432			 struct inode *inode, b_blocknr_t block,
 433			 int for_unformatted)
 434{
 435	struct super_block *s = th->t_super;
 
 436	BUG_ON(!th->t_trans_id);
 437
 438	RFALSE(!s, "vs-4061: trying to free block on nonexistent device");
 439	if (!is_reusable(s, block, 1))
 440		return;
 441
 442	if (block > sb_block_count(REISERFS_SB(s)->s_rs)) {
 443		reiserfs_error(th->t_super, "bitmap-4072",
 444			       "Trying to free block outside file system "
 445			       "boundaries (%lu > %lu)",
 446			       block, sb_block_count(REISERFS_SB(s)->s_rs));
 447		return;
 448	}
 449	/* mark it before we clear it, just in case */
 450	journal_mark_freed(th, s, block);
 451	_reiserfs_free_block(th, inode, block, for_unformatted);
 452}
 453
 454/* preallocated blocks don't need to be run through journal_mark_freed */
 455static void reiserfs_free_prealloc_block(struct reiserfs_transaction_handle *th,
 456					 struct inode *inode, b_blocknr_t block)
 457{
 458	BUG_ON(!th->t_trans_id);
 459	RFALSE(!th->t_super,
 460	       "vs-4060: trying to free block on nonexistent device");
 461	if (!is_reusable(th->t_super, block, 1))
 462		return;
 463	_reiserfs_free_block(th, inode, block, 1);
 464}
 465
 466static void __discard_prealloc(struct reiserfs_transaction_handle *th,
 467			       struct reiserfs_inode_info *ei)
 468{
 469	unsigned long save = ei->i_prealloc_block;
 470	int dirty = 0;
 471	struct inode *inode = &ei->vfs_inode;
 
 472	BUG_ON(!th->t_trans_id);
 473#ifdef CONFIG_REISERFS_CHECK
 474	if (ei->i_prealloc_count < 0)
 475		reiserfs_error(th->t_super, "zam-4001",
 476			       "inode has negative prealloc blocks count.");
 477#endif
 478	while (ei->i_prealloc_count > 0) {
 479		reiserfs_free_prealloc_block(th, inode, ei->i_prealloc_block);
 480		ei->i_prealloc_block++;
 
 
 
 
 
 
 
 481		ei->i_prealloc_count--;
 
 482		dirty = 1;
 483	}
 484	if (dirty)
 485		reiserfs_update_sd(th, inode);
 486	ei->i_prealloc_block = save;
 487	list_del_init(&(ei->i_prealloc_list));
 488}
 489
 490/* FIXME: It should be inline function */
 491void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
 492			       struct inode *inode)
 493{
 494	struct reiserfs_inode_info *ei = REISERFS_I(inode);
 
 495	BUG_ON(!th->t_trans_id);
 496	if (ei->i_prealloc_count)
 497		__discard_prealloc(th, ei);
 498}
 499
 500void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th)
 501{
 502	struct list_head *plist = &SB_JOURNAL(th->t_super)->j_prealloc_list;
 503
 504	BUG_ON(!th->t_trans_id);
 505
 506	while (!list_empty(plist)) {
 507		struct reiserfs_inode_info *ei;
 508		ei = list_entry(plist->next, struct reiserfs_inode_info,
 509				i_prealloc_list);
 510#ifdef CONFIG_REISERFS_CHECK
 511		if (!ei->i_prealloc_count) {
 512			reiserfs_error(th->t_super, "zam-4001",
 513				       "inode is in prealloc list but has "
 514				       "no preallocated blocks.");
 515		}
 516#endif
 517		__discard_prealloc(th, ei);
 518	}
 519}
 520
 521void reiserfs_init_alloc_options(struct super_block *s)
 522{
 523	set_bit(_ALLOC_skip_busy, &SB_ALLOC_OPTS(s));
 524	set_bit(_ALLOC_dirid_groups, &SB_ALLOC_OPTS(s));
 525	set_bit(_ALLOC_packing_groups, &SB_ALLOC_OPTS(s));
 526}
 527
 528/* block allocator related options are parsed here */
 529int reiserfs_parse_alloc_options(struct super_block *s, char *options)
 530{
 531	char *this_char, *value;
 532
 533	REISERFS_SB(s)->s_alloc_options.bits = 0;	/* clear default settings */
 
 534
 535	while ((this_char = strsep(&options, ":")) != NULL) {
 536		if ((value = strchr(this_char, '=')) != NULL)
 537			*value++ = 0;
 538
 539		if (!strcmp(this_char, "concentrating_formatted_nodes")) {
 540			int temp;
 541			SET_OPTION(concentrating_formatted_nodes);
 542			temp = (value
 543				&& *value) ? simple_strtoul(value, &value,
 544							    0) : 10;
 545			if (temp <= 0 || temp > 100) {
 546				REISERFS_SB(s)->s_alloc_options.border = 10;
 547			} else {
 548				REISERFS_SB(s)->s_alloc_options.border =
 549				    100 / temp;
 550			}
 551			continue;
 552		}
 553		if (!strcmp(this_char, "displacing_large_files")) {
 554			SET_OPTION(displacing_large_files);
 555			REISERFS_SB(s)->s_alloc_options.large_file_size =
 556			    (value
 557			     && *value) ? simple_strtoul(value, &value, 0) : 16;
 558			continue;
 559		}
 560		if (!strcmp(this_char, "displacing_new_packing_localities")) {
 561			SET_OPTION(displacing_new_packing_localities);
 562			continue;
 563		};
 564
 565		if (!strcmp(this_char, "old_hashed_relocation")) {
 566			SET_OPTION(old_hashed_relocation);
 567			continue;
 568		}
 569
 570		if (!strcmp(this_char, "new_hashed_relocation")) {
 571			SET_OPTION(new_hashed_relocation);
 572			continue;
 573		}
 574
 575		if (!strcmp(this_char, "dirid_groups")) {
 576			SET_OPTION(dirid_groups);
 577			continue;
 578		}
 579		if (!strcmp(this_char, "oid_groups")) {
 580			SET_OPTION(oid_groups);
 581			continue;
 582		}
 583		if (!strcmp(this_char, "packing_groups")) {
 584			SET_OPTION(packing_groups);
 585			continue;
 586		}
 587		if (!strcmp(this_char, "hashed_formatted_nodes")) {
 588			SET_OPTION(hashed_formatted_nodes);
 589			continue;
 590		}
 591
 592		if (!strcmp(this_char, "skip_busy")) {
 593			SET_OPTION(skip_busy);
 594			continue;
 595		}
 596
 597		if (!strcmp(this_char, "hundredth_slices")) {
 598			SET_OPTION(hundredth_slices);
 599			continue;
 600		}
 601
 602		if (!strcmp(this_char, "old_way")) {
 603			SET_OPTION(old_way);
 604			continue;
 605		}
 606
 607		if (!strcmp(this_char, "displace_based_on_dirid")) {
 608			SET_OPTION(displace_based_on_dirid);
 609			continue;
 610		}
 611
 612		if (!strcmp(this_char, "preallocmin")) {
 613			REISERFS_SB(s)->s_alloc_options.preallocmin =
 614			    (value
 615			     && *value) ? simple_strtoul(value, &value, 0) : 4;
 616			continue;
 617		}
 618
 619		if (!strcmp(this_char, "preallocsize")) {
 620			REISERFS_SB(s)->s_alloc_options.preallocsize =
 621			    (value
 622			     && *value) ? simple_strtoul(value, &value,
 623							 0) :
 624			    PREALLOCATION_SIZE;
 625			continue;
 626		}
 627
 628		reiserfs_warning(s, "zam-4001", "unknown option - %s",
 629				 this_char);
 630		return 1;
 631	}
 632
 633	reiserfs_info(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
 634	return 0;
 635}
 636
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 637static inline void new_hashed_relocation(reiserfs_blocknr_hint_t * hint)
 638{
 639	char *hash_in;
 
 640	if (hint->formatted_node) {
 641		hash_in = (char *)&hint->key.k_dir_id;
 642	} else {
 643		if (!hint->inode) {
 644			//hint->search_start = hint->beg;
 645			hash_in = (char *)&hint->key.k_dir_id;
 646		} else
 647		    if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 648			hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
 649		else
 650			hash_in =
 651			    (char *)(&INODE_PKEY(hint->inode)->k_objectid);
 652	}
 653
 654	hint->search_start =
 655	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
 656}
 657
 658/*
 659 * Relocation based on dirid, hashing them into a given bitmap block
 660 * files. Formatted nodes are unaffected, a separate policy covers them
 661 */
 662static void dirid_groups(reiserfs_blocknr_hint_t * hint)
 663{
 664	unsigned long hash;
 665	__u32 dirid = 0;
 666	int bm = 0;
 667	struct super_block *sb = hint->th->t_super;
 
 668	if (hint->inode)
 669		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
 670	else if (hint->formatted_node)
 671		dirid = hint->key.k_dir_id;
 672
 673	if (dirid) {
 674		bm = bmap_hash_id(sb, dirid);
 675		hash = bm * (sb->s_blocksize << 3);
 676		/* give a portion of the block group to metadata */
 677		if (hint->inode)
 678			hash += sb->s_blocksize / 2;
 679		hint->search_start = hash;
 680	}
 681}
 682
 683/*
 684 * Relocation based on oid, hashing them into a given bitmap block
 685 * files. Formatted nodes are unaffected, a separate policy covers them
 686 */
 687static void oid_groups(reiserfs_blocknr_hint_t * hint)
 688{
 689	if (hint->inode) {
 690		unsigned long hash;
 691		__u32 oid;
 692		__u32 dirid;
 693		int bm;
 694
 695		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
 696
 697		/* keep the root dir and it's first set of subdirs close to
 
 698		 * the start of the disk
 699		 */
 700		if (dirid <= 2)
 701			hash = (hint->inode->i_sb->s_blocksize << 3);
 702		else {
 703			oid = le32_to_cpu(INODE_PKEY(hint->inode)->k_objectid);
 704			bm = bmap_hash_id(hint->inode->i_sb, oid);
 705			hash = bm * (hint->inode->i_sb->s_blocksize << 3);
 706		}
 707		hint->search_start = hash;
 708	}
 709}
 710
 711/* returns 1 if it finds an indirect item and gets valid hint info
 
 712 * from it, otherwise 0
 713 */
 714static int get_left_neighbor(reiserfs_blocknr_hint_t * hint)
 715{
 716	struct treepath *path;
 717	struct buffer_head *bh;
 718	struct item_head *ih;
 719	int pos_in_item;
 720	__le32 *item;
 721	int ret = 0;
 722
 723	if (!hint->path)	/* reiserfs code can call this function w/o pointer to path
 724				 * structure supplied; then we rely on supplied search_start */
 
 
 
 725		return 0;
 726
 727	path = hint->path;
 728	bh = get_last_bh(path);
 729	RFALSE(!bh, "green-4002: Illegal path specified to get_left_neighbor");
 730	ih = get_ih(path);
 731	pos_in_item = path->pos_in_item;
 732	item = get_item(path);
 733
 734	hint->search_start = bh->b_blocknr;
 735
 
 
 
 
 736	if (!hint->formatted_node && is_indirect_le_ih(ih)) {
 737		/* for indirect item: go to left and look for the first non-hole entry
 738		   in the indirect item */
 739		if (pos_in_item == I_UNFM_NUM(ih))
 740			pos_in_item--;
 741//          pos_in_item = I_UNFM_NUM (ih) - 1;
 742		while (pos_in_item >= 0) {
 743			int t = get_block_num(item, pos_in_item);
 744			if (t) {
 745				hint->search_start = t;
 746				ret = 1;
 747				break;
 748			}
 749			pos_in_item--;
 750		}
 751	}
 752
 753	/* does result value fit into specified region? */
 754	return ret;
 755}
 756
 757/* should be, if formatted node, then try to put on first part of the device
 758   specified as number of percent with mount option device, else try to put
 759   on last of device.  This is not to say it is good code to do so,
 760   but the effect should be measured.  */
 
 
 761static inline void set_border_in_hint(struct super_block *s,
 762				      reiserfs_blocknr_hint_t * hint)
 763{
 764	b_blocknr_t border =
 765	    SB_BLOCK_COUNT(s) / REISERFS_SB(s)->s_alloc_options.border;
 766
 767	if (hint->formatted_node)
 768		hint->end = border - 1;
 769	else
 770		hint->beg = border;
 771}
 772
 773static inline void displace_large_file(reiserfs_blocknr_hint_t * hint)
 774{
 775	if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 776		hint->search_start =
 777		    hint->beg +
 778		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_dir_id),
 779			       4) % (hint->end - hint->beg);
 780	else
 781		hint->search_start =
 782		    hint->beg +
 783		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_objectid),
 784			       4) % (hint->end - hint->beg);
 785}
 786
 787static inline void hash_formatted_node(reiserfs_blocknr_hint_t * hint)
 788{
 789	char *hash_in;
 790
 791	if (!hint->inode)
 792		hash_in = (char *)&hint->key.k_dir_id;
 793	else if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
 794		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
 795	else
 796		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_objectid);
 797
 798	hint->search_start =
 799	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
 800}
 801
 802static inline int
 803this_blocknr_allocation_would_make_it_a_large_file(reiserfs_blocknr_hint_t *
 804						   hint)
 805{
 806	return hint->block ==
 807	    REISERFS_SB(hint->th->t_super)->s_alloc_options.large_file_size;
 808}
 809
 810#ifdef DISPLACE_NEW_PACKING_LOCALITIES
 811static inline void displace_new_packing_locality(reiserfs_blocknr_hint_t * hint)
 812{
 813	struct in_core_key *key = &hint->key;
 814
 815	hint->th->displace_new_blocks = 0;
 816	hint->search_start =
 817	    hint->beg + keyed_hash((char *)(&key->k_objectid),
 818				   4) % (hint->end - hint->beg);
 819}
 820#endif
 821
 822static inline int old_hashed_relocation(reiserfs_blocknr_hint_t * hint)
 823{
 824	b_blocknr_t border;
 825	u32 hash_in;
 826
 827	if (hint->formatted_node || hint->inode == NULL) {
 828		return 0;
 829	}
 830
 831	hash_in = le32_to_cpu((INODE_PKEY(hint->inode))->k_dir_id);
 832	border =
 833	    hint->beg + (u32) keyed_hash(((char *)(&hash_in)),
 834					 4) % (hint->end - hint->beg - 1);
 835	if (border > hint->search_start)
 836		hint->search_start = border;
 837
 838	return 1;
 839}
 840
 841static inline int old_way(reiserfs_blocknr_hint_t * hint)
 842{
 843	b_blocknr_t border;
 844
 845	if (hint->formatted_node || hint->inode == NULL) {
 846		return 0;
 847	}
 848
 849	border =
 850	    hint->beg +
 851	    le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id) % (hint->end -
 852							      hint->beg);
 853	if (border > hint->search_start)
 854		hint->search_start = border;
 855
 856	return 1;
 857}
 858
 859static inline void hundredth_slices(reiserfs_blocknr_hint_t * hint)
 860{
 861	struct in_core_key *key = &hint->key;
 862	b_blocknr_t slice_start;
 863
 864	slice_start =
 865	    (keyed_hash((char *)(&key->k_dir_id), 4) % 100) * (hint->end / 100);
 866	if (slice_start > hint->search_start
 867	    || slice_start + (hint->end / 100) <= hint->search_start) {
 868		hint->search_start = slice_start;
 869	}
 870}
 871
 872static void determine_search_start(reiserfs_blocknr_hint_t * hint,
 873				   int amount_needed)
 874{
 875	struct super_block *s = hint->th->t_super;
 876	int unfm_hint;
 877
 878	hint->beg = 0;
 879	hint->end = SB_BLOCK_COUNT(s) - 1;
 880
 881	/* This is former border algorithm. Now with tunable border offset */
 882	if (concentrating_formatted_nodes(s))
 883		set_border_in_hint(s, hint);
 884
 885#ifdef DISPLACE_NEW_PACKING_LOCALITIES
 886	/* whenever we create a new directory, we displace it.  At first we will
 887	   hash for location, later we might look for a moderately empty place for
 888	   it */
 
 
 889	if (displacing_new_packing_localities(s)
 890	    && hint->th->displace_new_blocks) {
 891		displace_new_packing_locality(hint);
 892
 893		/* we do not continue determine_search_start,
 894		 * if new packing locality is being displaced */
 
 
 895		return;
 896	}
 897#endif
 898
 899	/* all persons should feel encouraged to add more special cases here and
 900	 * test them */
 
 
 901
 902	if (displacing_large_files(s) && !hint->formatted_node
 903	    && this_blocknr_allocation_would_make_it_a_large_file(hint)) {
 904		displace_large_file(hint);
 905		return;
 906	}
 907
 908	/* if none of our special cases is relevant, use the left neighbor in the
 909	   tree order of the new node we are allocating for */
 
 
 910	if (hint->formatted_node && TEST_OPTION(hashed_formatted_nodes, s)) {
 911		hash_formatted_node(hint);
 912		return;
 913	}
 914
 915	unfm_hint = get_left_neighbor(hint);
 916
 917	/* Mimic old block allocator behaviour, that is if VFS allowed for preallocation,
 918	   new blocks are displaced based on directory ID. Also, if suggested search_start
 919	   is less than last preallocated block, we start searching from it, assuming that
 920	   HDD dataflow is faster in forward direction */
 
 
 
 921	if (TEST_OPTION(old_way, s)) {
 922		if (!hint->formatted_node) {
 923			if (!reiserfs_hashed_relocation(s))
 924				old_way(hint);
 925			else if (!reiserfs_no_unhashed_relocation(s))
 926				old_hashed_relocation(hint);
 927
 928			if (hint->inode
 929			    && hint->search_start <
 930			    REISERFS_I(hint->inode)->i_prealloc_block)
 931				hint->search_start =
 932				    REISERFS_I(hint->inode)->i_prealloc_block;
 933		}
 934		return;
 935	}
 936
 937	/* This is an approach proposed by Hans */
 938	if (TEST_OPTION(hundredth_slices, s)
 939	    && !(displacing_large_files(s) && !hint->formatted_node)) {
 940		hundredth_slices(hint);
 941		return;
 942	}
 943
 944	/* old_hashed_relocation only works on unformatted */
 945	if (!unfm_hint && !hint->formatted_node &&
 946	    TEST_OPTION(old_hashed_relocation, s)) {
 947		old_hashed_relocation(hint);
 948	}
 
 949	/* new_hashed_relocation works with both formatted/unformatted nodes */
 950	if ((!unfm_hint || hint->formatted_node) &&
 951	    TEST_OPTION(new_hashed_relocation, s)) {
 952		new_hashed_relocation(hint);
 953	}
 
 954	/* dirid grouping works only on unformatted nodes */
 955	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
 956		dirid_groups(hint);
 957	}
 958#ifdef DISPLACE_NEW_PACKING_LOCALITIES
 959	if (hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
 960		dirid_groups(hint);
 961	}
 962#endif
 963
 964	/* oid grouping works only on unformatted nodes */
 965	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(oid_groups, s)) {
 966		oid_groups(hint);
 967	}
 968	return;
 969}
 970
 971static int determine_prealloc_size(reiserfs_blocknr_hint_t * hint)
 972{
 973	/* make minimum size a mount option and benchmark both ways */
 974	/* we preallocate blocks only for regular files, specific size */
 975	/* benchmark preallocating always and see what happens */
 976
 977	hint->prealloc_size = 0;
 978
 979	if (!hint->formatted_node && hint->preallocate) {
 980		if (S_ISREG(hint->inode->i_mode)
 981		    && hint->inode->i_size >=
 982		    REISERFS_SB(hint->th->t_super)->s_alloc_options.
 983		    preallocmin * hint->inode->i_sb->s_blocksize)
 984			hint->prealloc_size =
 985			    REISERFS_SB(hint->th->t_super)->s_alloc_options.
 986			    preallocsize - 1;
 987	}
 988	return CARRY_ON;
 989}
 990
 991/* XXX I know it could be merged with upper-level function;
 992   but may be result function would be too complex. */
 993static inline int allocate_without_wrapping_disk(reiserfs_blocknr_hint_t * hint,
 994						 b_blocknr_t * new_blocknrs,
 995						 b_blocknr_t start,
 996						 b_blocknr_t finish, int min,
 997						 int amount_needed,
 998						 int prealloc_size)
 999{
1000	int rest = amount_needed;
1001	int nr_allocated;
1002
1003	while (rest > 0 && start <= finish) {
1004		nr_allocated = scan_bitmap(hint->th, &start, finish, min,
1005					   rest + prealloc_size,
1006					   !hint->formatted_node, hint->block);
1007
1008		if (nr_allocated == 0)	/* no new blocks allocated, return */
1009			break;
1010
1011		/* fill free_blocknrs array first */
1012		while (rest > 0 && nr_allocated > 0) {
1013			*new_blocknrs++ = start++;
1014			rest--;
1015			nr_allocated--;
1016		}
1017
1018		/* do we have something to fill prealloc. array also ? */
1019		if (nr_allocated > 0) {
1020			/* it means prealloc_size was greater that 0 and we do preallocation */
 
 
 
1021			list_add(&REISERFS_I(hint->inode)->i_prealloc_list,
1022				 &SB_JOURNAL(hint->th->t_super)->
1023				 j_prealloc_list);
1024			REISERFS_I(hint->inode)->i_prealloc_block = start;
1025			REISERFS_I(hint->inode)->i_prealloc_count =
1026			    nr_allocated;
1027			break;
1028		}
1029	}
1030
1031	return (amount_needed - rest);
1032}
1033
1034static inline int blocknrs_and_prealloc_arrays_from_search_start
1035    (reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs,
1036     int amount_needed) {
1037	struct super_block *s = hint->th->t_super;
1038	b_blocknr_t start = hint->search_start;
1039	b_blocknr_t finish = SB_BLOCK_COUNT(s) - 1;
1040	int passno = 0;
1041	int nr_allocated = 0;
 
1042
1043	determine_prealloc_size(hint);
1044	if (!hint->formatted_node) {
1045		int quota_ret;
1046#ifdef REISERQUOTA_DEBUG
1047		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1048			       "reiserquota: allocating %d blocks id=%u",
1049			       amount_needed, hint->inode->i_uid);
1050#endif
 
1051		quota_ret =
1052		    dquot_alloc_block_nodirty(hint->inode, amount_needed);
1053		if (quota_ret)	/* Quota exceeded? */
 
1054			return QUOTA_EXCEEDED;
 
1055		if (hint->preallocate && hint->prealloc_size) {
1056#ifdef REISERQUOTA_DEBUG
1057			reiserfs_debug(s, REISERFS_DEBUG_CODE,
1058				       "reiserquota: allocating (prealloc) %d blocks id=%u",
1059				       hint->prealloc_size, hint->inode->i_uid);
1060#endif
1061			quota_ret = dquot_prealloc_block_nodirty(hint->inode,
1062							 hint->prealloc_size);
1063			if (quota_ret)
1064				hint->preallocate = hint->prealloc_size = 0;
1065		}
1066		/* for unformatted nodes, force large allocations */
 
1067	}
1068
1069	do {
1070		switch (passno++) {
1071		case 0:	/* Search from hint->search_start to end of disk */
1072			start = hint->search_start;
1073			finish = SB_BLOCK_COUNT(s) - 1;
1074			break;
1075		case 1:	/* Search from hint->beg to hint->search_start */
1076			start = hint->beg;
1077			finish = hint->search_start;
1078			break;
1079		case 2:	/* Last chance: Search from 0 to hint->beg */
1080			start = 0;
1081			finish = hint->beg;
1082			break;
1083		default:	/* We've tried searching everywhere, not enough space */
 
1084			/* Free the blocks */
1085			if (!hint->formatted_node) {
1086#ifdef REISERQUOTA_DEBUG
1087				reiserfs_debug(s, REISERFS_DEBUG_CODE,
1088					       "reiserquota: freeing (nospace) %d blocks id=%u",
1089					       amount_needed +
1090					       hint->prealloc_size -
1091					       nr_allocated,
1092					       hint->inode->i_uid);
1093#endif
1094				/* Free not allocated blocks */
 
1095				dquot_free_block_nodirty(hint->inode,
1096					amount_needed + hint->prealloc_size -
1097					nr_allocated);
 
1098			}
1099			while (nr_allocated--)
1100				reiserfs_free_block(hint->th, hint->inode,
1101						    new_blocknrs[nr_allocated],
1102						    !hint->formatted_node);
1103
1104			return NO_DISK_SPACE;
1105		}
1106	} while ((nr_allocated += allocate_without_wrapping_disk(hint,
1107								 new_blocknrs +
1108								 nr_allocated,
1109								 start, finish,
1110								 1,
1111								 amount_needed -
1112								 nr_allocated,
1113								 hint->
1114								 prealloc_size))
1115		 < amount_needed);
1116	if (!hint->formatted_node &&
1117	    amount_needed + hint->prealloc_size >
1118	    nr_allocated + REISERFS_I(hint->inode)->i_prealloc_count) {
1119		/* Some of preallocation blocks were not allocated */
1120#ifdef REISERQUOTA_DEBUG
1121		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1122			       "reiserquota: freeing (failed prealloc) %d blocks id=%u",
1123			       amount_needed + hint->prealloc_size -
1124			       nr_allocated -
1125			       REISERFS_I(hint->inode)->i_prealloc_count,
1126			       hint->inode->i_uid);
1127#endif
 
 
1128		dquot_free_block_nodirty(hint->inode, amount_needed +
1129					 hint->prealloc_size - nr_allocated -
1130					 REISERFS_I(hint->inode)->
1131					 i_prealloc_count);
 
1132	}
1133
1134	return CARRY_ON;
1135}
1136
1137/* grab new blocknrs from preallocated list */
1138/* return amount still needed after using them */
1139static int use_preallocated_list_if_available(reiserfs_blocknr_hint_t * hint,
1140					      b_blocknr_t * new_blocknrs,
1141					      int amount_needed)
1142{
1143	struct inode *inode = hint->inode;
1144
1145	if (REISERFS_I(inode)->i_prealloc_count > 0) {
1146		while (amount_needed) {
1147
1148			*new_blocknrs++ = REISERFS_I(inode)->i_prealloc_block++;
1149			REISERFS_I(inode)->i_prealloc_count--;
1150
1151			amount_needed--;
1152
1153			if (REISERFS_I(inode)->i_prealloc_count <= 0) {
1154				list_del(&REISERFS_I(inode)->i_prealloc_list);
1155				break;
1156			}
1157		}
1158	}
1159	/* return amount still needed after using preallocated blocks */
1160	return amount_needed;
1161}
1162
1163int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs, int amount_needed, int reserved_by_us	/* Amount of blocks we have
1164																	   already reserved */ )
 
 
 
1165{
1166	int initial_amount_needed = amount_needed;
1167	int ret;
1168	struct super_block *s = hint->th->t_super;
1169
1170	/* Check if there is enough space, taking into account reserved space */
1171	if (SB_FREE_BLOCKS(s) - REISERFS_SB(s)->reserved_blocks <
1172	    amount_needed - reserved_by_us)
1173		return NO_DISK_SPACE;
1174	/* should this be if !hint->inode &&  hint->preallocate? */
1175	/* do you mean hint->formatted_node can be removed ? - Zam */
1176	/* hint->formatted_node cannot be removed because we try to access
1177	   inode information here, and there is often no inode assotiated with
1178	   metadata allocations - green */
 
 
1179
1180	if (!hint->formatted_node && hint->preallocate) {
1181		amount_needed = use_preallocated_list_if_available
1182		    (hint, new_blocknrs, amount_needed);
1183		if (amount_needed == 0)	/* all blocknrs we need we got from
1184					   prealloc. list */
 
 
 
 
1185			return CARRY_ON;
1186		new_blocknrs += (initial_amount_needed - amount_needed);
1187	}
1188
1189	/* find search start and save it in hint structure */
1190	determine_search_start(hint, amount_needed);
1191	if (hint->search_start >= SB_BLOCK_COUNT(s))
1192		hint->search_start = SB_BLOCK_COUNT(s) - 1;
1193
1194	/* allocation itself; fill new_blocknrs and preallocation arrays */
1195	ret = blocknrs_and_prealloc_arrays_from_search_start
1196	    (hint, new_blocknrs, amount_needed);
1197
1198	/* we used prealloc. list to fill (partially) new_blocknrs array. If final allocation fails we
1199	 * need to return blocks back to prealloc. list or just free them. -- Zam (I chose second
1200	 * variant) */
1201
 
 
1202	if (ret != CARRY_ON) {
1203		while (amount_needed++ < initial_amount_needed) {
1204			reiserfs_free_block(hint->th, hint->inode,
1205					    *(--new_blocknrs), 1);
1206		}
1207	}
1208	return ret;
1209}
1210
1211void reiserfs_cache_bitmap_metadata(struct super_block *sb,
1212                                    struct buffer_head *bh,
1213                                    struct reiserfs_bitmap_info *info)
1214{
1215	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
1216
1217	/* The first bit must ALWAYS be 1 */
1218	if (!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data))
1219		reiserfs_error(sb, "reiserfs-2025", "bitmap block %lu is "
1220			       "corrupted: first bit must be 1", bh->b_blocknr);
1221
1222	info->free_count = 0;
1223
1224	while (--cur >= (unsigned long *)bh->b_data) {
1225		/* 0 and ~0 are special, we can optimize for them */
1226		if (*cur == 0)
1227			info->free_count += BITS_PER_LONG;
1228		else if (*cur != ~0L)	/* A mix, investigate */
1229			info->free_count += BITS_PER_LONG - hweight_long(*cur);
1230	}
1231}
1232
1233struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
1234                                               unsigned int bitmap)
1235{
1236	b_blocknr_t block = (sb->s_blocksize << 3) * bitmap;
1237	struct reiserfs_bitmap_info *info = SB_AP_BITMAP(sb) + bitmap;
1238	struct buffer_head *bh;
1239
1240	/* Way old format filesystems had the bitmaps packed up front.
1241	 * I doubt there are any of these left, but just in case... */
 
 
1242	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
1243	                      &(REISERFS_SB(sb)->s_properties))))
1244		block = REISERFS_SB(sb)->s_sbh->b_blocknr + 1 + bitmap;
1245	else if (bitmap == 0)
1246		block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
1247
1248	reiserfs_write_unlock(sb);
1249	bh = sb_bread(sb, block);
1250	reiserfs_write_lock(sb);
1251	if (bh == NULL)
1252		reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
1253		                 "reading failed", __func__, block);
1254	else {
1255		if (buffer_locked(bh)) {
 
1256			PROC_INFO_INC(sb, scan_bitmap.wait);
1257			reiserfs_write_unlock(sb);
1258			__wait_on_buffer(bh);
1259			reiserfs_write_lock(sb);
1260		}
1261		BUG_ON(!buffer_uptodate(bh));
1262		BUG_ON(atomic_read(&bh->b_count) == 0);
1263
1264		if (info->free_count == UINT_MAX)
1265			reiserfs_cache_bitmap_metadata(sb, bh, info);
1266	}
1267
1268	return bh;
1269}
1270
1271int reiserfs_init_bitmap_cache(struct super_block *sb)
1272{
1273	struct reiserfs_bitmap_info *bitmap;
1274	unsigned int bmap_nr = reiserfs_bmap_count(sb);
1275
1276	/* Avoid lock recursion in fault case */
1277	reiserfs_write_unlock(sb);
1278	bitmap = vmalloc(sizeof(*bitmap) * bmap_nr);
1279	reiserfs_write_lock(sb);
1280	if (bitmap == NULL)
1281		return -ENOMEM;
1282
1283	memset(bitmap, 0xff, sizeof(*bitmap) * bmap_nr);
1284
1285	SB_AP_BITMAP(sb) = bitmap;
1286
1287	return 0;
1288}
1289
1290void reiserfs_free_bitmap_cache(struct super_block *sb)
1291{
1292	if (SB_AP_BITMAP(sb)) {
1293		vfree(SB_AP_BITMAP(sb));
1294		SB_AP_BITMAP(sb) = NULL;
1295	}
1296}