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