119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * ea_refcount.c
33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2001 Theodore Ts'o.  This file may be
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * redistributed under the terms of the GNU Public License.
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h>
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef TEST_PROGRAM
153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#undef ENABLE_NLS
163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2fsck.h"
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * The strategy we use for keeping track of EA refcounts is as
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * follows.  We keep a sorted array of first EA blocks and its
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * reference counts.  Once the refcount has dropped to zero, it is
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * removed from the array to save memory space.  Once the EA block is
243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * checked, its bit is set in the block_ea_map bitmap.
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct ea_refcount_el {
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t	ea_blk;
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	ea_count;
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct ea_refcount {
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t		count;
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t		size;
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t		cursor;
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*list;
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ea_refcount_free(ext2_refcount_t refcount)
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!refcount)
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return;
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (refcount->list)
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		ext2fs_free_mem(&refcount->list);
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2fs_free_mem(&refcount);
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_create(int size, ext2_refcount_t *ret)
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_refcount_t	refcount;
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval;
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	size_t		bytes;
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_get_mem(sizeof(struct ea_refcount), &refcount);
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval)
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return retval;
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	memset(refcount, 0, sizeof(struct ea_refcount));
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!size)
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		size = 500;
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->size = size;
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	bytes = (size_t) (size * sizeof(struct ea_refcount_el));
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("Refcount allocated %d entries, %d bytes.\n",
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       refcount->size, bytes);
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	retval = ext2fs_get_mem(bytes, &refcount->list);
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (retval)
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		goto errout;
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	memset(refcount->list, 0, bytes);
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->count = 0;
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->cursor = 0;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	*ret = refcount;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout:
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ea_refcount_free(refcount);
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return(retval);
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * collapse_refcount() --- go through the refcount array, and get rid
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * of any count == zero entries
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void refcount_collapse(ext2_refcount_t refcount)
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	unsigned int	i, j;
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*list;
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	list = refcount->list;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (i = 0, j = 0; i < refcount->count; i++) {
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (list[i].ea_count) {
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (i != j)
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				list[j] = list[i];
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			j++;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined(DEBUG) || defined(TEST_PROGRAM)
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("Refcount_collapse: size was %d, now %d\n",
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	       refcount->count, j);
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->count = j;
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * insert_refcount_el() --- Insert a new entry into the sorted list at a
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 	specified position.
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ea_refcount_el *insert_refcount_el(ext2_refcount_t refcount,
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project						 blk_t blk, int pos)
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el 	*el;
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t		retval;
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t			new_size = 0;
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int			num;
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (refcount->count >= refcount->size) {
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		new_size = refcount->size + 100;
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		printf("Reallocating refcount %d entries...\n", new_size);
1243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		retval = ext2fs_resize_mem((size_t) refcount->size *
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					   sizeof(struct ea_refcount_el),
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					   (size_t) new_size *
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					   sizeof(struct ea_refcount_el),
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					   &refcount->list);
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (retval)
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return 0;
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		refcount->size = new_size;
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	num = (int) refcount->count - pos;
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (num < 0)
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 0;	/* should never happen */
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (num) {
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		memmove(&refcount->list[pos+1], &refcount->list[pos],
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			sizeof(struct ea_refcount_el) * num);
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->count++;
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el = &refcount->list[pos];
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el->ea_count = 0;
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el->ea_blk = blk;
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return el;
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * get_refcount_el() --- given an block number, try to find refcount
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 	information in the sorted list.  If the create flag is set,
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 	and we can't find an entry, create one in the sorted list.
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount,
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					      blk_t blk, int create)
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	float	range;
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	low, high, mid;
15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t	lowval, highval;
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!refcount || !refcount->list)
16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 0;
16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectretry:
16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	low = 0;
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	high = (int) refcount->count-1;
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (create && ((refcount->count == 0) ||
16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       (blk > refcount->list[high].ea_blk))) {
16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (refcount->count >= refcount->size)
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			refcount_collapse(refcount);
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return insert_refcount_el(refcount, blk,
17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					  (unsigned) refcount->count);
17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (refcount->count == 0)
17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 0;
1763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (refcount->cursor >= refcount->count)
17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		refcount->cursor = 0;
17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (blk == refcount->list[refcount->cursor].ea_blk)
18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return &refcount->list[refcount->cursor++];
18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG
18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	printf("Non-cursor get_refcount_el: %u\n", blk);
18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (low <= high) {
18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0
18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		mid = (low+high)/2;
18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (low == high)
18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			mid = low;
19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		else {
19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			/* Interpolate for efficiency */
19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			lowval = refcount->list[low].ea_blk;
19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			highval = refcount->list[high].ea_blk;
19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (blk < lowval)
19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				range = 0;
19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			else if (blk > highval)
19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				range = 1;
1993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			else
20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				range = ((float) (blk - lowval)) /
20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					(highval - lowval);
20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			mid = low + ((int) (range * (high-low)));
20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (blk == refcount->list[mid].ea_blk) {
20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			refcount->cursor = mid+1;
20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return &refcount->list[mid];
20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (blk < refcount->list[mid].ea_blk)
21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			high = mid-1;
21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		else
21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			low = mid+1;
21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/*
21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 * If we need to create a new entry, it should be right at
21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 * low (where high will be left at low-1).
21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 */
21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (create) {
21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (refcount->count >= refcount->size) {
22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			refcount_collapse(refcount);
22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (refcount->count < refcount->size)
22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				goto retry;
22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return insert_refcount_el(refcount, blk, low);
22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_fetch(ext2_refcount_t refcount, blk_t blk,
23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				int *ret)
23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*el;
2333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el = get_refcount_el(refcount, blk, 0);
23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!el) {
23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		*ret = 0;
23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 0;
23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	*ret = el->ea_count;
24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_increment(ext2_refcount_t refcount, blk_t blk, int *ret)
24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*el;
24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el = get_refcount_el(refcount, blk, 1);
24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!el)
24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return EXT2_ET_NO_MEMORY;
25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el->ea_count++;
25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ret)
25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		*ret = el->ea_count;
25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_decrement(ext2_refcount_t refcount, blk_t blk, int *ret)
25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*el;
26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el = get_refcount_el(refcount, blk, 0);
26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!el || el->ea_count == 0)
26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return EXT2_ET_INVALID_ARGUMENT;
26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el->ea_count--;
26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (ret)
26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		*ret = el->ea_count;
26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_store(ext2_refcount_t refcount, blk_t blk, int count)
27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*el;
27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	/*
27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 * Get the refcount element
27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	 */
27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el = get_refcount_el(refcount, blk, count ? 1 : 0);
28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!el)
28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return count ? EXT2_ET_NO_MEMORY : 0;
28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	el->ea_count = count;
28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return 0;
28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t ext2fs_get_refcount_size(ext2_refcount_t refcount)
28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (!refcount)
28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return 0;
29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return refcount->size;
29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ea_refcount_intr_begin(ext2_refcount_t refcount)
29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	refcount->cursor = 0;
29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t ea_refcount_intr_next(ext2_refcount_t refcount,
30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				int *ret)
30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct ea_refcount_el	*list;
3043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (1) {
30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (refcount->cursor >= refcount->count)
30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return 0;
30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		list = refcount->list;
30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (list[refcount->cursor].ea_count) {
31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (ret)
31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				*ret = list[refcount->cursor].ea_count;
31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			return list[refcount->cursor++].ea_blk;
31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		refcount->cursor++;
31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef TEST_PROGRAM
32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_validate(ext2_refcount_t refcount, FILE *out)
32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	ret = 0;
32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		i;
32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	const char *bad = "bad refcount";
3263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (refcount->count > refcount->size) {
32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		fprintf(out, "%s: count > size\n", bad);
32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		return EXT2_ET_INVALID_ARGUMENT;
33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (i=1; i < refcount->count; i++) {
33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (refcount->list[i-1].ea_blk >= refcount->list[i].ea_blk) {
33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			fprintf(out, "%s: list[%d].blk=%u, list[%d].blk=%u\n",
33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				bad, i-1, refcount->list[i-1].ea_blk,
33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				i, refcount->list[i].ea_blk);
33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ret = EXT2_ET_INVALID_ARGUMENT;
33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	return ret;
34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_END	0
34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_CREATE	1
34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_FREE	2
34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_STORE	3
34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_INCR	4
34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_DECR	5
34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_FETCH	6
34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_VALIDATE	7
35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_LIST	8
35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_COLLAPSE 9
35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint bcode_program[] = {
35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_CREATE, 5,
35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 3, 3,
35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 4, 4,
35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 1, 1,
35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 8, 8,
35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 2, 2,
36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 4, 0,
36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 2, 0,
36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 6, 6,
36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_VALIDATE,
36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 4, 4,
36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 2, 2,
36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_FETCH, 1,
36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_FETCH, 2,
36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_INCR, 3,
36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_INCR, 3,
37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_DECR, 4,
37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 4, 4,
37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_VALIDATE,
37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 20, 20,
37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 40, 40,
37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 30, 30,
37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_STORE, 10, 10,
37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_DECR, 30,
37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_FETCH, 30,
37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_DECR, 2,
38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_DECR, 2,
38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_COLLAPSE,
38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_LIST,
38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_VALIDATE,
38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_FREE,
38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	BCODE_END
38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv)
38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int	i = 0;
39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	ext2_refcount_t refcount;
39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int		size, arg;
39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	blk_t		blk;
39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	errcode_t	retval;
39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (1) {
39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		switch (bcode_program[i++]) {
39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_END:
39919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			exit(0);
40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_CREATE:
40119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			size = bcode_program[i++];
40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_create(size, &refcount);
40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval) {
40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_create",
40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					retval, "");
40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				exit(1);
40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			} else
40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("Creating refcount with size %d\n",
40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       size);
41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_FREE:
41219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ea_refcount_free(refcount);
41319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			refcount = 0;
41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			printf("Freeing refcount\n");
41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
41619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_STORE:
41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			blk = (blk_t) bcode_program[i++];
41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			arg = bcode_program[i++];
41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_store(refcount, blk, arg);
42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			printf("Storing blk %u with value %d\n", blk, arg);
42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_store", retval, "");
42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
42419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_FETCH:
42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			blk = (blk_t) bcode_program[i++];
42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_fetch(refcount, blk, &arg);
42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_fetch", retval, "");
42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			else
43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("bcode_fetch(%u) returns %d\n",
43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       blk, arg);
43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_INCR:
43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			blk = (blk_t) bcode_program[i++];
43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_increment(refcount, blk,
43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project							   &arg);
43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_increment", retval,
43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					"");
44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			else
44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("bcode_increment(%u) returns %d\n",
44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       blk, arg);
44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_DECR:
44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			blk = (blk_t) bcode_program[i++];
44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_decrement(refcount, blk,
44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project							   &arg);
44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_decrement", retval,
45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					"while decrementing blk %u", blk);
45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			else
45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("bcode_decrement(%u) returns %d\n",
45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       blk, arg);
45419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_VALIDATE:
45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			retval = ea_refcount_validate(refcount, stderr);
45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			if (retval)
45819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				com_err("ea_refcount_validate",
45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					retval, "");
46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			else
46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("Refcount validation OK.\n");
46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
46319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_LIST:
46419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			ea_refcount_intr_begin(refcount);
46519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			while (1) {
4663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt				blk = ea_refcount_intr_next(refcount,
46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project								&arg);
46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				if (!blk)
46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project					break;
47019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				printf("\tblk=%u, count=%d\n", blk,
47119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       arg);
47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			}
47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
47419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		case BCODE_COLLAPSE:
47519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			refcount_collapse(refcount);
47619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			break;
47719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
4783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
483